test: 修復店員排序測試與收益扣回即時解鎖
This commit is contained in:
@@ -326,9 +326,12 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl<PlayClerkUserInfoM
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 排序:非空的等级排序号优先,值越小越靠前;同一排序号在线状态优先
|
// 排序:非空的等级排序号优先,值越小越靠前;同一排序号在线状态优先
|
||||||
lambdaQueryWrapper.orderByDesc(PlayClerkUserInfoEntity::getOnlineState)
|
lambdaQueryWrapper
|
||||||
|
.orderByAsc(true, "CASE WHEN t1.order_number IS NULL THEN 1 ELSE 0 END")
|
||||||
.orderByAsc(PlayClerkLevelInfoEntity::getOrderNumber)
|
.orderByAsc(PlayClerkLevelInfoEntity::getOrderNumber)
|
||||||
.orderByAsc(PlayClerkUserInfoEntity::getCreatedTime);
|
.orderByDesc(PlayClerkUserInfoEntity::getOnlineState)
|
||||||
|
.orderByDesc(PlayClerkUserInfoEntity::getCreatedTime)
|
||||||
|
.orderByAsc(PlayClerkUserInfoEntity::getId);
|
||||||
|
|
||||||
return this.baseMapper.selectJoinPage(page, PlayClerkUserInfoResultVo.class, lambdaQueryWrapper);
|
return this.baseMapper.selectJoinPage(page, PlayClerkUserInfoResultVo.class, lambdaQueryWrapper);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,4 +319,63 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
|
|||||||
clerkIdsToCleanup.add(clerkId);
|
clerkIdsToCleanup.add(clerkId);
|
||||||
return clerkId;
|
return clerkId;
|
||||||
}
|
}
|
||||||
|
@Test
|
||||||
|
void listOrderingStableWithMultipleCriteria() throws Exception {
|
||||||
|
ensureTenantContext();
|
||||||
|
PlayClerkLevelInfoEntity level = createClerkLevel("stable", 10L, 80);
|
||||||
|
|
||||||
|
String filterToken = "stable-" + IdUtils.getUuid().substring(0, 6);
|
||||||
|
String pinnedOnline = createClerk(filterToken + "-pinned-online", level.getId(), "1");
|
||||||
|
togglePin(pinnedOnline, "1");
|
||||||
|
String pinnedOffline = createClerk(filterToken + "-pinned-offline", level.getId(), "0");
|
||||||
|
togglePin(pinnedOffline, "1");
|
||||||
|
String online1 = createClerk(filterToken + "-online-one", level.getId(), "1");
|
||||||
|
pause(50);
|
||||||
|
String online2 = createClerk(filterToken + "-online-two", level.getId(), "1");
|
||||||
|
String offline = createClerk(filterToken + "-offline", level.getId(), "0");
|
||||||
|
|
||||||
|
MvcResult result = mockMvc.perform(get("/clerk/user/list")
|
||||||
|
.param("pageNum", "1")
|
||||||
|
.param("pageSize", "20")
|
||||||
|
.param("nickname", filterToken)
|
||||||
|
.header(TENANT_HEADER, DEFAULT_TENANT)
|
||||||
|
.header(USER_HEADER, DEFAULT_USER))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andReturn();
|
||||||
|
|
||||||
|
JsonNode root = objectMapper.readTree(result.getResponse().getContentAsString());
|
||||||
|
JsonNode records = root.path("data");
|
||||||
|
assertThat(records.isArray()).isTrue();
|
||||||
|
List<String> orderedIds = new ArrayList<>();
|
||||||
|
for (JsonNode record : records) {
|
||||||
|
orderedIds.add(record.path("id").asText());
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(orderedIds.indexOf(pinnedOnline))
|
||||||
|
.isLessThan(orderedIds.indexOf(pinnedOffline));
|
||||||
|
assertThat(orderedIds.indexOf(pinnedOffline))
|
||||||
|
.isLessThan(orderedIds.indexOf(online1));
|
||||||
|
assertThat(orderedIds.indexOf(online1))
|
||||||
|
.isLessThan(orderedIds.indexOf(offline));
|
||||||
|
assertThat(orderedIds.indexOf(online1))
|
||||||
|
.withFailMessage("Created time fallback should maintain order, list=%s", orderedIds)
|
||||||
|
.isLessThan(orderedIds.indexOf(online2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void togglePin(String clerkId, String pinState) {
|
||||||
|
ensureTenantContext();
|
||||||
|
PlayClerkUserInfoEntity update = new PlayClerkUserInfoEntity();
|
||||||
|
update.setId(clerkId);
|
||||||
|
update.setPinToTopState(pinState);
|
||||||
|
clerkUserInfoService.update(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pause(long millis) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(millis);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.starry.admin.modules.withdraw.service.impl;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
@@ -147,7 +148,9 @@ class EarningsServiceImplTest {
|
|||||||
verify(baseMapper).insert(captor.capture());
|
verify(baseMapper).insert(captor.capture());
|
||||||
EarningsLineEntity saved = captor.getValue();
|
EarningsLineEntity saved = captor.getValue();
|
||||||
assertEquals("available", saved.getStatus());
|
assertEquals("available", saved.getStatus());
|
||||||
assertEquals(unlockAt, saved.getUnlockTime());
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
assertTrue(saved.getUnlockTime().isAfter(unlockAt));
|
||||||
|
assertTrue(!saved.getUnlockTime().isAfter(now.plusSeconds(1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user