调整房表生成提示和日期格式

This commit is contained in:
andy
2026-08-06 12:44:53 +08:00
parent 6cc9bb4439
commit fd801caa73
8 changed files with 23 additions and 22 deletions

View File

@@ -414,7 +414,7 @@ export default {
departure: 'Departure',
datePlaceholder: 'yyyy-MM-dd',
roomType: 'Room type',
roomTypePlaceholder: 'e.g. DLX / TWN',
roomTypePlaceholder: 'e.g. RM2/RM3',
titleColumn: 'Title',
rateCode: 'Rate Code',
adults: 'Adults',

View File

@@ -414,7 +414,7 @@ export default {
departure: 'Departure',
datePlaceholder: 'yyyy-MM-dd',
roomType: 'Room Type',
roomTypePlaceholder: 'เช่น DLX / TWN',
roomTypePlaceholder: 'เช่น RM2/RM3',
titleColumn: 'Title',
rateCode: 'Rate Code',
adults: 'Adults',

View File

@@ -413,7 +413,7 @@ export default {
departure: '离店日期',
datePlaceholder: 'yyyy-MM-dd',
roomType: '房型',
roomTypePlaceholder: '例如 DLX / TWN',
roomTypePlaceholder: '例如 RM2/RM3',
titleColumn: '称谓Title',
rateCode: '价格代码Rate Code',
adults: '成人数Adults',

View File

@@ -157,6 +157,7 @@ describe('ReservationRoomingListGenerationView', () => {
expect(wrapper.find('[data-testid="rooming-list-arrival"]').exists()).toBe(true)
expect(wrapper.find('[data-testid="rooming-list-departure"]').exists()).toBe(true)
expect(wrapper.find('[data-testid="rooming-list-room-type"]').attributes('placeholder')).toBe('例如 RM2/RM3')
expect(wrapper.find('[data-testid="rooming-list-title"]').exists()).toBe(false)
expect(wrapper.find('[data-testid="rooming-list-rate-code"]').exists()).toBe(false)
expect(wrapper.find('[data-testid="rooming-list-adults"]').exists()).toBe(false)

View File

@@ -131,15 +131,15 @@ CP2 起后端应识别来源 Excel 的 `旅游日期` 表头,并从有名单
- 右侧结束日期可以省略年份;省略年份时继承起始日期年份。
- 右侧结束日期可以省略月份;省略月份时继承起始日期月份。
- 支持常见区间分隔符,例如 ```-````—``至``到`
- `Arrival` 使用起始日期,格式化为 `yyyy/MM/dd`
- `Departure` 使用结束日期,格式化为 `yyyy/MM/dd`
- `Arrival` 使用起始日期,生成目标 Excel 时格式化为 `dd/MM/yyyy`
- `Departure` 使用结束日期,生成目标 Excel 时格式化为 `dd/MM/yyyy`
- 旅游日期属于酒店本地业务日期,不按 UTC 时间点换算。
- 同一来源文件中参与生成的名单行必须解析出同一个旅游日期区间如果出现多个不同区间CP2 先返回受控错误,不自动混合生成。
- 如果缺少 `旅游日期` 表头、旅游日期为空、格式无法解析或结束日期不晚于起始日期,返回 `ROOMING_LIST_SOURCE_FILE_INVALID` 或统一受控业务错误,不应生成半成品 Excel。
中文说明:
- 当前样表第 2 行表头中包含 `旅游日期`,第 3 行起数据为 `2026年5月9日5月14日`,可派生 `Arrival=2026/05/09``Departure=2026/05/14`
- 当前样表第 2 行表头中包含 `旅游日期`,第 3 行起数据为 `2026年5月9日5月14日`,可派生目标 Excel 展示值 `Arrival=09/05/2026``Departure=14/05/2026`
- CP2 暂不支持同一个文件中多批次、多旅游日期混合分房;如后续出现该真实场景,需要先设计按批次拆文件或按旅游日期分组生成多个 Sheet / 多个文件。
### 4.2 第二种来源样式:英文姓 + 英文名
@@ -409,7 +409,7 @@ RESERVATION_ROOMING_LIST_GENERATE
后端测试建议覆盖:
- 能识别 `护照全名` 表头。
- 能识别 `旅游日期` 表头,并把 `2026年5月9日5月14日` 解析为 `Arrival=2026/05/09``Departure=2026/05/14`
- 能识别 `旅游日期` 表头,并把 `2026年5月9日5月14日` 解析为目标 Excel 展示值 `Arrival=09/05/2026``Departure=14/05/2026`
- 能识别第二种来源样式 `英文姓` / `英文名` 表头。
- 第二种来源样式下 `英文姓=FENG``英文名=MINNA` 能生成 `Name=FENG``First Name=MINNA`
- 第二种来源样式下领队也进入房表,实际人数以后端读取到的有效名单行数为准。

View File

@@ -22,7 +22,7 @@ import org.springframework.stereotype.Component;
public class RoomingListExcelRenderer {
private static final DateTimeFormatter TARGET_DATE_FORMATTER =
DateTimeFormatter.ofPattern("yyyy/MM/dd");
DateTimeFormatter.ofPattern("dd/MM/yyyy");
private static final String[] HEADERS = {
"Line",
"Name",

View File

@@ -104,9 +104,9 @@ class ReservationRoomingListGenerationControllerTest {
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 3))
.isEmpty())
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 4))
.isEqualTo("2026/05/09"))
.isEqualTo("09/05/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 5))
.isEqualTo("2026/05/14"))
.isEqualTo("14/05/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 9))
.isEqualTo("2"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 10))
@@ -141,9 +141,9 @@ class ReservationRoomingListGenerationControllerTest {
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 2))
.isEqualTo("ONE"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 4))
.isEqualTo("2026/05/10"))
.isEqualTo("10/05/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 5))
.isEqualTo("2026/05/16"))
.isEqualTo("16/05/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 9))
.isEqualTo("2"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 13))
@@ -180,9 +180,9 @@ class ReservationRoomingListGenerationControllerTest {
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 2))
.isEqualTo("HAIYUN"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 4))
.isEqualTo("2026/08/03"))
.isEqualTo("03/08/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 5))
.isEqualTo("2026/08/08"))
.isEqualTo("08/08/2026"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 9))
.isEqualTo("3"))
.andExpect(result -> assertThat(workbookCell(result.getResponse().getContentAsByteArray(), 1, 13))

View File

@@ -61,8 +61,8 @@ class ReservationRoomingListGenerationServiceImplTest {
assertThat(cellText(firstRoom.getCell(1))).isEqualTo("LI");
assertThat(cellText(firstRoom.getCell(2))).isEqualTo("CHUNHONG");
assertThat(cellText(firstRoom.getCell(3))).isEmpty();
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("2026/05/09");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("2026/05/14");
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("09/05/2026");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("14/05/2026");
assertThat(cellText(firstRoom.getCell(6))).isEqualTo("UG1");
assertThat(cellText(firstRoom.getCell(7))).isEmpty();
assertThat(cellText(firstRoom.getCell(8))).isEqualTo("1");
@@ -146,8 +146,8 @@ class ReservationRoomingListGenerationServiceImplTest {
try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(generatedFile.content()))) {
Row firstRoom = workbook.getSheetAt(0).getRow(1);
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("2026/05/09");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("2026/05/14");
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("09/05/2026");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("14/05/2026");
}
}
@@ -164,8 +164,8 @@ class ReservationRoomingListGenerationServiceImplTest {
Row firstRoom = workbook.getSheetAt(0).getRow(1);
assertThat(cellText(firstRoom.getCell(1))).isEqualTo("ALPHA");
assertThat(cellText(firstRoom.getCell(2))).isEqualTo("ONE");
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("2026/05/10");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("2026/05/16");
assertThat(cellText(firstRoom.getCell(4))).isEqualTo("10/05/2026");
assertThat(cellText(firstRoom.getCell(5))).isEqualTo("16/05/2026");
assertThat(cellText(firstRoom.getCell(9))).isEqualTo("2");
assertThat(cellText(firstRoom.getCell(13))).isEqualTo("BRAVO TWO");
@@ -192,8 +192,8 @@ class ReservationRoomingListGenerationServiceImplTest {
assertThat(cellText(leaderRoom.getCell(0))).isEqualTo("1");
assertThat(cellText(leaderRoom.getCell(1))).isEqualTo("CAI");
assertThat(cellText(leaderRoom.getCell(2))).isEqualTo("HAIYUN");
assertThat(cellText(leaderRoom.getCell(4))).isEqualTo("2026/08/03");
assertThat(cellText(leaderRoom.getCell(5))).isEqualTo("2026/08/08");
assertThat(cellText(leaderRoom.getCell(4))).isEqualTo("03/08/2026");
assertThat(cellText(leaderRoom.getCell(5))).isEqualTo("08/08/2026");
assertThat(cellText(leaderRoom.getCell(9))).isEqualTo("3");
assertThat(cellText(leaderRoom.getCell(13))).isEqualTo("HUANG YUHENG, MA XIUHAN");