From e816810210f2b7b0c66a7f24747a63a34c0854e5 Mon Sep 17 00:00:00 2001 From: wx <2636507191@qq.com> Date: Sun, 26 Jul 2026 17:34:23 +0800 Subject: [PATCH] docs(changelog): hand off final-confirm itinerary SMS (#5263) --- ...¡®è®¤æŒ‰è½¦é€‰æ‹©å‘é€è¡Œç¨‹çŸ­ä¿¡-修改接å£-管ç†åŽå°.md | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 changelogs-v2/2026-07/26_5263_最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡-修改接å£-管ç†åŽå°.md diff --git a/changelogs-v2/2026-07/26_5263_最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-07/26_5263_最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡-修改接å£-管ç†åŽå°.md new file mode 100644 index 0000000..b30b6bb --- /dev/null +++ b/changelogs-v2/2026-07/26_5263_最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡-修改接å£-管ç†åŽå°.md @@ -0,0 +1,157 @@ +--- +schema: "hl-changelog/v2" +ticket: "5263" +title: "最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡" +consumer: "admin" +change_type: "修改接å£" +backend_status: "pending" +gateway_status: "pending" +frontend_status: "pending" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "åŽç«¯å·²åœ¨æœ€æ–° dev-v3 åŸºçº¿ä¸Šå®Œæˆæºç ä¸Žå…¨é‡æµ‹è¯•验è¯ï¼ŒPRã€æµ‹è¯•部署和网关实测尚待完æˆï¼›å‰ç«¯å°šæœªé¢†å–,owner/ref ä¿æŒä¸ºç©ºã€‚" +updated_at: "2026-07-26" +base: "dev-v3" +generated: "2026-07-26T17:33:00+08:00" +--- + +# 最终确认按车选择å‘é€è¡Œç¨‹çŸ­ä¿¡ + +## å…³è” + +- Issue: [wx/HL#5263](https://git.1814.love:8443/wx/HL/issues/5263) +- Changelog PR: [wx/hl-api-changelog#41](https://git.1814.love:8443/wx/hl-api-changelog/pulls/41) +- æœåŠ¡ï¼š`hl-fleet-service`ã€`hl-user-service` +- å‰ç«¯ä»“库:`mmg/hl-ui`(本文仅交接,ä¸ä»£è¡¨å·²ä¿®æ”¹å‰ç«¯ï¼‰ +- å‰ç½®è½¦è´¹å¥‘约:[#5262 æ´¾è½¦é€æ—¥è½¦è´¹ã€åªè¯»æ€»ä»·ä¸Žæ ¸å•实时接å£](./26_5262_æ´¾è½¦é€æ—¥è½¦è´¹ä¸Žæ ¸å•实时接å£-修改接å£-å‰ç«¯å¾…处ç†-管ç†åŽå°.md) + +## 关键å˜åŒ– + +1. 仅在 HOLD 排车的最终确认阶段,æ¯ä¸ªè½¦è¾†ç»„必须显å¼é€‰æ‹©â€œå‘é€çŸ­ä¿¡â€æˆ–“ä¸å‘é€çŸ­ä¿¡â€ï¼Œæ²¡æœ‰é»˜è®¤å€¼ã€‚ +2. 选择å‘逿—¶ï¼Œç¡®è®¤äº‹åŠ¡åªè½å¯é å‘逿„图;短信异步å‘é€å¤±è´¥ä¸ä¼šå›žæ»šå·²å®Œæˆçš„æ´¾è½¦ç¡®è®¤ã€‚ +3. 短信åªå‘给该车辆组当å‰å¸ˆå‚…,包å«è®¢å•摘è¦ã€æŽ¥é€æ‘˜è¦å’Œç­¾å行程短链,ä¸åŒ…å«å®¢æˆ·æ‰‹æœºå·ã€‚ +4. 选择ä¸å‘逿—¶åªå®Œæˆæ´¾è½¦ç¡®è®¤ï¼Œä¸åˆ›å»ºè¡Œç¨‹çŸ­ä¿¡äº‹ä»¶ã€‚ +5. 多车订å•é€è½¦ç‹¬ç«‹é€‰æ‹©ã€ç‹¬ç«‹æŠ•递ã€ç‹¬ç«‹æŸ¥è¯¢çжæ€å’Œå—控é‡è¯•。 +6. 已派定åŽçš„订å•äººæ•°åŸºçº¿å¤æ ¸åªèƒ½æ²¿ç”¨åŽŸé€‰æ‹©ï¼Œä¸å…è®¸å€Ÿå¤æ ¸ä¿®æ”¹é€‰æ‹©æˆ–é‡å¤å‘é€ã€‚ +7. 直接派车æµç¨‹ä¸å—å½±å“ï¼›#5262 已废弃的手工车辆总价入å‚ä»ç„¶ç¦æ­¢æäº¤ã€‚ + +## å˜æ›´æŽ¥å£ + +| 方法 | 路径 | å˜åŒ– | +| --- | --- | --- | +| `POST` | `/admin/fleet/assignments/:assignmentId/confirm` | 请求新增必填 `sendItinerarySms`ï¼›å“应新增短信选择ã€äº‹ä»¶ä¸ŽçŠ¶æ€ | +| `GET` | `/admin/fleet/assignments/:assignmentId/itinerary-sms` | 新增å•车/è½¦è¾†ç»„çŸ­ä¿¡å®¡è®¡çŠ¶æ€æŸ¥è¯¢ | +| `POST` | `/admin/fleet/assignments/:assignmentId/itinerary-sms/retry` | 新增明确失败åŽçš„è½¦åŠ¡å—æŽ§é‡è¯• | + +## 最终确认 + +### `POST /admin/fleet/assignments/:assignmentId/confirm` + +#### 请求字段 + +| 字段 | 类型 | å¿…å¡« | 说明 | +| --- | --- | --- | --- | +| `sendItinerarySms` | `Boolean` | 是 | `true` å‘é€ï¼›`false` ä¸å‘é€ï¼›çœç•¥æˆ– `null` è¿”å›žå‚æ•°é”™è¯¯ | +| `requestId` | `String` | 是 | 最长 64 字符的幂等请求标识 | +| `vehicleFeeTotal` | `Decimal` | å¦ | 历å²å…¼å®¹å­—段;éžç©ºå³æ‹’ç»ï¼Œæœ€ç»ˆæ€»è½¦è´¹ç»§ç»­ç”± #5262 逿—¥è½¦è´¹åªè¯»åˆè®¡ | +| `vehicleFeeAdjustmentReason` | `String` | å¦ | 历å²å…¼å®¹å­—段;éžç©ºå³æ‹’ç» | + +请求示例: + +```json +{ + "sendItinerarySms": true, + "requestId": "fleet-final-confirm-26-8411-car-1" +} +``` + +#### 新增å“应字段 + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `sendItinerarySms` | `Boolean` | 本车辆组最终确认时ä¿å­˜çš„选择 | +| `itinerarySmsEventId` | `String/null` | å¯é çŸ­ä¿¡äº‹ä»¶ IDï¼›ä¸å‘逿—¶ä¸ºç©º | +| `itinerarySmsStatus` | `String` | 首次确认返回 `PENDING` 或 `NOT_SENT`ï¼›å·²æ´¾å®šå¤æ ¸å›žæ˜¾çœŸå®žçŠ¶æ€ | + +## çŸ­ä¿¡çŠ¶æ€ + +### `GET /admin/fleet/assignments/:assignmentId/itinerary-sms` + +å“应 `data`: + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `assignmentId` | `String` | æ´¾å• ID | +| `assignmentGroupId` | `String` | è·¨æœåŠ¡æ—¥è½¦è¾†ç»„ ID | +| `assignmentSlotId` | `String` | ç¨³å®šè½¦è¾†æ§½ä½ ID | +| `sendItinerarySms` | `Boolean/null` | æœªæœ€ç»ˆç¡®è®¤æˆ–åŽ†å²æ•°æ®æ—¶ä¸º `null` | +| `status` | `String` | `NOT_APPLICABLE` / `NOT_SENT` / `PENDING` / `SENT` / `FAILED` / `CANCELED` | +| `eventId` | `String/null` | å¯é çŸ­ä¿¡äº‹ä»¶ ID | +| `retryCount` | `Integer` | å·²å‘生的失败é‡è¯•次数 | +| `canRetry` | `Boolean` | 当剿˜¯å¦å…è®¸å—æŽ§é‡è¯• | +| `sentAt` | `LocalDateTime/null` | 供应商确认的真实å‘逿—¶é—´ | +| `lastError` | `String/null` | 已脱æ•的最近失败或待对账原因 | + +å‰ç«¯ä»¥ `status` 为æƒå¨ï¼Œä¸å¾—ä»…å‡­æœ€ç»ˆç¡®è®¤æŽ¥å£æˆåŠŸå°±æ˜¾ç¤ºâ€œçŸ­ä¿¡å·²å‘é€â€ã€‚ + +## 嗿ާé‡è¯• + +### `POST /admin/fleet/assignments/:assignmentId/itinerary-sms/retry` + +请求: + +```json +{ + "reason": "短信通é“é…置已æ¢å¤ï¼Œè½¦åŠ¡ç¡®è®¤é‡å‘", + "requestId": "retry-sms-26-8411-car-1" +} +``` + +规则: + +- ä»… `FAILED` 且 `canRetry=true` 时展示并调用é‡è¯•。 +- `SENT`ã€`PENDING`ã€å¾…供应商对账ã€`CANCELED`ã€æœªé€‰æ‹©å‘逿—¶ç¦æ­¢é‡è¯•。 +- é‡è¯•å¤ç”¨åŽŸäº‹ä»¶ä¸Žä¾›åº”å•†å¹‚ç­‰é”®ï¼Œä¸æ–°å»ºå¹¶è¡ŒçŸ­ä¿¡äº‹ä»¶ã€‚ +- 叿œºæˆ–车辆组身份已å˜åŒ–时,旧事件收敛为 `CANCELED`,ä¸å¾—å‘给旧师傅。 + +## 短信与éšç§çº¦æŸ + +短信模æ¿å‚数固定为: + +| 傿•° | 内容 | +| --- | --- | +| `summary` | 脱æ•è®¢å•æ‘˜è¦ | +| `transfer` | æŽ¥é€æ‘˜è¦ | +| `code` | ç­¾å行程短链 | + +çŸ­ä¿¡æ­£æ–‡åŠæ¨¡æ¿å‚æ•°ä¸å¾—包å«å®¢æˆ·æ‰‹æœºå·ã€‚真实è”系人信æ¯ä»…在既有签å行程 H5 中按授æƒå±•示。 + +## 页é¢å±•示矩阵 + +| 区域/çŠ¶æ€ | æ•°æ®æº | 展示 | 空æ€/ç¦ç”¨ | 颜色 | 守æ’规则 | +| --- | --- | --- | --- | --- | --- | +| 最终确认车辆å¡ç‰‡ | 本地待æäº¤é€‰æ‹© | “å‘é€çŸ­ä¿¡â€/“ä¸å‘é€çŸ­ä¿¡â€äºŒé€‰ä¸€ | æœªé€‰æ‹©æ—¶ç¦æ­¢ç¡®è®¤å¹¶æç¤ºå¿…选 | å‘é€è“色,ä¸å‘é€ä¸­æ€§ç° | æ¯ä¸ªè½¦è¾†ç»„æ°å¥½ä¸€ä¸ªé€‰æ‹© | +| 确认åŽçŠ¶æ€ | `GET .../itinerary-sms.status` | å¾…å‘é€/å·²å‘é€/å‘é€å¤±è´¥/已喿¶ˆ/未å‘é€ | åŽ†å²æ•°æ®ä¸ºâ€œä¸é€‚用†| å¾…å‘é€è“ã€å·²å‘é€ç»¿ã€å¤±è´¥çº¢ã€å–消ç°ã€æœªå‘é€ä¸­æ€§ç° | ä¸ä»¥ç¡®è®¤æˆåŠŸå†’å……å‘逿ˆåŠŸ | +| 失败æ“作 | `canRetry` | “é‡è¯•短信†| `canRetry=false` æ—¶éšè—或ç¦ç”¨ | å¯é‡è¯•橙色 | åŒä¸€äº‹ä»¶ä¸²è¡Œé‡è¯• | +| å¤šè½¦è®¢å• | æ¯ä¸ª `assignmentGroupId` | æ¯è½¦ç‹¬ç«‹é€‰æ‹©ä¸ŽçŠ¶æ€ | ä¸åšè®¢å•级统一默认 | å„å¡ç‰‡ç‹¬ç«‹ | 一车选择ä¸å¾—覆盖å¦ä¸€è½¦ | + +## å‰ç«¯å¤„ç†æ¸…å• + +- [ ] 最终确认页按车辆组渲染无默认值的短信二选一。 +- [ ] 未完æˆé€‰æ‹©æ—¶ä¸æäº¤ç¡®è®¤è¯·æ±‚,并展示明确校验æç¤ºã€‚ +- [ ] ç¡®è®¤è¯·æ±‚å§‹ç»ˆæ˜¾å¼æäº¤ `sendItinerarySms`,ä¸å†ä¾èµ–åŽç«¯é»˜è®¤å€¼ã€‚ +- [ ] 确认åŽé€šè¿‡çŠ¶æ€æŽ¥å£å±•示真实投递状æ€ã€‚ +- [ ] 仅在 `FAILED && canRetry=true` æ—¶å…许填写原因并调用é‡è¯•。 +- [ ] å·²æ´¾å®šå¤æ ¸å›žæ˜¾åŽŸé€‰æ‹©å¹¶ä¿æŒåªè¯»ï¼Œä¸æä¾›æ”¹é€‰å…¥å£ã€‚ +- [ ] çŸ­ä¿¡çŠ¶æ€æŒ‰å±•示矩阵处ç†ç©ºæ€ã€é¢œè‰²åŠå¤šè½¦ç‹¬ç«‹æ€§ã€‚ +- [ ] ç¡®è®¤å’Œå¤æ ¸è¯·æ±‚ç»§ç»­ä¸æäº¤ #5262 已废弃的手工总车费字段。 + +## 验è¯è¯æ® + +- OpenAPI/oasdiff:`not_configured`ï¼›å·²å®Œæˆ Controller/VO æºç æ¯”å¯¹å’ŒæŽ¥å£æµ‹è¯•å›žé€€è¯æ®ã€‚ +- 消费者契约:`not_required`;未修改 internal Feign 或共享 Java DTO。 +- Fleet:`mvn -pl hl-fleet-service -am clean verify` 与 `spotless:check` 通过。 +- User:`mvn -pl hl-user-service -am verify` 通过。 +- `frontend_status`:`pending`;真实领å–åŽå†è¿ç§»ä¸º `claimed` 并填写 `frontend_owner`。