Procházet zdrojové kódy

feat(flash-delivery): return user note in rider task list

骑手任务列表摘要新增 userNote:本人任务页签(toPickup/delivering/
completed/cancelled)返回订单备注,newTask 待抢单卡片按接单前脱敏
规则保持 null,与详情接口备注可见性一致。同步 App API 文档、024
契约白名单测试及 spec 变更记录。
qmj před 1 týdnem
rodič
revize
186b35db31

+ 4 - 1
docs/flash-delivery-app-api.md

@@ -933,12 +933,15 @@ GET /system/flashDelivery/rider/orders?page=1&size=10&tab=newTask&longitude=121.
   "tipAmount": 5,
   "amount": 92,
   "currency": "TWD",
-  "createTime": "2026-09-01T09:00:00+08:00"
+  "createTime": "2026-09-01T09:00:00+08:00",
+  "userNote": null
 }
 ```
 
 接单前列表可展示完整的取件、送达文字地址(包括详细地址),但不得返回联系人、电话、实际 PIN、精确坐标、用户备注、图片凭证、状态日志、用户 ID、幂等号或计价审计字段。列表中的文字地址不能作为精确坐标使用。
 
+`userNote` 为用户备注:骑手本人任务页签(`toPickup`、`delivering`、`completed`、`cancelled`)返回订单备注,骑手无需进详情即可查看;`newTask` 待抢单卡片按脱敏规则固定为 `null`。
+
 ### 8.2 查询骑手订单详情
 
 ```http

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListView.java

@@ -72,4 +72,6 @@ public class FlashDeliveryRiderOrderListView {
     private Integer pickedUpStopCount;
     /** 任一站已取货即禁止用户自助取消,不能仅按订单主状态判断。 */
     private Boolean canUserCancel;
+    /** 用户备注;仅骑手本人任务返回,待抢单卡片为空。 */
+    private String userNote;
 }

+ 4 - 2
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationService.java

@@ -532,7 +532,7 @@ public class FlashDeliveryApplicationService {
         IPage<FlashDeliveryOrder> orders = orderMapper.selectPage(page(pageNum, pageSize), query);
         FlashDeliveryRiderOrderPageView result = new FlashDeliveryRiderOrderPageView();
         result.setRecords(orders.getRecords().stream()
-                .map(order -> riderOrderListView(order, effectiveLongitude, effectiveLatitude)).toList());
+                .map(order -> riderOrderListView(riderId, order, effectiveLongitude, effectiveLatitude)).toList());
         result.setTotal(orders.getTotal());
         result.setCurrent(orders.getCurrent());
         result.setSize(orders.getSize());
@@ -1101,7 +1101,7 @@ public class FlashDeliveryApplicationService {
     }
 
     /** 订单实体转骑手端任务卡片,可附带骑手到取件点的直线距离。 */
-    private FlashDeliveryRiderOrderListView riderOrderListView(FlashDeliveryOrder order,
+    private FlashDeliveryRiderOrderListView riderOrderListView(Long riderId, FlashDeliveryOrder order,
                                                                  BigDecimal longitude, BigDecimal latitude) {
         FlashDeliveryRiderOrderListView view = new FlashDeliveryRiderOrderListView();
         view.setId(order.getId());
@@ -1138,6 +1138,8 @@ public class FlashDeliveryApplicationService {
         view.setAmount(order.getAmount());
         view.setCurrency(order.getCurrency());
         view.setCreateTime(order.getCreateTime());
+        // 备注仅对中单骑手本人可见;newTask 待抢卡片保持脱敏为空。
+        view.setUserNote(Objects.equals(riderId, order.getRiderId()) ? order.getUserNote() : null);
         return view;
     }
 

+ 1 - 1
ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListViewTest.java

@@ -29,7 +29,7 @@ class FlashDeliveryRiderOrderListViewTest {
                 "pinRequired", "pickupAddress", "pickupDetailAddress", "deliveryAddress",
                 "deliveryDetailAddress", "pickupDistanceMeters", "distanceMeters",
                 "estimatedDurationSeconds", "baseDeliveryFee", "distanceFee", "urgentFee",
-                "tipAmount", "amount", "currency", "paymentStatus", "createTime", "payType", "pickupStopCount", "pickedUpStopCount", "canUserCancel");
+                "tipAmount", "amount", "currency", "paymentStatus", "createTime", "payType", "pickupStopCount", "pickedUpStopCount", "canUserCancel", "userNote");
         org.junit.jupiter.api.Assertions.assertEquals(expected, fields);
     }
 

+ 20 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationServiceTest.java

@@ -381,6 +381,8 @@ class FlashDeliveryApplicationServiceTest {
         assertEquals("OVER_10_TO_15_KG", result.getRecords().get(0).getWeightRange());
         assertTrue(result.getRecords().get(0).getPickupDistanceMeters() > 0);
         assertTrue(result.getRecords().get(0).getPinRequired());
+        // 待抢单卡片继续脱敏用户备注,接单前骑手不可见。
+        assertNull(result.getRecords().get(0).getUserNote());
         ArgumentCaptor<com.baomidou.mybatisplus.core.conditions.query.QueryWrapper> query =
                 ArgumentCaptor.forClass(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper.class);
         verify(fixture.orderMapper).selectPage(any(com.baomidou.mybatisplus.core.metadata.IPage.class), query.capture());
@@ -518,6 +520,24 @@ class FlashDeliveryApplicationServiceTest {
                 any(Wrapper.class));
     }
 
+    @Test
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    void riderOwnTaskListReturnsUserNote() {
+        Fixture fixture = new Fixture();
+        rider(fixture, 8L);
+        FlashDeliveryOrder accepted = order(10L, "ACCEPTED");
+        accepted.setRiderId(8L);
+        Page<FlashDeliveryOrder> source = new Page<>(1, 10, 1);
+        source.setRecords(List.of(accepted));
+        when(fixture.orderMapper.selectPage(any(com.baomidou.mybatisplus.core.metadata.IPage.class),
+                any(Wrapper.class))).thenReturn(source);
+
+        FlashDeliveryRiderOrderPageView result = fixture.service.riderOrders(8L, 1, 10, "toPickup", null, null);
+
+        // 中单骑手在本人任务列表直接看到用户备注,无需进详情。
+        assertEquals("private note", result.getRecords().get(0).getUserNote());
+    }
+
     @Test
     void assignedRiderTabsIgnoreLocationParameters() {
         Fixture fixture = new Fixture();

+ 5 - 1
specs/024-flash-delivery/contracts/api.md

@@ -63,7 +63,7 @@
 
 骑手页签状态映射:`newTask=WAITING_ACCEPTANCE`、`toPickup=ACCEPTED`、`delivering=PICKED_UP`、`completed=DELIVERED+COMPLETED`、`cancelled=CANCELLED`。除 `newTask` 外只返回当前骑手本人任务;闪送没有 `refund` 页签。
 
-骑手列表摘要字段固定为:`id,orderNo,serviceType,deliveryType,vehicleType,status,packageType,quantity,weightRange,specification,deliveryMode,scheduledPickupStartAt,scheduledPickupEndAt,pinRequired,pickupAddress,pickupDetailAddress,deliveryAddress,deliveryDetailAddress,pickupDistanceMeters,distanceMeters,estimatedDurationSeconds,baseDeliveryFee,urgentFee,tipAmount,amount,currency,createTime`。`newTask` 只返回与骑手登记车型一致的待接单任务;骑手查看待接单详情或接单时也会重新校验车型。分页 data 在 `records,total,current,size` 外增加 `nearbyTaskCount,highestOrderAmount`;不返回加急比例、最低加急费或骑手收入字段。
+骑手列表摘要字段固定为:`id,orderNo,serviceType,deliveryType,vehicleType,status,packageType,quantity,weightRange,specification,deliveryMode,scheduledPickupStartAt,scheduledPickupEndAt,pinRequired,pickupAddress,pickupDetailAddress,deliveryAddress,deliveryDetailAddress,pickupDistanceMeters,distanceMeters,estimatedDurationSeconds,baseDeliveryFee,urgentFee,tipAmount,amount,currency,createTime,userNote`。`newTask` 只返回与骑手登记车型一致的待接单任务;骑手查看待接单详情或接单时也会重新校验车型。分页 data 在 `records,total,current,size` 外增加 `nearbyTaskCount,highestOrderAmount`;不返回加急比例、最低加急费或骑手收入字段。
 
 骑手接单前可按原型查看完整取送文字地址,但不返回用户 ID、联系人、电话、实际 PIN、精确经纬度、备注、幂等请求号、履约凭证或日志。抢单成功后才向中单骑手返回完整联系方式、坐标和有权限查看的照片数组。骑手详情在接单前后使用同一个直接 DTO,不返回 `{order,images,logs}` 包装,也不要求 App 判断 `data.order`。
 
@@ -223,3 +223,7 @@
 - 新增错误 `flash.delivery.billing.save.failed`;账单不等于已收款凭证,不提供可提现余额。
 - 旧 `/wallet/getUserBills` 同样透出实体的 `orderSource`,闪送账单不再参与外卖订单关联查询;该接口只返回账单记录,没有改动钱包余额或提现处理。
 
+## 2026-10-10:骑手任务列表返回用户备注
+
+- `GET /system/flashDelivery/rider/orders` 摘要新增 `userNote`:骑手本人任务页签(`toPickup/delivering/completed/cancelled`)返回订单备注,无需进详情;`newTask` 待抢单卡片按接单前脱敏规则固定为 `null`,与详情接口的备注可见性一致。
+