|
@@ -161,6 +161,74 @@ class UnifiedOrderQueryServiceTest {
|
|
|
verify(posOrderMapper, times(1)).selectPage(any(), any());
|
|
verify(posOrderMapper, times(1)).selectPage(any(), any());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
|
+ @SuppressWarnings({"rawtypes", "unchecked"})
|
|
|
|
|
+ void sourceFilterAddsPosOrderTypePredicate() {
|
|
|
|
|
+ doReturn(pageOf(List.of())).when(posOrderMapper).selectPage(any(), any());
|
|
|
|
|
+ doReturn(pageOf(List.of())).when(flashOrderMapper).selectPage(any(), any());
|
|
|
|
|
+
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.TAKEAWAY, null, 10);
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.DINEIN, null, 10);
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.PICKUP, null, 10);
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, null, null, 10);
|
|
|
|
|
+
|
|
|
|
|
+ ArgumentCaptor<com.baomidou.mybatisplus.core.conditions.Wrapper> captor =
|
|
|
|
|
+ ArgumentCaptor.forClass(com.baomidou.mybatisplus.core.conditions.Wrapper.class);
|
|
|
|
|
+ verify(posOrderMapper, times(4)).selectPage(any(), captor.capture());
|
|
|
|
|
+ List<LambdaQueryWrapper<PosOrder>> wrappers = captor.getAllValues().stream()
|
|
|
|
|
+ .map(wrapper -> (LambdaQueryWrapper<PosOrder>) wrapper)
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ // takeaway 仅外送 type=0;dinein=堂食 type=2;pickup=自取 type=1
|
|
|
|
|
+ assertTrue(wrappers.get(0).getSqlSegment().contains("type ="), wrappers.get(0).getSqlSegment());
|
|
|
|
|
+ assertTrue(wrappers.get(0).getParamNameValuePairs().containsValue(0L),
|
|
|
|
|
+ wrappers.get(0).getParamNameValuePairs().toString());
|
|
|
|
|
+ assertTrue(wrappers.get(1).getSqlSegment().contains("type ="), wrappers.get(1).getSqlSegment());
|
|
|
|
|
+ assertTrue(wrappers.get(1).getParamNameValuePairs().containsValue(2L),
|
|
|
|
|
+ wrappers.get(1).getParamNameValuePairs().toString());
|
|
|
|
|
+ assertTrue(wrappers.get(2).getSqlSegment().contains("type ="), wrappers.get(2).getSqlSegment());
|
|
|
|
|
+ assertTrue(wrappers.get(2).getParamNameValuePairs().containsValue(1L),
|
|
|
|
|
+ wrappers.get(2).getParamNameValuePairs().toString());
|
|
|
|
|
+ // source=all 不限 type,堂食/自取单照常混排
|
|
|
|
|
+ assertFalse(wrappers.get(3).getSqlSegment().contains("type ="), wrappers.get(3).getSqlSegment());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void dineinAndPickupQueryOnlyPosOrderPathAndTagCursorWithOwnSource() {
|
|
|
|
|
+ doReturn(pageOf(List.of(takeaway(21L, 3000L), takeaway(22L, 2000L))))
|
|
|
|
|
+ .when(posOrderMapper).selectPage(any(), any());
|
|
|
|
|
+
|
|
|
|
|
+ UnifiedOrderPageView view = service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.DINEIN, null, 1);
|
|
|
|
|
+
|
|
|
|
|
+ assertEquals(1, view.getList().size());
|
|
|
|
|
+ // 卡片仍是外卖样式,堂食/自取由 type 字段渲染
|
|
|
|
|
+ assertEquals("takeaway", view.getList().get(0).getSourceType());
|
|
|
|
|
+ assertTrue(view.isHasMore());
|
|
|
|
|
+ assertEquals("3000000_dinein_21", view.getNextCursor());
|
|
|
|
|
+ verify(flashOrderMapper, never()).selectPage(any(), any());
|
|
|
|
|
+
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.PICKUP, null, 10);
|
|
|
|
|
+ verify(posOrderMapper, times(2)).selectPage(any(), any());
|
|
|
|
|
+ verify(flashOrderMapper, never()).selectPage(any(), any());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ @SuppressWarnings({"rawtypes", "unchecked"})
|
|
|
|
|
+ void dineinCursorDrivesSameSecondIdDecisivePredicateOnNextScroll() {
|
|
|
|
|
+ doReturn(pageOf(List.of())).when(posOrderMapper).selectPage(any(), any());
|
|
|
|
|
+
|
|
|
|
|
+ service.query(USER_ID, UnifiedOrderTab.ALL, OrderSource.DINEIN,
|
|
|
|
|
+ UnifiedCursor.parse("3000000_dinein_21"), 10);
|
|
|
|
|
+
|
|
|
|
|
+ ArgumentCaptor<com.baomidou.mybatisplus.core.conditions.Wrapper> captor =
|
|
|
|
|
+ ArgumentCaptor.forClass(com.baomidou.mybatisplus.core.conditions.Wrapper.class);
|
|
|
|
|
+ verify(posOrderMapper).selectPage(any(), captor.capture());
|
|
|
|
|
+ LambdaQueryWrapper<PosOrder> wrapper = (LambdaQueryWrapper<PosOrder>) captor.getValue();
|
|
|
|
|
+ // 同源游标:同秒 id 决胜分支存在,保证翻页不丢同秒行
|
|
|
|
|
+ String sql = wrapper.getSqlSegment();
|
|
|
|
|
+ assertTrue(sql.contains(" OR "), sql);
|
|
|
|
|
+ assertTrue(sql.contains("type ="), sql);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Test
|
|
@Test
|
|
|
void unpaidAndRefundTabsNeverQueryFlashPath() {
|
|
void unpaidAndRefundTabsNeverQueryFlashPath() {
|
|
|
doReturn(pageOf(List.of())).when(posOrderMapper).selectPage(any(), any());
|
|
doReturn(pageOf(List.of())).when(posOrderMapper).selectPage(any(), any());
|