补齐订单列表V4继续处理入口
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
package cn.nianxx.thhotel.workflows.reservation.common.enums;
|
||||
|
||||
/**
|
||||
* Reservation V4 订单列表下一步处理动作类型。
|
||||
*/
|
||||
public enum ReservationV4NextActionType {
|
||||
/** 下一张卡片可走普通确认接口。 */
|
||||
CONFIRM,
|
||||
/** 下一张卡片需要走人工复核解阻接口。 */
|
||||
REVIEW,
|
||||
/** 当前订单没有 V4 待处理卡片。 */
|
||||
NONE
|
||||
}
|
||||
@@ -16,6 +16,11 @@ import java.time.OffsetDateTime;
|
||||
* @param displayName 订单展示名
|
||||
* @param openTaskCount 未关闭任务数,排除 COMPLETED 和 FAILED
|
||||
* @param nextProcessableTaskId 下一条当前可处理任务 ID
|
||||
* @param nextV4OrderTaskId 当前订单下第一条仍需用户处理的 V4 订单任务 ID
|
||||
* @param nextV4ActionCardId 当前 V4 订单任务下第一张仍需确认或复核的卡片 ID
|
||||
* @param nextV4ActionType V4 下一步动作类型:CONFIRM / REVIEW / NONE
|
||||
* @param nextV4ActionStatus V4 下一步卡片状态:PENDING_CONFIRM / REVIEW_REQUIRED;没有待处理卡时为空
|
||||
* @param v4OpenOrderTaskCount 当前订单下未完成的 V4 订单任务数,COMPLETED 不计入
|
||||
* @param createdAt 订单创建时间,UTC
|
||||
* @param updatedAt 订单更新时间,UTC
|
||||
*/
|
||||
@@ -40,6 +45,16 @@ public record ReservationOrderListItemResult(
|
||||
Integer openTaskCount,
|
||||
@JsonProperty("next_processable_task_id")
|
||||
String nextProcessableTaskId,
|
||||
@JsonProperty("next_v4_order_task_id")
|
||||
String nextV4OrderTaskId,
|
||||
@JsonProperty("next_v4_action_card_id")
|
||||
String nextV4ActionCardId,
|
||||
@JsonProperty("next_v4_action_type")
|
||||
String nextV4ActionType,
|
||||
@JsonProperty("next_v4_action_status")
|
||||
String nextV4ActionStatus,
|
||||
@JsonProperty("v4_open_order_task_count")
|
||||
Integer v4OpenOrderTaskCount,
|
||||
@JsonProperty("created_at")
|
||||
OffsetDateTime createdAt,
|
||||
@JsonProperty("updated_at")
|
||||
|
||||
@@ -15,6 +15,9 @@ import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationOrderKeyT
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationOrderVisibility;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationTaskStatus;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationV4CardStatus;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationV4CardType;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationV4NextActionType;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.enums.ReservationV4OrderTaskStatus;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationOrderListQueryRequest;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationTaskWorkbenchQueryRequest;
|
||||
import cn.nianxx.thhotel.workflows.reservation.common.result.ReservationOrderDetailResult;
|
||||
@@ -134,11 +137,15 @@ public class ReservationFrontendQueryServiceImpl implements ReservationFrontendQ
|
||||
Map<Long, List<ReservationAiQueryTaskSnapshot>> tasksByOrderId = groupTasksByOrderId(orderTasks);
|
||||
Map<Long, ReservationTaskAvailabilityResult> availabilityByTaskId =
|
||||
calculateAvailabilityByTaskId(orderTasks, orderTasks);
|
||||
Map<Long, V4OrderListNextAction> v4NextActionsByOrderId = findV4NextActionsByOrderId(
|
||||
normalizedRequest.hotelId(),
|
||||
orderIds);
|
||||
List<ReservationOrderListItemResult> items = page.items().stream()
|
||||
.map(order -> toOrderListItem(
|
||||
order,
|
||||
tasksByOrderId.getOrDefault(order.id(), List.of()),
|
||||
availabilityByTaskId))
|
||||
availabilityByTaskId,
|
||||
v4NextActionsByOrderId.getOrDefault(order.id(), V4OrderListNextAction.none())))
|
||||
.toList();
|
||||
return new ReservationOrderListResult(
|
||||
items,
|
||||
@@ -555,7 +562,8 @@ public class ReservationFrontendQueryServiceImpl implements ReservationFrontendQ
|
||||
private ReservationOrderListItemResult toOrderListItem(
|
||||
ReservationAiQueryOrderSnapshot order,
|
||||
List<ReservationAiQueryTaskSnapshot> tasks,
|
||||
Map<Long, ReservationTaskAvailabilityResult> availabilityByTaskId) {
|
||||
Map<Long, ReservationTaskAvailabilityResult> availabilityByTaskId,
|
||||
V4OrderListNextAction v4NextAction) {
|
||||
return new ReservationOrderListItemResult(
|
||||
order.id().toString(),
|
||||
order.hotelId(),
|
||||
@@ -567,6 +575,11 @@ public class ReservationFrontendQueryServiceImpl implements ReservationFrontendQ
|
||||
order.displayName(),
|
||||
openTaskCount(tasks),
|
||||
nextProcessableTaskId(tasks, availabilityByTaskId),
|
||||
v4NextAction.orderTaskId(),
|
||||
v4NextAction.cardId(),
|
||||
v4NextAction.actionType(),
|
||||
v4NextAction.actionStatus(),
|
||||
v4NextAction.openOrderTaskCount(),
|
||||
UtcTimeFormatter.toUtcOffsetDateTime(order.createdAt()),
|
||||
UtcTimeFormatter.toUtcOffsetDateTime(order.updatedAt()));
|
||||
}
|
||||
@@ -601,6 +614,155 @@ public class ReservationFrontendQueryServiceImpl implements ReservationFrontendQ
|
||||
return tasksByOrderId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量派生订单列表 V4 下一步处理入口。S10/S99 来源通知没有订单,不会进入该统计。
|
||||
*/
|
||||
private Map<Long, V4OrderListNextAction> findV4NextActionsByOrderId(String hotelId, List<Long> orderIds) {
|
||||
if (orderIds == null || orderIds.isEmpty()) {
|
||||
return Map.of();
|
||||
}
|
||||
List<ReservationV4OrderTaskSnapshot> orderTasks = v4WorkflowRepository.findOrderTasksByOrderIds(
|
||||
hotelId,
|
||||
orderIds);
|
||||
if (orderTasks.isEmpty()) {
|
||||
return Map.of();
|
||||
}
|
||||
Map<Long, List<ReservationV4OrderTaskSnapshot>> orderTasksByOrderId = groupV4OrderTasksByOrderId(orderTasks);
|
||||
Map<Long, List<ReservationV4TaskCardSnapshot>> cardsByOrderTaskId = findV4TaskCardsByOrderTaskId(
|
||||
hotelId,
|
||||
orderTasks);
|
||||
Map<Long, V4OrderListNextAction> result = new LinkedHashMap<>();
|
||||
for (Long orderId : orderIds) {
|
||||
result.put(orderId, toV4OrderListNextAction(
|
||||
orderTasksByOrderId.getOrDefault(orderId, List.of()),
|
||||
cardsByOrderTaskId));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按本地订单 ID 对 V4 订单任务分组,并保留 Repository 已给出的同订单队列顺序。
|
||||
*/
|
||||
private Map<Long, List<ReservationV4OrderTaskSnapshot>> groupV4OrderTasksByOrderId(
|
||||
List<ReservationV4OrderTaskSnapshot> orderTasks) {
|
||||
Map<Long, List<ReservationV4OrderTaskSnapshot>> result = new LinkedHashMap<>();
|
||||
List<ReservationV4OrderTaskSnapshot> safeOrderTasks =
|
||||
orderTasks == null ? List.of() : orderTasks;
|
||||
for (ReservationV4OrderTaskSnapshot orderTask : safeOrderTasks) {
|
||||
if (orderTask.orderId() == null) {
|
||||
continue;
|
||||
}
|
||||
result.computeIfAbsent(orderTask.orderId(), ignored -> new java.util.ArrayList<>()).add(orderTask);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从同订单 V4 队列中派生第一条仍需处理的订单任务和卡片。
|
||||
*/
|
||||
private V4OrderListNextAction toV4OrderListNextAction(
|
||||
List<ReservationV4OrderTaskSnapshot> orderTasks,
|
||||
Map<Long, List<ReservationV4TaskCardSnapshot>> cardsByOrderTaskId) {
|
||||
List<ReservationV4OrderTaskSnapshot> safeOrderTasks = orderTasks == null ? List.of() : orderTasks;
|
||||
int openOrderTaskCount = Math.toIntExact(safeOrderTasks.stream()
|
||||
.filter(this::isOpenV4OrderTask)
|
||||
.count());
|
||||
for (ReservationV4OrderTaskSnapshot orderTask : safeOrderTasks) {
|
||||
if (!isOpenV4OrderTask(orderTask)) {
|
||||
continue;
|
||||
}
|
||||
V4CardNextAction cardAction = nextV4CardAction(
|
||||
cardsByOrderTaskId.getOrDefault(orderTask.id(), List.of()));
|
||||
if (!ReservationV4NextActionType.NONE.name().equals(cardAction.actionType())) {
|
||||
return new V4OrderListNextAction(
|
||||
orderTask.id().toString(),
|
||||
cardAction.cardId(),
|
||||
cardAction.actionType(),
|
||||
cardAction.actionStatus(),
|
||||
openOrderTaskCount);
|
||||
}
|
||||
}
|
||||
return V4OrderListNextAction.none(openOrderTaskCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断 V4 订单任务是否仍处于打开状态。COMPLETED 已结束,不计入订单列表 open 数。
|
||||
*/
|
||||
private boolean isOpenV4OrderTask(ReservationV4OrderTaskSnapshot orderTask) {
|
||||
return orderTask != null
|
||||
&& !ReservationV4OrderTaskStatus.COMPLETED.name().equals(orderTask.orderTaskStatus());
|
||||
}
|
||||
|
||||
/**
|
||||
* 派生单个 V4 订单任务下的下一张待处理卡:Basic 优先,业务卡内 REVIEW 高于普通确认。
|
||||
*/
|
||||
private V4CardNextAction nextV4CardAction(List<ReservationV4TaskCardSnapshot> cards) {
|
||||
List<ReservationV4TaskCardSnapshot> safeCards = cards == null ? List.of() : cards;
|
||||
ReservationV4TaskCardSnapshot basicCard = safeCards.stream()
|
||||
.filter(card -> ReservationV4CardType.BASIC_INFORMATION.name().equals(card.cardType()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
V4CardNextAction basicAction = actionableCard(basicCard);
|
||||
if (!ReservationV4NextActionType.NONE.name().equals(basicAction.actionType())) {
|
||||
return basicAction;
|
||||
}
|
||||
ReservationV4TaskCardSnapshot reviewCard = firstBusinessCardByStatus(
|
||||
safeCards,
|
||||
ReservationV4CardStatus.REVIEW_REQUIRED.name());
|
||||
if (reviewCard != null) {
|
||||
return new V4CardNextAction(
|
||||
reviewCard.id().toString(),
|
||||
ReservationV4NextActionType.REVIEW.name(),
|
||||
ReservationV4CardStatus.REVIEW_REQUIRED.name());
|
||||
}
|
||||
ReservationV4TaskCardSnapshot confirmCard = firstBusinessCardByStatus(
|
||||
safeCards,
|
||||
ReservationV4CardStatus.PENDING_CONFIRM.name());
|
||||
if (confirmCard != null) {
|
||||
return new V4CardNextAction(
|
||||
confirmCard.id().toString(),
|
||||
ReservationV4NextActionType.CONFIRM.name(),
|
||||
ReservationV4CardStatus.PENDING_CONFIRM.name());
|
||||
}
|
||||
return V4CardNextAction.none();
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 Basic Information 卡状态转换为订单列表可跳转动作。
|
||||
*/
|
||||
private V4CardNextAction actionableCard(ReservationV4TaskCardSnapshot card) {
|
||||
if (card == null) {
|
||||
return V4CardNextAction.none();
|
||||
}
|
||||
if (ReservationV4CardStatus.REVIEW_REQUIRED.name().equals(card.cardStatus())) {
|
||||
return new V4CardNextAction(
|
||||
card.id().toString(),
|
||||
ReservationV4NextActionType.REVIEW.name(),
|
||||
ReservationV4CardStatus.REVIEW_REQUIRED.name());
|
||||
}
|
||||
if (ReservationV4CardStatus.PENDING_CONFIRM.name().equals(card.cardStatus())) {
|
||||
return new V4CardNextAction(
|
||||
card.id().toString(),
|
||||
ReservationV4NextActionType.CONFIRM.name(),
|
||||
ReservationV4CardStatus.PENDING_CONFIRM.name());
|
||||
}
|
||||
return V4CardNextAction.none();
|
||||
}
|
||||
|
||||
/**
|
||||
* 按 Repository 排序找到第一张指定状态的业务卡,排除来源邮件展示卡和 Basic Information。
|
||||
*/
|
||||
private ReservationV4TaskCardSnapshot firstBusinessCardByStatus(
|
||||
List<ReservationV4TaskCardSnapshot> cards,
|
||||
String cardStatus) {
|
||||
return cards.stream()
|
||||
.filter(card -> !ReservationV4CardType.SOURCE_MESSAGE_DISPLAY.name().equals(card.cardType()))
|
||||
.filter(card -> !ReservationV4CardType.BASIC_INFORMATION.name().equals(card.cardType()))
|
||||
.filter(card -> cardStatus.equals(card.cardStatus()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计未关闭任务数量,排除 COMPLETED 和 FAILED。
|
||||
*/
|
||||
@@ -811,4 +973,41 @@ public class ReservationFrontendQueryServiceImpl implements ReservationFrontendQ
|
||||
Long conversationMessageCount) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单列表中一个本地订单对应的 V4 下一步处理摘要。
|
||||
*/
|
||||
private record V4OrderListNextAction(
|
||||
String orderTaskId,
|
||||
String cardId,
|
||||
String actionType,
|
||||
String actionStatus,
|
||||
Integer openOrderTaskCount) {
|
||||
|
||||
private static V4OrderListNextAction none() {
|
||||
return none(0);
|
||||
}
|
||||
|
||||
private static V4OrderListNextAction none(Integer openOrderTaskCount) {
|
||||
return new V4OrderListNextAction(
|
||||
null,
|
||||
null,
|
||||
ReservationV4NextActionType.NONE.name(),
|
||||
null,
|
||||
openOrderTaskCount);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 单张 V4 卡片对应的下一步动作摘要。
|
||||
*/
|
||||
private record V4CardNextAction(
|
||||
String cardId,
|
||||
String actionType,
|
||||
String actionStatus) {
|
||||
|
||||
private static V4CardNextAction none() {
|
||||
return new V4CardNextAction(null, ReservationV4NextActionType.NONE.name(), null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user