From c0d07a0db4c3a057f6437dcd3c6c79526b32ccc0 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Wed, 22 Jul 2026 10:33:02 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85=E8=BD=A6=E5=8A=A1?= =?UTF-8?q?=E6=B4=BE=E5=8D=95=E8=AF=A6=E6=83=85=E5=89=8D=E7=AB=AF=E5=A5=91?= =?UTF-8?q?=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...§å“行程节点与出行人-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md | 209 ++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 changelogs-v2/2026-07/79_车务派å•详情补全产å“行程节点与出行人-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md diff --git a/changelogs-v2/2026-07/79_车务派å•详情补全产å“行程节点与出行人-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md b/changelogs-v2/2026-07/79_车务派å•详情补全产å“行程节点与出行人-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md new file mode 100644 index 0000000..b8383b2 --- /dev/null +++ b/changelogs-v2/2026-07/79_车务派å•详情补全产å“行程节点与出行人-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md @@ -0,0 +1,209 @@ +# ã€ä¿®æ”¹æŽ¥å£Â·å‰ç«¯å¾…处ç†Â·ç®¡ç†åŽå°ã€‘车务派å•详情补全产å“ã€è¡Œç¨‹èŠ‚ç‚¹ä¸Žå‡ºè¡Œäºº + +> **æœåŠ¡**: hl-order-service-v3 + hl-fleet-service +> **日期**: 2026-07-22 +> **å½±å“范围**: 管ç†åŽå°è½¦åŠ¡ç®¡ç† / æ´¾è½¦çœ‹æ¿ / æ´¾å•弹窗 Step1「订å•详情〠+ +--- + +## 关键å˜åŒ– + +æ´¾å•弹窗 Step1 ä¸èƒ½å†åªå±•ç¤ºäººæ•°ã€æ—¥æœŸå’Œæ¯æ—¥ä¸€å¥ç®€ä»‹ã€‚`GET /admin/fleet/board/orders/{orderId}` 现一次返回: + +- `productName`:订å•产å“å(原字段,å‰ç«¯æœ¬æ¬¡å¿…须展示)。 +- `itinerary.days[].nodes[]`ï¼šæ¯æ—¥çœŸå®žè¡Œç¨‹èŠ‚ç‚¹ï¼Œå«å¼€å§‹æ—¶é—´ã€æ—¶æ®µã€æ—¶é•¿ã€å称和简介。 +- `travelers[]`:出行人脱æ•基本信æ¯ï¼Œä¸å«ç”Ÿæ—¥å’Œä»»ä½•明文字段。 +- `transport`:抵达ã€è¿”程åŠåˆ†æ‰¹å¤§äº¤é€šä¿¡æ¯ï¼ˆåŽŸå­—æ®µï¼Œå‰ç«¯æœ¬æ¬¡å¿…é¡»å®Œæ•´å±•ç¤ºæ—¶é—´å’Œç­æ¬¡ï¼Œä¸èƒ½åªæ˜¾ç¤ºç«™ç‚¹ï¼‰ã€‚ + +行程数æ®ä»ä»¥è®¢å•å½“å‰ `order_itinerary_day` å’Œ `order_itinerary_node` 为æƒå¨æºï¼Œç¦æ­¢ä»Žäº§å“模æ¿å推。 + +--- + +## å˜æ›´æŽ¥å£ + +```http +GET /admin/fleet/board/orders/{orderId} +``` + +å“应 VO:`BoardOrderDetailVO` + +### 新增字段 + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `itinerary.days[].nodes` | Array | 当日节点,按 `sortOrder` å‡åºï¼›æ— èŠ‚ç‚¹è¿”å›ž `[]` | +| `itinerary.days[].nodes[].nodeId` | String | 节点雪花 IDï¼Œå¿…é¡»æŒ‰å­—ç¬¦ä¸²å¤„ç† | +| `itinerary.days[].nodes[].nodeType` | String/null | 节点类型,如 `SCENIC`ã€`RESTAURANT`ã€`ACTIVITY`ã€`SERVICE`ã€`CUSTOM` | +| `itinerary.days[].nodes[].nodeName` | String/null | 节点展示å;节点å为空时åŽç«¯å›žé€€èµ„æºå | +| `itinerary.days[].nodes[].startTime` | String/null | å¼€å§‹æ—¶é—´ï¼Œæ ¼å¼ `HH:mm` | +| `itinerary.days[].nodes[].timePeriod` | String/null | 时段,如上åˆã€ä¸‹åˆã€å…¨å¤© | +| `itinerary.days[].nodes[].durationMinutes` | Number/null | 时长,å•ä½åˆ†é’Ÿ | +| `itinerary.days[].nodes[].description` | String/null | 节点简介 | +| `itinerary.days[].nodes[].sortOrder` | Number/null | åŒå¤©æŽ’åº | +| `travelers` | Array | 出行人脱æ•基本信æ¯ï¼›æ— å‡ºè¡Œäººæˆ–下游é™çº§æ—¶è¿”回 `[]` | +| `travelers[].travelerId` | String | 出行人雪花 IDï¼Œå¿…é¡»æŒ‰å­—ç¬¦ä¸²å¤„ç† | +| `travelers[].travelerType` | String/null | `ADULT` / `CHILD` / `YOUNG_CHILD` / `BABY` | +| `travelers[].nameMasked` | String/null | 脱æ•å§“å | +| `travelers[].gender` | String/null | 性别字典值 | +| `travelers[].ageAtDeparture` | Number/null | 按订å•å‡ºå‘æ—¥è®¡ç®—çš„å‘¨å² | +| `travelers[].idType` | String/null | è¯ä»¶ç±»åž‹å­—典值 | +| `travelers[].idNoMasked` | String/null | 脱æ•è¯ä»¶å· | +| `travelers[].phoneMasked` | String/null | è„±æ•æ‰‹æœºå· | +| `travelers[].nationality` | String/null | å›½ç± | +| `travelers[].emergencyContactMasked` | String/null | 脱æ•紧急è”系人姓å | +| `travelers[].emergencyPhoneMasked` | String/null | 脱æ•紧急è”ç³»äººç”µè¯ | +| `travelers[].profileStatus` | String/null | 资料状æ€ï¼š`PENDING` / `COMPLETED` | + +`productName` 是已有字段,结构ä¸å˜ï¼›æœ¬æ¬¡é¡µé¢å¿…须消费,ä¸å†åªä¿å­˜åœ¨ `normalizeBoardOrder().product` 而ä¸å±•示。 + +### 已有但本次必须完整展示的大交通字段 + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `transport.arrive` | Object/null | 抵达接团段 | +| `transport.arrive.transportNo` | String/null | 抵达航ç­å·/è½¦æ¬¡å· | +| `transport.arrive.time` | String/null | 抵达时间,ISO `LocalDateTime` | +| `transport.arrive.station` | String/null | 抵达机场/车站 | +| `transport.arrive.remark` | String/null | 抵达备注 | +| `transport.depart` | Object/null | 返程é€ç«™æ®µ | +| `transport.depart.transportNo` | String/null | 返程航ç­å·/è½¦æ¬¡å· | +| `transport.depart.time` | String/null | 返程时间,ISO `LocalDateTime` | +| `transport.depart.station` | String/null | 返程机场/车站 | +| `transport.depart.remark` | String/null | 返程备注 | +| `transport.batches` | Array | 分批接é€åˆ—表 | +| `transport.batches[].travelerNames` | String/null | æœ¬æ‰¹å‡ºè¡Œäººå§“åæ‘˜è¦ | +| `transport.batches[].transportNo` | String/null | 本批航ç­å·/è½¦æ¬¡å· | +| `transport.batches[].time` | String/null | 本批抵达/返程时间 | +| `transport.batches[].station` | String/null | 本批机场/车站 | +| `transport.transferTimeHint` | String/null | 无任何大交通时间时的åŽç«¯æç¤ºï¼Œå½“å‰ä¸ºâ€œæš‚æ— æŽ¥é€æœºæ—¶é—´â€ | +| `transport.pickupRequired` | Boolean/null | 是å¦éœ€è¦å¹³å°æ´¾è½¦æŽ¥é€ | + +### å“应示例 + +```json +{ + "code": 200, + "data": { + "orderNo": "HL20260721171011648", + "productName": "è‰åŽŸäº²å­ä¸‰æ—¥æ¸¸", + "itinerary": { + "theme": "è‰åŽŸäº²å­ä¸‰æ—¥æ¸¸", + "route": null, + "days": [ + { + "dayNumber": 1, + "date": "2026-07-29", + "title": "接机", + "detail": "抵达åŽå…¥ä½é…’店", + "nodes": [ + { + "nodeId": "2001", + "nodeType": "SERVICE", + "nodeName": "海拉尔机场接机", + "startTime": "10:30", + "timePeriod": "上åˆ", + "durationMinutes": 60, + "description": "叿œºä¸¾ç‰ŒæŽ¥æœº", + "sortOrder": 1 + } + ] + } + ] + }, + "travelers": [ + { + "travelerId": "3001", + "travelerType": "ADULT", + "nameMasked": "å­”**", + "gender": "2", + "ageAtDeparture": 35, + "idType": "ID_CARD", + "idNoMasked": "150***********1234", + "phoneMasked": "138****1234", + "nationality": "中国", + "emergencyContactMasked": "王*", + "emergencyPhoneMasked": "139****5678", + "profileStatus": "COMPLETED" + } + ], + "transport": { + "transferTimeHint": null, + "arrive": { + "transportNo": "CA1234", + "time": "2026-07-29T10:30:00", + "station": "海拉尔东山国际机场", + "remark": "T2 出å£ä¸¾ç‰ŒæŽ¥æœº" + }, + "depart": { + "transportNo": "CA5678", + "time": "2026-07-31T17:20:00", + "station": "海拉尔东山国际机场", + "remark": "æå‰ 2 å°æ—¶é€è¾¾" + }, + "batches": [], + "pickupRequired": true + } + }, + "success": true +} +``` + +--- + +## å‰ç«¯é¡µé¢è°ƒæ•´è¦æ±‚ + +目标文件:`src/views/fleet/board/components/Step1OrderDetail.vue`。 + +1. é¡¶éƒ¨è®¢å•æ‘˜è¦å±•示产å“åï¼Œè¯»å– `order.productName || order.product`;产å“åä¸ºç©ºæ‰æ˜¾ç¤º `—`。 +2. åœ¨é¡¶éƒ¨è®¢å•æ‘˜è¦ä¸‹å¢žåŠ â€œå¤§äº¤é€šâ€ä¿¡æ¯å¡ï¼ŒæŠµè¾¾ä¸Žè¿”程分æ å±•示 `transportNo + time + station + remark`: + - 时间使用完整月日和时分,ä¸åªå±•示日期。 + - `arrive`ã€`depart` ç‹¬ç«‹åˆ¤ç©ºï¼Œåªæœ‰ä¸€æ®µæ—¶ä»æ­£å¸¸å±•示该段。 + - `batches[]` éžç©ºæ—¶å¢žåŠ â€œåˆ†æ‰¹æŽ¥é€â€ï¼Œå±•示本批出行人ã€ç­æ¬¡ã€æ—¶é—´å’Œç«™ç‚¹ã€‚ + - 无任何时间时展示 `transport.transferTimeHint`,ä¸å¾—ä¼ªé€ èˆªç­æˆ–时间。 + - 当å‰é¡¶éƒ¨â€œæŽ¥é€â€ç»Ÿè®¡å¯ä¿ç•™ç«™ç‚¹æ‘˜è¦ï¼Œä½†ä¸èƒ½æ›¿ä»£å¤§äº¤é€šè¯¦æƒ…å¡ã€‚ +3. å·¦ä¾§â€œæ¯æ—¥å®‰æŽ’â€ä¿ç•™æ—¥æ ‡é¢˜å’Œ `detail`,并在æ¯ä¸€å¤©ä¸‹é¢æ¸²æŸ“ `nodes[]`: + - 时间优先显示 `startTime`,为空时显示 `timePeriod`,两者都有å¯ç»„åˆå±•示。 + - 主文案显示 `nodeName`。 + - `durationMinutes` 有值时显示易读时长。 + - `description` 有值且与日简介ä¸é‡å¤æ—¶æ˜¾ç¤ºèŠ‚ç‚¹ç®€ä»‹ã€‚ +4. å³ä¾§æ–°å¢žâ€œå‡ºè¡Œäººä¿¡æ¯â€åŒºï¼Œé»˜è®¤å±•示脱æ•å§“åã€äººå‘˜ç±»åž‹ã€æ€§åˆ«ã€å‡ºå‘时年龄ã€è„±æ•手机å·å’Œèµ„料状æ€ï¼›è¯ä»¶/紧急è”系人å¯åœ¨è¡Œå†…展开或次è¦ä¿¡æ¯åŒºå±•示。 +5. ç¦æ­¢ä¸ºäº†å±•示此页é¢è°ƒç”¨æ˜Žæ–‡æŽ¥å£ `POST /admin/fleet/board/orders/{orderId}/travelers/plain`。Step1 åªä½¿ç”¨è¯¦æƒ…å“åº”ä¸­çš„è„±æ• `travelers[]`。 +6. ç©ºæ€æ˜Žç¡®ï¼šæ— èŠ‚ç‚¹æ˜¾ç¤ºâ€œæš‚æ— è¡Œç¨‹èŠ‚ç‚¹â€ï¼Œæ— å‡ºè¡Œäººæ˜¾ç¤ºâ€œæš‚未填写出行人信æ¯â€ï¼›ä¸å¾—ç”Ÿæˆæ¨¡æ‹ŸèŠ‚ç‚¹æˆ–æ¨¡æ‹Ÿå‡ºè¡Œäººã€‚ +7. 雪花 ID ç¦æ­¢ `Number()` / `parseInt()`,统一按字符串处ç†ã€‚ + +推è布局:顶部摘è¦ä¸‹æ”¾æ¨ªå‘“大交通â€å¡ï¼›å·¦æ ç»§ç»­æ‰¿è½½é€æ—¥èŠ‚ç‚¹æ—¶é—´çº¿ï¼›å³æ é¡ºåºä¸ºâ€œå‡ºè¡Œäººä¿¡æ¯ → 客人留言 → ç‰¹æ®Šè¦æ±‚ → æ“作记录â€ã€‚ + +--- + +## 兼容与é™çº§ + +- 仅新增å“应字段,ä¸ä¿®æ”¹è¯·æ±‚傿•°ï¼Œä¸å½±å“旧调用方。 +- 历å²è¡Œç¨‹æ²¡æœ‰èŠ‚ç‚¹æ—¶ `nodes=[]`ï¼Œæ¯æ—¥æ ‡é¢˜å’Œç®€ä»‹ä»ç…§å¸¸è¿”回。 +- order-v3 èšåˆä¸Šä¸‹æ–‡å¤±è´¥å¹¶å›žé€€ fleet 本地快照时,`relatedDetailReady=false`,`travelers=[]`,行程节点ä¸å¯ç”¨ï¼›å‰ç«¯æ˜¾ç¤ºçœŸå®žç©ºæ€ã€‚ +- åŽŸç‹¬ç«‹è„±æ•æŽ¥å£ `GET /admin/fleet/board/orders/{orderId}/travelers` ä¿ç•™å…¼å®¹ï¼Œä½†æ­¤é¡µé¢æ— éœ€å†å‘第二次请求。 +- ä¸è¿”回 `birthday`ã€æ˜Žæ–‡å§“åã€æ˜Žæ–‡è¯ä»¶å·ã€æ˜Žæ–‡æ‰‹æœºå·æˆ–明文紧急è”系人。 + +--- + +## éªŒæ”¶æ¸…å• + +- [ ] 顶部å¯çœ‹åˆ°è®¢å•产å“å。 +- [ ] 大交通å¡åˆ†åˆ«å±•示抵达/è¿”ç¨‹çš„ç­æ¬¡ã€å®Œæ•´æ—¶é—´ã€ç«™ç‚¹å’Œå¤‡æ³¨ã€‚ +- [ ] æœ‰åˆ†æ‰¹æŽ¥é€æ—¶å±•ç¤ºæ¯æ‰¹å‡ºè¡Œäººã€ç­æ¬¡ã€æ—¶é—´å’Œç«™ç‚¹ï¼›æ— å¤§äº¤é€šæ—¶é—´æ—¶å±•示真实空æ€ã€‚ +- [ ] æ¯æ—¥å®‰æŽ’按节点顺åºå±•示时间ã€èŠ‚ç‚¹åã€æ—¶é•¿å’Œç®€ä»‹ã€‚ +- [ ] 节点无 `startTime` æ—¶å¯å›žé€€æ˜¾ç¤º `timePeriod`,ä¸ä¼šå‡ºçް `undefined`。 +- [ ] å³ä¾§å¯çœ‹åˆ°å…¨éƒ¨å‡ºè¡Œäººçš„脱æ•基本信æ¯ã€‚ +- [ ] 无节点/无出行人时展示真实空æ€ï¼Œä¸ç”Ÿæˆæ¨¡æ‹Ÿæ•°æ®ã€‚ +- [ ] é¡µé¢ Network åªéœ€çŽ°æœ‰è¯¦æƒ…è¯·æ±‚ï¼Œä¸è°ƒç”¨å‡ºè¡Œäººæ˜Žæ–‡æŽ¥å£ã€‚ +- [ ] 现有留言ã€ç‰¹æ®Šè¦æ±‚ã€æ­¥éª¤æ¡å’Œæ“作记录ä¸å—å½±å“。 + +--- + +## åŽç«¯éªŒè¯è®°å½• + +- `ItineraryServiceTest`:覆盖节点åç§°ã€å¼€å§‹æ—¶é—´ã€æ—¶æ®µã€æ—¶é•¿ã€ç®€ä»‹å’ŒæŽ’åºè£…é…。 +- `OrderFleetProviderServiceTest`:覆盖节点éšå½“å‰è®¢å•日期对é½ä¸”出行人脱æ•进入èšåˆä¸Šä¸‹æ–‡ã€‚ +- `BoardOrderServiceTest`:覆盖 shared DTO 到管ç†ç«¯ VO 的节点和出行人映射。 +- `BoardControllerTest`:覆盖 `productName`ã€èŠ‚ç‚¹æ—¶é—´ã€String ID 与脱æ•出行人的 JSON 契约。 + +> 本文是å‰ç«¯æŽ¥å…¥é€šçŸ¥ï¼Œä¸ä»£è¡¨å·²ä¿®æ”¹æˆ–å‘布 `mmg/hl-ui`。