Browse Source

商家订单列表隐藏骑手未接单的外送订单

qmj 1 day ago
parent
commit
d26335ef29

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderShOprateController.java

@@ -637,6 +637,10 @@ public class PosOrderShOprateController extends BaseController {
         if (type != null && !type.isEmpty()) {
         if (type != null && !type.isEmpty()) {
             wrapper.eq(PosOrder::getType, Long.valueOf(type));
             wrapper.eq(PosOrder::getType, Long.valueOf(type));
         }
         }
+        // 外送订单须骑手已接单才对商家可见;自取、堂食不受配送状态限制。
+        wrapper.and(w -> w.ne(PosOrder::getType, 0L)
+                .or(delivery -> delivery.in(PosOrder::getDeliveryStatus, 1L, 2L, 3L)
+                        .isNotNull(PosOrder::getQsId)));
         switch (tab == null ? "" : tab) {
         switch (tab == null ? "" : tab) {
             case "pending":
             case "pending":
                 wrapper.eq(PosOrder::getState, 0L)
                 wrapper.eq(PosOrder::getState, 0L)

+ 31 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/order/OrderListPaymentFilterTest.java

@@ -18,6 +18,9 @@ import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.NullAndEmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.MockedStatic;
 import org.mockito.MockedStatic;
 import org.mockito.ArgumentCaptor;
 import org.mockito.ArgumentCaptor;
 import org.springframework.test.util.ReflectionTestUtils;
 import org.springframework.test.util.ReflectionTestUtils;
@@ -111,6 +114,34 @@ class OrderListPaymentFilterTest {
         assertEquals(1, Collections.frequency(parameters, "1"));
         assertEquals(1, Collections.frequency(parameters, "1"));
     }
     }
 
 
+    @ParameterizedTest
+    @NullAndEmptySource
+    @ValueSource(strings = {"pending", "preparing", "ready", "completed", "cancelled", "refund"})
+    void merchantListRequiresAssignedRiderForDeliveryAcrossAllTabs(String tab) {
+        IPosOrderService orders = mock(IPosOrderService.class);
+        IInfoUserService users = mock(IInfoUserService.class);
+        PosOrderShOprateController controller = new PosOrderShOprateController();
+        ReflectionTestUtils.setField(controller, "posOrderService", orders);
+        ReflectionTestUtils.setField(controller, "infoUserService", users);
+        InfoUser merchant = new InfoUser();
+        merchant.setUserId(801L);
+        merchant.setUserType("3");
+        auth.when(AuthContext::requireUserId).thenReturn(801L);
+        when(users.getOne(any())).thenReturn(merchant);
+        when(orders.page(any(Page.class), any(Wrapper.class))).thenReturn(new Page<>());
+
+        controller.orderList(tokenFor(801L), 1, 10, tab, null, null);
+
+        LambdaQueryWrapper<PosOrder> query = capturedQuery(orders);
+        String sql = query.getSqlSegment();
+        for (var entry : query.getParamNameValuePairs().entrySet()) {
+            sql = sql.replace("#{ew.paramNameValuePairs." + entry.getKey() + "}",
+                    String.valueOf(entry.getValue()));
+        }
+        // 非外送订单保留;外送须已接单并有骑手,取餐和送达后的订单仍可查询。
+        assertTrue(sql.contains("sh_id = 801 AND (type <> 0 OR (delivery_status IN (1,2,3) AND qs_id IS NOT NULL))"), sql);
+    }
+
     @BeforeEach
     @BeforeEach
     void setUpMessages() {
     void setUpMessages() {
         messages = mockStatic(MessageUtils.class);
         messages = mockStatic(MessageUtils.class);

+ 6 - 0
specs/006-orderstate/plan.md

@@ -108,3 +108,9 @@ E:\QtwCode\foodie\foodie-admin-vue\
 新增订单配送推送服务统一处理两类跨入口副作用:到付创建或在线支付成功后通知附近可接单骑手,以及已分配骑手订单取消后的相关方通知。用户聚合下单、旧 `/addorder` 到付入口、LINE Pay 和 OMG 支付成功入口共用同一开放条件,避免不同支付方式形成不同履约顺序。
 新增订单配送推送服务统一处理两类跨入口副作用:到付创建或在线支付成功后通知附近可接单骑手,以及已分配骑手订单取消后的相关方通知。用户聚合下单、旧 `/addorder` 到付入口、LINE Pay 和 OMG 支付成功入口共用同一开放条件,避免不同支付方式形成不同履约顺序。
 
 
 商家接单和出餐在原支付、归属校验基础上增加骑手分配校验;骑手新任务查询增加 `state=0` 和 `payStatus=1` 条件。骑手占用查询只统计 `state IN (0,1,2)` 且 `deliveryStatus IN (1,2)` 的有效履约订单,取消订单不继续占用骑手。
 商家接单和出餐在原支付、归属校验基础上增加骑手分配校验;骑手新任务查询增加 `state=0` 和 `payStatus=1` 条件。骑手占用查询只统计 `state IN (0,1,2)` 且 `deliveryStatus IN (1,2)` 的有效履约订单,取消订单不继续占用骑手。
+
+## 2026-09-15 增量实施设计
+
+在 `PosOrderShOprateController.orderList` 公共查询条件中追加 `type <> 0 OR (delivery_status IN (1,2,3) AND qs_id IS NOT NULL)`,与门店权限及各页签条件以 AND 组合后交由现有分页查询执行。接口参数和响应保持现状,不修改商家受理、支付、配送状态流转,也不新增字段。
+
+定向验证各页签、空页签及未传页签均携带接单过滤,非外送分支可保留自取/堂食,并回归支付条件和子账号门店权限。

+ 6 - 0
specs/006-orderstate/spec.md

@@ -725,3 +725,9 @@ wrapper.last("ORDER BY ST_Distance_Sphere(point(longitude, latitude), " +
 - [美团外卖开放平台 — 订单退款与取消](https://developer.waimai.meituan.com/home/questionDetail/6295)
 - [美团外卖开放平台 — 订单退款与取消](https://developer.waimai.meituan.com/home/questionDetail/6295)
 - [美团外卖开放平台 — 订单确认退款请求](https://developer.waimai.meituan.com/home/docDetail/122)
 - [美团外卖开放平台 — 订单确认退款请求](https://developer.waimai.meituan.com/home/docDetail/122)
 - [美团外卖订单中心演进](https://tech.meituan.com/2016/09/09/mt-waimai-order-evolution.html)
 - [美团外卖订单中心演进](https://tech.meituan.com/2016/09/09/mt-waimai-order-evolution.html)
+
+## 2026-09-15 增量:商家列表隐藏未接单外送订单
+
+- `/system/orderShOprate/orderList` 的全部页签及不传 `tab` 的查询,外送订单(`type=0`)仅在 `deliveryStatus IN (1,2,3)` 且 `qsId` 非空时可见;未被骑手接单的外送订单不返回,包括取消、售后页签。
+- 自取、堂食不要求骑手接单,沿用原支付、订单状态及商家门店权限条件。
+- 过滤在数据库分页前执行,列表记录和分页总数使用同一条件;已取餐、已送达的订单不因配送状态推进而被隐藏。

+ 6 - 0
specs/006-orderstate/tasks.md

@@ -241,3 +241,9 @@ Task T022: "骑手端 PosOrderQsOprateController.orderList()"
 - Phase 1 完成后需手动执行 SQL(updatesql/sql.md)
 - Phase 1 完成后需手动执行 SQL(updatesql/sql.md)
 - 前端文件编辑需用 Python 脚本处理 CRLF 换行符问题
 - 前端文件编辑需用 Python 脚本处理 CRLF 换行符问题
 - 旧方法(PosOrderController 中旧列表查询)保留不删
 - 旧方法(PosOrderController 中旧列表查询)保留不删
+
+## 2026-09-15 增量:商家列表接单过滤
+
+- [x] T042 为商家全部页签、空页签及未传页签补充接单过滤回归,修改前 8 个新增用例均因缺少条件失败。
+- [x] T043 在 `orderList` 分页前统一限制外送订单须 `deliveryStatus IN (1,2,3)` 且 `qsId` 非空,保留自取/堂食、支付和门店权限条件。
+- [x] T044 使用 JDK 21 运行 `OrderListPaymentFilterTest`、`PosOrderShOprateControllerTest`、`PosOrderQsOprateControllerTest` 定向测试,23/23 通过;未执行真实数据库分页联调和完整回归。