收紧 V4 复核解阻边界

This commit is contained in:
andy
2026-07-19 11:56:12 +07:00
parent d0d26c7fbe
commit b4f1b3c856
6 changed files with 160 additions and 7 deletions

View File

@@ -319,6 +319,73 @@ class ReservationV4CommandControllerTest {
.andExpect(jsonPath("$.business_cards[0].review_resolution.reason").value("确认房型映射"));
}
@Test
void shouldRejectReviewResolutionWhenResolvedOrderTaskRebindsToDifferentOrder() throws Exception {
Long currentOrderId = 990000000000070111L;
Long otherOrderId = 990000000000070112L;
seedReservationOrder(HOTEL_ID, currentOrderId);
seedReservationOrder(HOTEL_ID, otherOrderId);
SeededOrderTask seeded = seedReviewOrderTask(
HOTEL_ID,
"mail-v4-command-review-rebind-001",
Instant.parse("2026-07-19T01:22:10Z"),
currentOrderId,
ReservationV4CardStatus.PENDING_CONFIRM.name(),
ReservationV4CardStatus.REVIEW_REQUIRED.name());
confirmBasicCard(seeded);
performAuthorized(mockMvc, adminToken(), post(
"/api/reservation/order-tasks/{orderTaskId}/cards/{cardId}/review-resolution",
seeded.orderTask().id(),
seeded.businessCard().id())
.contentType(MediaType.APPLICATION_JSON)
.content("""
{
"version": 0,
"confirmed_order_id": "990000000000070112",
"field_overrides": [
{"field_pointer": "/business_fields/room_items/0/pms_room_type_code", "value": "RM2"}
]
}
"""))
.andExpect(status().isConflict())
.andExpect(jsonPath("$.error_code").value("V4_ORDER_REBIND_NOT_ALLOWED"));
Long persistedOrderId = jdbcTemplate.queryForObject(
"SELECT order_id FROM workflow_reservation_v4_order_task WHERE id = ?",
Long.class,
seeded.orderTask().id());
org.assertj.core.api.Assertions.assertThat(persistedOrderId).isEqualTo(currentOrderId);
}
@Test
void shouldRejectReviewResolutionForFieldNotMarkedUnresolved() throws Exception {
SeededOrderTask seeded = seedReviewOrderTask(
HOTEL_ID,
"mail-v4-command-review-resolved-field-001",
Instant.parse("2026-07-19T01:22:20Z"),
990000000000070113L,
ReservationV4CardStatus.PENDING_CONFIRM.name(),
ReservationV4CardStatus.REVIEW_REQUIRED.name());
confirmBasicCard(seeded);
performAuthorized(mockMvc, adminToken(), post(
"/api/reservation/order-tasks/{orderTaskId}/cards/{cardId}/review-resolution",
seeded.orderTask().id(),
seeded.businessCard().id())
.contentType(MediaType.APPLICATION_JSON)
.content("""
{
"version": 0,
"field_overrides": [
{"field_pointer": "/business_fields/room_items/0/room_count", "value": 3}
]
}
"""))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.error_code").value("V4_REVIEW_POINTER_NOT_ALLOWED"));
}
@Test
void shouldRejectReviewResolutionWhenOrderOwnershipUnresolvedAndConfirmedOrderMissing() throws Exception {
SeededOrderTask seeded = seedReviewOrderTask(