Эх сурвалжийг харах

feat(闪送): 统一列表收件人视角全站开放逐站地址

- 收件人看他人多站单时 stops 不再遮蔽:全部站地址与备注同寄件人口径返回,仅联系人、电话、坐标、凭证、收货码不落卡片
- 卡片主位 deliveryAddress 仍指向本人站点
- FlashDeliveryUserCardStops 随之简化为单一口径
qmj 3 өдөр өмнө
parent
commit
7ae22566c9

+ 1 - 1
docs/flash-delivery-v2-frontend-handoff.md

@@ -66,7 +66,7 @@
 
 ## 订单详情、收件人和进度
 
-- 用户列表:统一订单列表 `GET /system/unifiedOrder/list`(2026-10-15 起旧闪送专属列表 `GET /system/flashDelivery/orders` 已删除);`receiver` 角色条目包括每一个已匹配到系统普通用户的收货站。收件人列表卡片展示自己的收货地址:`deliveryAddress` 已换成本人站点,`stops` 里其余站只留类型/序号/状态。
+- 用户列表:统一订单列表 `GET /system/unifiedOrder/list`(2026-10-15 起旧闪送专属列表 `GET /system/flashDelivery/orders` 已删除);`receiver` 角色条目包括每一个已匹配到系统普通用户的收货站。收件人列表卡片的 `deliveryAddress` 指向本人站点;`stops` 全站文字地址与备注对寄件、收件同口径返回,联系人、电话、坐标不落卡片。
 - 用户详情:`GET /system/flashDelivery/orders/{id}`;按订单号打开消息:`GET /system/flashDelivery/orders/byOrderNo?orderNo=...`。
 - 骑手列表与详情:`GET /system/flashDelivery/rider/orders`、`GET /system/flashDelivery/rider/orders/{id}`,沿用原有 `tab`、分页和可选坐标参数。
 

+ 2 - 8
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryUserCardStops.java

@@ -5,24 +5,18 @@ import com.ruoyi.system.domain.flash.FlashDeliveryOrderStop;
 import org.springframework.beans.BeanUtils;
 
 import java.util.List;
-import java.util.Objects;
 
-/** 用户端订单卡片逐站列表脱敏:寄件人返回全站文字地址;收件人看他人订单仅本站保留地址,其余站只留类型/序号/状态。 */
+/** 用户端订单卡片逐站列表:全部站点返回文字地址与备注,寄件收件同口径;联系人、电话、坐标、凭证与收货码不落卡片。 */
 public final class FlashDeliveryUserCardStops {
     private FlashDeliveryUserCardStops() {}
 
-    public static List<FlashDeliveryStopView> of(List<FlashDeliveryOrderStop> rows, Long viewerId, boolean sender) {
+    public static List<FlashDeliveryStopView> of(List<FlashDeliveryOrderStop> rows) {
         return rows.stream().map(stop -> {
             FlashDeliveryStopView view = new FlashDeliveryStopView();
             BeanUtils.copyProperties(stop, view);
             view.setDeliveryPinCode(null);
-            // 卡片不落联系人、电话、坐标与凭证;收件人视角他人的站连地址与备注也隐藏,与详情口径一致。
             view.setName(null); view.setPhone(null);
             view.setLongitude(null); view.setLatitude(null);
-            if (!sender && !("DELIVERY".equals(stop.getStopType()) && Objects.equals(viewerId, stop.getReceiverUserId()))) {
-                view.setAddress(null); view.setAddressDetail(null);
-                view.setHandoffMethod(null); view.setRemark(null);
-            }
             return view;
         }).toList();
     }

+ 3 - 4
ruoyi-admin/src/main/java/com/ruoyi/app/unifiedorder/UnifiedOrderQueryService.java

@@ -257,10 +257,9 @@ public class UnifiedOrderQueryService {
             item.setDeliveryStopCount(order.getDeliveryStopCount());
             item.setDeliveredStopCount(order.getDeliveredStopCount());
             if (stopRows != null && !stopRows.isEmpty()) {
-                boolean sender = Objects.equals(userId, order.getUserId());
-                item.setStops(FlashDeliveryUserCardStops.of(stopRows, userId, sender));
-                // 收件人看他人多站单:deliveryAddress 换成本人站点,避免暴露他人收货地址。
-                if (!sender) {
+                item.setStops(FlashDeliveryUserCardStops.of(stopRows));
+                // 收件人看他人多站单:卡片主位的 deliveryAddress 指向本人站点,逐站地址在 stops 全量返回。
+                if (!Objects.equals(userId, order.getUserId())) {
                     stopRows.stream().filter(s -> "DELIVERY".equals(s.getStopType())
                             && Objects.equals(userId, s.getReceiverUserId())).findFirst().ifPresent(own -> {
                         item.setDeliveryAddress(own.getAddress());

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/unifiedorder/dto/UnifiedOrderListItem.java

@@ -95,6 +95,6 @@ public class UnifiedOrderListItem {
     /** 收货站总数与已送达数;v2 多站点单返回,v1 闪送卡为空。 */
     private Integer deliveryStopCount;
     private Integer deliveredStopCount;
-    /** v2 逐站列表(用户顺序);寄件人全站文字地址,收件人看他人订单仅本站地址,其余站只留类型/序号/状态。 */
+    /** v2 逐站列表(用户顺序),寄件收件同口径全站文字地址;联系人、电话、坐标、凭证不落卡片。 */
     private List<FlashDeliveryStopView> stops;
 }

+ 5 - 3
ruoyi-admin/src/test/java/com/ruoyi/app/unifiedorder/UnifiedOrderQueryServiceTest.java

@@ -78,13 +78,15 @@ class UnifiedOrderQueryServiceTest {
         assertEquals("receiver", item.getRole());
         assertEquals(2, item.getPickupStopCount()); assertEquals(1, item.getPickedUpStopCount());
         assertEquals(2, item.getDeliveryStopCount()); assertEquals(0, item.getDeliveredStopCount());
-        // 查看人是第 4 站收件人:仅本站保留地址,其余站只留类型/序号/状态。
+        // 查看人是第 4 站收件人:全部站地址与备注同寄件人口径返回,联系人、电话、坐标不落卡片。
         assertEquals(4, item.getStops().size());
-        assertEquals(java.util.Arrays.asList(null, null, null, "address 3"),
+        assertEquals(List.of("address 0", "address 1", "address 2", "address 3"),
                 item.getStops().stream().map(FlashDeliveryStopView::getAddress).toList());
         assertEquals(List.of("PICKUP", "PICKUP", "DELIVERY", "DELIVERY"),
                 item.getStops().stream().map(FlashDeliveryStopView::getStopType).toList());
-        // 卡片级收货地址同步换成本人站点,不暴露他人收货地址。
+        assertNull(item.getStops().get(0).getName());
+        assertNull(item.getStops().get(0).getPhone());
+        // 卡片主位的收货地址仍指向本人站点。
         assertEquals("address 3", item.getDeliveryAddress());
 
         // 寄件人视角:全站文字地址可见,联系人、电话、坐标仍不落卡片。