Quellcode durchsuchen

修复在线支付自取订单列表归类

qmj vor 1 Woche
Ursprung
Commit
62a6bda30c

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

@@ -486,7 +486,10 @@ public class PosOrderShOprateController extends BaseController {
         switch (tab) {
             case "pending":
                 wrapper.eq(PosOrder::getState, 0L)
-                       .and(w -> w.eq(PosOrder::getPayStatus, 1L).or().in(PosOrder::getType, 1L, 2L));
+                       // 现金自取/堂食可直接待受理;在线支付的自取/堂食必须先完成付款。
+                       .and(w -> w.eq(PosOrder::getPayStatus, 1L)
+                               .or(cash -> cash.eq(PosOrder::getPayType, "1")
+                                       .in(PosOrder::getType, 1L, 2L)));
                 break;
             case "preparing":
                 wrapper.eq(PosOrder::getState, 1L);

+ 9 - 3
ruoyi-admin/src/main/java/com/ruoyi/app/order/UserOrderController.java

@@ -553,13 +553,19 @@ public class UserOrderController extends BaseController {
 
         switch (tab) {
             case "unpaid":
-                // 排除已取消(state=4)和售后中(afterSaleStatus>0)的订单
-                wrapper.eq(PosOrder::getPayStatus, 0L).eq(PosOrder::getType, 0L).ne(PosOrder::getState, 4L).eq(PosOrder::getAfterSaleStatus, 0L);
+                // 在线支付订单不区分配送类型;自取/堂食未付款也必须先留在待付款。
+                wrapper.eq(PosOrder::getPayStatus, 0L)
+                       .in(PosOrder::getPayType, "2", "3")
+                       .ne(PosOrder::getState, 4L)
+                       .eq(PosOrder::getAfterSaleStatus, 0L);
                 break;
             case "active":
                 wrapper.in(PosOrder::getState, 0L, 1L, 2L)
                        .eq(PosOrder::getAfterSaleStatus, 0L)
-                       .and(w -> w.eq(PosOrder::getPayStatus, 1L).or().in(PosOrder::getType, 1L, 2L));
+                       // 现金自取/堂食可以线下收款;OMG、LINE Pay 等在线订单必须已付款才能履约。
+                       .and(w -> w.eq(PosOrder::getPayStatus, 1L)
+                               .or(cash -> cash.eq(PosOrder::getPayType, "1")
+                                       .in(PosOrder::getType, 1L, 2L)));
                 break;
             case "completed":
                 wrapper.eq(PosOrder::getState, 3L).eq(PosOrder::getAfterSaleStatus, 0L);

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

@@ -0,0 +1,109 @@
+package com.ruoyi.app.order;
+
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.system.domain.InfoUser;
+import com.ruoyi.system.domain.PosOrder;
+import com.ruoyi.system.service.IInfoUserService;
+import com.ruoyi.system.service.IPosOrderService;
+import com.ruoyi.system.utils.JwtUtil;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class OrderListPaymentFilterTest {
+
+    @BeforeAll
+    static void initializeTableMetadata() {
+        TableInfoHelper.initTableInfo(
+                new MapperBuilderAssistant(new MybatisConfiguration(), ""), PosOrder.class);
+    }
+
+    @Test
+    void userUnpaidTabIncludesOnlinePickupAndDineInOrders() {
+        IPosOrderService orders = mock(IPosOrderService.class);
+        UserOrderController controller = new UserOrderController();
+        ReflectionTestUtils.setField(controller, "posOrderService", orders);
+        when(orders.page(any(Page.class), any(Wrapper.class))).thenReturn(new Page<>());
+
+        controller.orderList(tokenFor(909L), 1, 10, "unpaid", null);
+
+        LambdaQueryWrapper<PosOrder> query = capturedQuery(orders);
+        String sql = query.getSqlSegment();
+        Collection<Object> parameters = new ArrayList<>(query.getParamNameValuePairs().values());
+        assertTrue(sql.contains("pay_type IN"));
+        assertFalse(sql.contains("AND type ="));
+        assertEquals(1, Collections.frequency(parameters, "2"));
+        assertEquals(1, Collections.frequency(parameters, "3"));
+    }
+
+    @Test
+    void userActiveTabAllowsUnpaidPickupAndDineInOnlyForCashPayment() {
+        IPosOrderService orders = mock(IPosOrderService.class);
+        UserOrderController controller = new UserOrderController();
+        ReflectionTestUtils.setField(controller, "posOrderService", orders);
+        when(orders.page(any(Page.class), any(Wrapper.class))).thenReturn(new Page<>());
+
+        controller.orderList(tokenFor(909L), 1, 10, "active", null);
+
+        LambdaQueryWrapper<PosOrder> query = capturedQuery(orders);
+        String sql = query.getSqlSegment();
+        Collection<Object> parameters = new ArrayList<>(query.getParamNameValuePairs().values());
+        assertTrue(sql.contains("(pay_status ="));
+        assertTrue(sql.contains("OR (pay_type ="));
+        assertTrue(sql.contains("AND type IN"));
+        assertEquals(1, Collections.frequency(parameters, "1"));
+    }
+
+    @Test
+    void merchantPendingTabDoesNotExposeUnpaidOnlinePickupOrDineInOrders() {
+        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("1");
+        when(users.getOne(any())).thenReturn(merchant);
+        when(orders.page(any(Page.class), any(Wrapper.class))).thenReturn(new Page<>());
+
+        controller.orderList(tokenFor(801L), 1, 10, "pending", null, null);
+
+        LambdaQueryWrapper<PosOrder> query = capturedQuery(orders);
+        String sql = query.getSqlSegment();
+        Collection<Object> parameters = new ArrayList<>(query.getParamNameValuePairs().values());
+        assertTrue(sql.contains("(pay_status ="));
+        assertTrue(sql.contains("OR (pay_type ="));
+        assertTrue(sql.contains("AND type IN"));
+        assertEquals(1, Collections.frequency(parameters, "1"));
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private static LambdaQueryWrapper<PosOrder> capturedQuery(IPosOrderService orders) {
+        ArgumentCaptor<Wrapper> captor = ArgumentCaptor.forClass(Wrapper.class);
+        verify(orders).page(any(Page.class), captor.capture());
+        return (LambdaQueryWrapper<PosOrder>) captor.getValue();
+    }
+
+    private static String tokenFor(Long userId) {
+        return JwtUtil.setToken(String.valueOf(userId), "test-user");
+    }
+}