Răsfoiți Sursa

feat: 统一订单列表闪送条目返回 orderVersion(030 T024)

qmj 1 oră în urmă
părinte
comite
f4907bf64c

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/unifiedorder/UnifiedOrderQueryService.java

@@ -216,6 +216,7 @@ public class UnifiedOrderQueryService {
         item.setCurrency(order.getCurrency());
         item.setHasAfterSale(false);
         item.setStatus(order.getStatus());
+        item.setOrderVersion(order.getVersion());
         item.setServiceType(order.getServiceType());
         item.setDeliveryType(order.getDeliveryType());
         item.setVehicleType(order.getVehicleType());

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

@@ -58,6 +58,8 @@ public class UnifiedOrderListItem {
 
     /** 闪送状态:WAITING_ACCEPTANCE/ACCEPTED/PICKED_UP/DELIVERED/COMPLETED/CANCELLED。 */
     private String status;
+    /** 闪送乐观锁版本(用户编辑待接单订单须回传,同 FlashDeliveryUserOrderListView.orderVersion)。 */
+    private Integer orderVersion;
     /** 业务场景:HELP_SEND=帮送、HELP_PICKUP=帮取。 */
     private String serviceType;
     /** 配送等级:NORMAL=普通、URGENT=加急。 */

+ 11 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/unifiedorder/UnifiedOrderQueryServiceTest.java

@@ -381,6 +381,17 @@ class UnifiedOrderQueryServiceTest {
         assertEquals("sender", view.getList().get(0).getRole());
     }
 
+    @Test
+    void flashItemsCarryOrderVersion() {
+        FlashDeliveryOrder order = flash(31L, 3000L);
+        order.setVersion(7);
+        doReturn(pageOf(List.of(order))).when(flashOrderMapper).selectPage(any(), any());
+
+        UnifiedOrderPageView view = service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.FLASH, null, 10);
+
+        assertEquals(7, view.getList().get(0).getOrderVersion());
+    }
+
     // ---------- helpers ----------
 
     private static PosOrder takeaway(long id, long timeSec) {

+ 1 - 1
specs/030-unified-order-list/contracts/api-contract.md

@@ -54,7 +54,7 @@ Query:
 
 ### flash 渲染块(对齐现有闪送列表卡片)
 
-`status`(WAITING_ACCEPTANCE/ACCEPTED/PICKED_UP/DELIVERED/COMPLETED/CANCELLED)、`serviceType`、`deliveryType`、`vehicleType`、`deliveryMode`(NOW/SCHEDULED)、`scheduledPickupStartAt/scheduledPickupEndAt`、`pickupAddress/pickupDetailAddress`、`deliveryAddress/deliveryDetailAddress`、`packageType`、`quantity`、`tipAmount`
+`status`(WAITING_ACCEPTANCE/ACCEPTED/PICKED_UP/DELIVERED/COMPLETED/CANCELLED)、`orderVersion`(闪送乐观锁版本,用户编辑待接单订单须回传)、`serviceType`、`deliveryType`、`vehicleType`、`deliveryMode`(NOW/SCHEDULED)、`scheduledPickupStartAt/scheduledPickupEndAt`、`pickupAddress/pickupDetailAddress`、`deliveryAddress/deliveryDetailAddress`、`packageType`、`quantity`、`tipAmount`
 
 ## 4. tab 归类语义(前端文案对照)
 

+ 1 - 1
specs/030-unified-order-list/data-model.md

@@ -26,7 +26,7 @@
 
 ### 闪送渲染块(flash,对齐 FlashDeliveryUserOrderListView 字段子集)
 
-`status`(六态枚举原值)、`serviceType`、`deliveryType`、`vehicleType`、`deliveryMode`+`scheduledPickupStartAt/scheduledPickupEndAt`、`pickupAddress/pickupDetailAddress`、`deliveryAddress/deliveryDetailAddress`、`packageType`、`quantity`、`tipAmount`、`amount`。
+`status`(六态枚举原值)、`orderVersion`(乐观锁版本,编辑待接单订单须回传)、`serviceType`、`deliveryType`、`vehicleType`、`deliveryMode`+`scheduledPickupStartAt/scheduledPickupEndAt`、`pickupAddress/pickupDetailAddress`、`deliveryAddress/deliveryDetailAddress`、`packageType`、`quantity`、`tipAmount`、`amount`。
 
 ## 2. 游标 UnifiedCursor
 

+ 1 - 0
specs/030-unified-order-list/tasks.md

@@ -113,6 +113,7 @@ mvn -pl ruoyi-admin -am test -Dtest='XxxTest' -Dsurefire.failIfNoSpecifiedTests=
 ## Phase 8: 追加需求(2026-09-21)——来源筛选扩堂食/自取
 
 - [x] T023 `source` 扩枚举 `dinein`(堂食 type=2)/`pickup`(自取 type=1),`takeaway` 收窄为仅外送单(type=0),`all` 不限 type 照常混排:`OrderSource` 增枚举值+`posOrderType`;`UnifiedOrderQueryService` 外卖路按查询源加 type 过滤、游标推进源随查询源(dinein/pickup 单选翻页同秒 id 决胜)、单选跳过闪送路;游标编码单选时为 dinein/pickup,混排仍只产生 takeaway/flash;测试补 type 谓词/路由/游标推进;api-contract/data-model/quickstart 同步
+- [x] T024 闪送条目返回 `orderVersion`(乐观锁版本,取 `flash_delivery_order.version`,语义同 FlashDeliveryUserOrderListView):DTO flash 块加字段、`flashItem` 赋值;测试补 orderVersion 断言;api-contract/data-model 同步
 
 ---