补齐订单列表V4继续处理入口

This commit is contained in:
andy
2026-07-20 01:54:38 +07:00
parent d1955f5097
commit 4b05cabd13
11 changed files with 459 additions and 17 deletions

View File

@@ -27,6 +27,7 @@ import cn.nianxx.thhotel.workflows.reservation.common.dto.ReservationTaskDraft;
import cn.nianxx.thhotel.workflows.reservation.common.dto.ReservationV4OrderTaskDraft;
import cn.nianxx.thhotel.workflows.reservation.common.dto.ReservationV4OrderTaskSnapshot;
import cn.nianxx.thhotel.workflows.reservation.common.dto.ReservationV4TaskCardDraft;
import cn.nianxx.thhotel.workflows.reservation.common.dto.ReservationV4TaskCardSnapshot;
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationOrderKeyType;
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationOrderStatus;
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationOrderVisibility;
@@ -601,6 +602,155 @@ class ReservationFrontendQueryControllerTest {
.andExpect(jsonPath("$.items[0].order_status").value("ENDED"));
}
@Test
void shouldReturnOrderListWithV4NextActionEntrypoint() throws Exception {
SourceMessageCaptureResult source = captureSourceMessage(
"mail-frontend-order-list-v4-cp14-001",
"Frontend Query Order List V4 CP14",
Instant.parse("2026-07-08T06:30:00Z"));
Long basicFirstOrderId = 930000000000004001L;
Long reviewFirstOrderId = 930000000000004002L;
Long confirmBusinessOrderId = 930000000000004003L;
Long completedOnlyOrderId = 930000000000004004L;
Long noV4OrderId = 930000000000004005L;
Long legacyTaskId = 930000000000004301L;
insertActiveGroupOrder(basicFirstOrderId, source.inboxId(), "GRP-FRONTEND-V4-CP14-BASIC");
insertActiveGroupOrder(reviewFirstOrderId, source.inboxId(), "GRP-FRONTEND-V4-CP14-REVIEW");
insertActiveGroupOrder(confirmBusinessOrderId, source.inboxId(), "GRP-FRONTEND-V4-CP14-CONFIRM");
insertActiveGroupOrder(completedOnlyOrderId, source.inboxId(), "GRP-FRONTEND-V4-CP14-COMPLETED");
insertActiveGroupOrder(noV4OrderId, source.inboxId(), "GRP-FRONTEND-V4-CP14-NONE");
insertTransition(930000000000004201L, source.inboxId(), 1, "GRP-FRONTEND-V4-CP14-BASIC",
"New Booking", "NEW_BOOKING", "NEW_BOOKING");
insertTask(legacyTaskId, basicFirstOrderId, source.inboxId(), 930000000000004201L, "New Booking",
"NEW_BOOKING", "NEW_BOOKING", "PENDING_CONFIRM", 1);
ReservationV4OrderTaskSnapshot basicFirstOrderTask = insertV4OrderTask(
930000000000004101L,
source,
basicFirstOrderId,
"order-basic-first",
1,
"GRP-FRONTEND-V4-CP14-BASIC",
Instant.parse("2026-07-08T06:30:00Z"),
HOTEL_ID);
insertV4TaskCard(basicFirstOrderTask, ReservationV4CardType.SOURCE_MESSAGE_DISPLAY.name(), null, 0, 10,
ReservationV4CardStatus.READONLY.name(), null, "{}");
ReservationV4TaskCardSnapshot basicFirstCard = insertV4TaskCard(
basicFirstOrderTask, ReservationV4CardType.BASIC_INFORMATION.name(), null, 0, 20,
ReservationV4CardStatus.PENDING_CONFIRM.name(), null, "{}");
insertV4TaskCard(basicFirstOrderTask, ReservationV4CardType.ROOM_INFORMATION.name(), "NEW_BOOKING", 1, 30,
ReservationV4CardStatus.REVIEW_REQUIRED.name(), "PENDING", "{}");
ReservationV4OrderTaskSnapshot laterOrderTask = insertV4OrderTask(
930000000000004102L,
source,
basicFirstOrderId,
"order-basic-later",
2,
"GRP-FRONTEND-V4-CP14-BASIC",
Instant.parse("2026-07-08T07:30:00Z"),
HOTEL_ID);
insertV4TaskCard(laterOrderTask, ReservationV4CardType.BASIC_INFORMATION.name(), null, 0, 20,
ReservationV4CardStatus.PENDING_CONFIRM.name(), null, "{}");
ReservationV4OrderTaskSnapshot reviewOrderTask = insertV4OrderTask(
930000000000004103L,
source,
reviewFirstOrderId,
"order-review-first",
3,
"GRP-FRONTEND-V4-CP14-REVIEW",
Instant.parse("2026-07-08T08:30:00Z"),
HOTEL_ID);
insertV4TaskCard(reviewOrderTask, ReservationV4CardType.BASIC_INFORMATION.name(), null, 0, 20,
ReservationV4CardStatus.CONFIRMED.name(), null, "{}");
insertV4TaskCard(reviewOrderTask, ReservationV4CardType.ROOM_INFORMATION.name(), "NEW_BOOKING", 1, 30,
ReservationV4CardStatus.PENDING_CONFIRM.name(), null, "{}");
ReservationV4TaskCardSnapshot reviewCard = insertV4TaskCard(
reviewOrderTask, ReservationV4CardType.PAYMENT.name(), "PAYMENT", 2, 60,
ReservationV4CardStatus.REVIEW_REQUIRED.name(), "PENDING", "{}");
ReservationV4OrderTaskSnapshot confirmOrderTask = insertV4OrderTask(
930000000000004104L,
source,
confirmBusinessOrderId,
"order-confirm-business",
4,
"GRP-FRONTEND-V4-CP14-CONFIRM",
Instant.parse("2026-07-08T09:30:00Z"),
HOTEL_ID);
insertV4TaskCard(confirmOrderTask, ReservationV4CardType.BASIC_INFORMATION.name(), null, 0, 20,
ReservationV4CardStatus.CONFIRMED.name(), null, "{}");
ReservationV4TaskCardSnapshot confirmCard = insertV4TaskCard(
confirmOrderTask, ReservationV4CardType.ROOM_INFORMATION.name(), "UPDATE_BOOKING", 1, 30,
ReservationV4CardStatus.PENDING_CONFIRM.name(), null, "{}");
ReservationV4OrderTaskSnapshot completedOrderTask = insertV4OrderTask(
930000000000004105L,
source,
completedOnlyOrderId,
"order-completed-only",
5,
"GRP-FRONTEND-V4-CP14-COMPLETED",
Instant.parse("2026-07-08T10:30:00Z"),
HOTEL_ID);
insertV4TaskCard(completedOrderTask, ReservationV4CardType.BASIC_INFORMATION.name(), null, 0, 20,
ReservationV4CardStatus.PENDING_CONFIRM.name(), null, "{}");
v4WorkflowRepository.updateOrderTaskStatus(
HOTEL_ID,
completedOrderTask.id(),
ReservationV4OrderTaskStatus.COMPLETED.name(),
completedOrderTask.updatedAt());
performAuthorized(mockMvc, adminToken(), get("/api/reservation/orders")
.param("hotel_id", HOTEL_ID)
.param("keyword", "GRP-FRONTEND-V4-CP14-")
.param("page_num", "1")
.param("page_size", "20"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].next_processable_task_id")
.value(contains(legacyTaskId.toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].v4_open_order_task_count")
.value(contains(2)))
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].next_v4_order_task_id")
.value(contains(basicFirstOrderTask.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].next_v4_action_card_id")
.value(contains(basicFirstCard.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].next_v4_action_type")
.value(contains("CONFIRM")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + basicFirstOrderId + "')].next_v4_action_status")
.value(contains("PENDING_CONFIRM")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + reviewFirstOrderId + "')].v4_open_order_task_count")
.value(contains(1)))
.andExpect(jsonPath("$.items[?(@.order_id=='" + reviewFirstOrderId + "')].next_v4_order_task_id")
.value(contains(reviewOrderTask.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + reviewFirstOrderId + "')].next_v4_action_card_id")
.value(contains(reviewCard.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + reviewFirstOrderId + "')].next_v4_action_type")
.value(contains("REVIEW")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + reviewFirstOrderId + "')].next_v4_action_status")
.value(contains("REVIEW_REQUIRED")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + confirmBusinessOrderId + "')].next_v4_order_task_id")
.value(contains(confirmOrderTask.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + confirmBusinessOrderId + "')].next_v4_action_card_id")
.value(contains(confirmCard.id().toString())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + confirmBusinessOrderId + "')].next_v4_action_type")
.value(contains("CONFIRM")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + confirmBusinessOrderId + "')].next_v4_action_status")
.value(contains("PENDING_CONFIRM")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + completedOnlyOrderId + "')].v4_open_order_task_count")
.value(contains(0)))
.andExpect(jsonPath("$.items[?(@.order_id=='" + completedOnlyOrderId + "')].next_v4_order_task_id")
.value(contains(nullValue())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + completedOnlyOrderId + "')].next_v4_action_type")
.value(contains("NONE")))
.andExpect(jsonPath("$.items[?(@.order_id=='" + completedOnlyOrderId + "')].next_v4_action_status")
.value(contains(nullValue())))
.andExpect(jsonPath("$.items[?(@.order_id=='" + noV4OrderId + "')].v4_open_order_task_count")
.value(contains(0)))
.andExpect(jsonPath("$.items[?(@.order_id=='" + noV4OrderId + "')].next_v4_action_type")
.value(contains("NONE")));
}
private SourceMessageCaptureResult captureSourceMessage(String externalMessageId, String subject) {
return captureSourceMessage(externalMessageId, subject, Instant.parse("2026-07-08T08:00:00Z"));
}
@@ -678,13 +828,25 @@ class ReservationFrontendQueryControllerTest {
String targetLocatorValue,
Instant sourceReceivedAt,
String hotelId) {
return insertV4OrderTask(aiBatchId, source, orderId, orderRef, 1, targetLocatorValue, sourceReceivedAt, hotelId);
}
private ReservationV4OrderTaskSnapshot insertV4OrderTask(
Long aiBatchId,
SourceMessageCaptureResult source,
Long orderId,
String orderRef,
Integer orderContextIndex,
String targetLocatorValue,
Instant sourceReceivedAt,
String hotelId) {
LocalDateTime now = LocalDateTime.ofInstant(sourceReceivedAt.plusSeconds(10), ZoneOffset.UTC);
return v4WorkflowRepository.findOrCreateOrderTask(new ReservationV4OrderTaskDraft(
hotelId,
source.inboxId(),
aiBatchId,
orderRef,
1,
orderContextIndex,
orderId,
"GROUP",
"GROUP_CODE",
@@ -695,7 +857,7 @@ class ReservationFrontendQueryControllerTest {
now));
}
private void insertV4TaskCard(
private ReservationV4TaskCardSnapshot insertV4TaskCard(
ReservationV4OrderTaskSnapshot orderTask,
String cardType,
String eventType,
@@ -704,7 +866,7 @@ class ReservationFrontendQueryControllerTest {
String cardStatus,
String reviewStatus,
String displayPayloadJson) {
v4WorkflowRepository.insertTaskCard(new ReservationV4TaskCardDraft(
return v4WorkflowRepository.insertTaskCard(new ReservationV4TaskCardDraft(
orderTask.hotelId(),
orderTask.id(),
orderTask.sourceMessageId(),