From 9b32c2e2e0a9778453e3f9f12a83a3436ac29147 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Thu, 23 Jul 2026 17:06:15 +0800 Subject: [PATCH] docs(fleet): specify mobile itinerary link copy flow --- ...¦ä¸­è®¢å•æ¢å¤æ´¾è½¦æ´¾äººå…¥å£-修改接å£-管ç†åŽå°.md | 70 ++++++++++++++++--- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/changelogs-v2/2026-07/23_5186_æŽ’è½¦ä¸­è®¢å•æ¢å¤æ´¾è½¦æ´¾äººå…¥å£-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-07/23_5186_æŽ’è½¦ä¸­è®¢å•æ¢å¤æ´¾è½¦æ´¾äººå…¥å£-修改接å£-管ç†åŽå°.md index 30d8e76..82e0ce1 100644 --- a/changelogs-v2/2026-07/23_5186_æŽ’è½¦ä¸­è®¢å•æ¢å¤æ´¾è½¦æ´¾äººå…¥å£-修改接å£-管ç†åŽå°.md +++ b/changelogs-v2/2026-07/23_5186_æŽ’è½¦ä¸­è®¢å•æ¢å¤æ´¾è½¦æ´¾äººå…¥å£-修改接å£-管ç†åŽå°.md @@ -103,22 +103,66 @@ generated: "2026-07-23T16:10:00+08:00" - `confirmHold` æ ¹æ®åŽç«¯ `stageCode/driverConfirmedAt` æ¢å¤æµç¨‹ï¼šç­‰å¾…叿œºå›žå¤æ—¶è¿›å…¥ç¬¬ 3 步“待确认â€ï¼Œå·²ç™»è®°å¸æœºç¡®è®¤æ—¶è¿›å…¥ç¬¬ 4 步“确认执行â€ï¼› - `availableActionCodes` åŒ…å« `CHANGE_ASSIGNMENT` æ—¶å¦è¡Œæ˜¾ç¤ºâ€œæ”¹æ´¾â€ï¼Œç‚¹å‡»è¿›å…¥ç¬¬ 2 æ­¥é‡æ–°é€‰æ‹©è½¦è¾†æˆ–叿œºï¼› - 两个按钮ä¸å¾—äº’ç›¸æ›¿ä»£ï¼šâ€œç»§ç»­æ´¾è½¦â€æŽ¨è¿›å½“å‰æœ‰æ•ˆæ´¾å•,“改派â€ä¿®æ”¹å½“剿œ‰æ•ˆæ´¾å•ï¼› -- “打å°è¡Œç¨‹å•â€æ˜¯ç‹¬ç«‹åªè¯»èƒ½åŠ›ï¼Œç›´æŽ¥å¤ç”¨è®¢å•详情现有打å°é¢„览,ä¸å‚与派å•çŠ¶æ€æµè½¬ã€‚ +- “å¤åˆ¶è¡Œç¨‹å•é“¾æŽ¥â€æ˜¯ç‹¬ç«‹åªè¯»èƒ½åŠ›ï¼Œå¤åˆ¶åŽç«¯ä¸ºå½“剿œ‰æ•ˆæ´¾å•ç­¾å‘çš„å¸æœº H5 链接,ä¸å‚与派å•çŠ¶æ€æµè½¬ã€‚ å½“å‰ `v2.1@6e6a11bf` çš„ `resolveBoardRowActions()` 仿£€æŸ¥å·²ç»åºŸå¼ƒçš„ `CONFIRM` 动作ç ï¼Œè€ŒåŽç«¯ç”Ÿå‘½å‘¨æœŸå®žé™…ä¸‹å‘ `RECORD_DRIVER_CONFIRMATION`,因此截图中“继续派车/叿œºå·²ç¡®è®¤â€æŒ‰é’®æ²¡æœ‰æ¸²æŸ“。å‰ç«¯æ”¹ä¸ºæ¶ˆè´¹çœŸå®žåŠ¨ä½œç å³å¯ï¼Œæ— éœ€åŽç«¯å¢žåŠ å…¼å®¹åˆ«å。 -### 看æ¿å¤ç”¨â€œæ‰“å°è¡Œç¨‹å•†+### 看æ¿å¤åˆ¶å¸æœº H5 行程å•链接 -看æ¿ä¸å†ç»´æŠ¤ç‹¬ç«‹çš„“å‘行程å•â€æŠ½å±‰ï¼Œä¹Ÿä¸åœ¨å‰ç«¯æ¨¡æ‹Ÿå‘逿ˆåŠŸã€‚è®¢å•è¯¦æƒ…å·²ç»æä¾›å®Œæ•´ä¸”æƒå¨çš„æ‰“å°èƒ½åŠ›ï¼Œçœ‹æ¿åªå¢žåŠ åŒèƒ½åЛ入å£ï¼š +看æ¿ä¸å†ç»´æŠ¤ç‹¬ç«‹çš„“å‘行程å•â€æŠ½å±‰ï¼Œä¹Ÿä¸åœ¨å‰ç«¯æ¨¡æ‹Ÿå‘逿ˆåŠŸã€‚è¿™é‡Œä¸æ˜¯æ‰“开订å•详情的“打å°è¡Œç¨‹å•â€ï¼Œè€Œæ˜¯æŠŠåŽç«¯å·²ç»ä¸ºå½“剿œ‰æ•ˆæ´¾å•ç­¾å‘çš„ H5 链接å¤åˆ¶åˆ°å‰ªè´´æ¿ï¼Œè½¦åŠ¡å†é€šè¿‡å¾®ä¿¡ç­‰æ¸ é“å‘ç»™å¸æœºã€‚叿œºå¯åœ¨æ‰‹æœºæµè§ˆå™¨ä¸­ç‹¬ç«‹æ‰“开,ä¸éœ€è¦ç™»å½•管ç†åŽå°ã€‚ -- å°†çœ‹æ¿æŒ‰é’®æ–‡æ¡ˆç”±â€œå‘行程å•â€æ”¹ä¸ºâ€œæ‰“å°è¡Œç¨‹å•â€ï¼› -- 直接å¤ç”¨ `src/views/order-v2/detail/modals/PrintItineraryModal.vue`ï¼› -- 继续调用既有 `getPrintItinerary(orderId)`ï¼Œå³ `GET /v3/admin/order/{orderId}/print-itinerary`ï¼› -- `orderId` 使用 `resolveBoardOrderId(order)` çš„å­—ç¬¦ä¸²ç»“æžœï¼Œç¦æ­¢ä¼ å›¢å·ã€è®¢å•å·æˆ–åš `Number()` 转æ¢ï¼› +- å°†çœ‹æ¿æŒ‰é’®æ–‡æ¡ˆç”±â€œå‘行程å•â€æ”¹ä¸ºâ€œå¤åˆ¶è¡Œç¨‹å•链接â€ï¼Œäº‹ä»¶ååŒæ­¥æ”¹ä¸º `copy-itinerary-link`,é¿å…继续表达æˆâ€œå‘é€â€ï¼› +- 点击时先调用既有看æ¿è¯¦æƒ…æŽ¥å£ `GET /admin/fleet/board/orders/{orderId}`,ä¸è¦è°ƒç”¨è®¢å•æ‰“å°æŽ¥å£ï¼› +- 默认å¤åˆ¶ `currentAssignment.itineraryUrl`ï¼›å¦‚æžœå…¥å£æ˜Žç¡®é’ˆå¯¹æŸä¸€æ¡æœ‰æ•ˆæ´¾å•,则å¤åˆ¶å¯¹åº” `activeAssignments[].itineraryUrl`ï¼› +- 链接必须直接使用åŽç«¯è¿”回值,å‰ç«¯ä¸å¾—自行拼接 H5 地å€ã€tokenã€è®¢å• ID æˆ–æ´¾å• IDï¼› +- 优先使用 `navigator.clipboard.writeText(itineraryUrl)`;当å‰ç®¡ç†åŽå°å¯èƒ½è¿è¡Œåœ¨ HTTP å†…ç½‘çŽ¯å¢ƒï¼Œå¿…é¡»åŒæ—¶æä¾›ä¸´æ—¶ `textarea + document.execCommand('copy')` é™çº§å®žçŽ°ï¼› +- å¤åˆ¶æˆåŠŸæç¤ºâ€œè¡Œç¨‹å•链接已å¤åˆ¶ï¼Œå¯å‘é€ç»™å¸æœºâ€ï¼› +- `itineraryUrl` 为空时ä¸å¾—å¤åˆ¶æˆ–æç¤ºæˆåŠŸï¼Œåº”æç¤ºâ€œè¡Œç¨‹å•链接暂ä¸å¯ç”¨ï¼Œè¯·ç¡®è®¤å·²æ´¾è½¦ä¸” H5 é…置正常â€ï¼› - 删除/åœç”¨çœ‹æ¿è‡ªå·±çš„ `ItinerarySendSheet.vue`ã€æ¶ˆæ¯æ¨¡æ¿å’Œæœ¬åœ° `message.success('å·²å‘é€è¡Œç¨‹å•')` 凿µç¨‹ï¼› -- 打å°å†…容ã€å½©è‰²/黑白切æ¢ã€åŠ è½½å¤±è´¥é‡è¯•ã€æƒé™å’ŒåŽç«¯æ•°æ®æºä¸Žè®¢å•详情完全一致,åŽç»­åªç»´æŠ¤ä¸€å¥—。 +- ä¸å¤ç”¨ `PrintItineraryModal.vue`,ä¸è°ƒç”¨ `GET /v3/admin/order/{orderId}/print-itinerary`;订å•详情的“打å°è¡Œç¨‹å•â€ç»§ç»­ä½œä¸ºé¢å‘车务的独立打å°èƒ½åŠ›ä¿ç•™ï¼› +- 链接包å«ç­¾å token,å‰ç«¯æ—¥å¿—ã€åŸ‹ç‚¹å’Œé”™è¯¯æç¤ºä¸å¾—记录或展示完整 URLï¼› +- 改派æˆåŠŸåŽå¿…须釿–°æ‹‰å–详情并使用新派å•çš„ `itineraryUrl`,ä¸èƒ½ç»§ç»­ç¼“存或å¤åˆ¶æ—§æ´¾å•链接。 -该打å°å…¥å£ä¸æ”¹å˜æ´¾å•状æ€ï¼Œä¹Ÿä¸ä¾èµ–订å•处于待派车ã€å¾…确认或已派车;是å¦å±•ç¤ºåªæŒ‰è®¢å•æ‰“å°æƒé™å’Œæœ‰æ•ˆè®¢å• ID 判断。 +åŽç«¯é“¾æŽ¥å·²ç»‘定当å‰è®¢å•与具体派å•,有效期至行程结æŸåŽ 7 天;公开 H5 接å£ä¼šæ ¡éªŒç­¾åã€æœ‰æ•ˆæœŸå’Œæ´¾å•归属,并实时读å–行程数æ®ã€‚å¤åˆ¶åŠ¨ä½œæœ¬èº«ä¸æ”¹å˜æ´¾å•状æ€ï¼Œä¹Ÿä¸äº§ç”Ÿâ€œå·²å‘é€â€è®°å½•。 + +建议å‰ç«¯æŒ‰ä»¥ä¸‹é€»è¾‘è½åœ°ï¼ˆå‡½æ•°å坿Œ‰çŽ°æœ‰å·¥ç¨‹è°ƒæ•´ï¼‰ï¼š + +```ts +async function onCopyItineraryLink(order: BoardOrder) { + const orderId = resolveBoardOrderId(order) + const detail = await getBoardOrderDetail(orderId) + const itineraryUrl = detail.currentAssignment?.itineraryUrl?.trim() + + if (!itineraryUrl) { + message.error('行程å•链接暂ä¸å¯ç”¨ï¼Œè¯·ç¡®è®¤å·²æ´¾è½¦ä¸” H5 é…置正常') + return + } + + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(itineraryUrl) + } else { + copyTextByTextarea(itineraryUrl) + } + message.success('行程å•链接已å¤åˆ¶ï¼Œå¯å‘é€ç»™å¸æœº') + } catch { + message.error('å¤åˆ¶å¤±è´¥ï¼Œè¯·ç¨åŽé‡è¯•') + } +} + +function copyTextByTextarea(text: string) { + const textarea = document.createElement('textarea') + textarea.value = text + textarea.setAttribute('readonly', '') + textarea.style.position = 'fixed' + textarea.style.opacity = '0' + document.body.appendChild(textarea) + textarea.select() + const copied = document.execCommand('copy') + document.body.removeChild(textarea) + if (!copied) throw new Error('copy failed') +} +``` ## 三ã€ä¸å½±å“范围 @@ -136,8 +180,12 @@ generated: "2026-07-23T16:10:00+08:00" - [ ] 技术状æ€å€¼ä»ä¸º `holding`,改派ã€å¸æœºç¡®è®¤å’Œè¶…时判断ä¸å› æ–‡æ¡ˆå˜åŒ–而改å˜ã€‚ - [ ] 待确认订å•在 `RECORD_DRIVER_CONFIRMATION` å¯ç”¨æ—¶æ˜¾ç¤ºâ€œç»§ç»­æ´¾è½¦â€ï¼Œç‚¹å‡»ä»¥ `confirmHold` æ¢å¤ç¬¬ 3/4 步。 - [ ] “继续派车â€å’Œâ€œæ”¹æ´¾â€åŒæ—¶å­˜åœ¨ä¸”èŒè´£åˆ†ç¦»ï¼›å‰ç«¯ä¸å†æ£€æŸ¥ä¸å­˜åœ¨çš„ `CONFIRM` 动作ç ã€‚ -- [ ] çœ‹æ¿æ˜¾ç¤ºâ€œæ‰“å°è¡Œç¨‹å•â€ï¼Œæ‰“开内容与订å•详情的打å°é¢„览完全一致。 -- [ ] 看æ¿ä¸å†ä½¿ç”¨ `ItinerarySendSheet` 或模拟“已å‘é€è¡Œç¨‹å•â€ï¼ŒNetwork åªè°ƒç”¨æ—¢æœ‰æ‰“尿ޥå£ã€‚ +- [ ] å¾…ç¡®è®¤æˆ–å·²æ´¾è½¦ä¸”å­˜åœ¨å½“å‰æœ‰æ•ˆæ´¾å•æ—¶ï¼Œçœ‹æ¿æ˜¾ç¤ºâ€œå¤åˆ¶è¡Œç¨‹å•链接â€ã€‚ +- [ ] 点击åŽé€šè¿‡çœ‹æ¿è¯¦æƒ…å–å¾—å¹¶å¤åˆ¶ `currentAssignment.itineraryUrl`,ä¸è°ƒç”¨è®¢å•æ‰“å°æŽ¥å£ã€ä¸åœ¨å‰ç«¯æ‹¼æŽ¥é“¾æŽ¥ã€‚ +- [ ] HTTPS/localhost 使用 Clipboard API,HTTP 内网环境å¯é€šè¿‡é™çº§æ–¹æ¡ˆæ­£å¸¸å¤åˆ¶ã€‚ +- [ ] å¤åˆ¶æˆåŠŸæç¤ºâ€œè¡Œç¨‹å•链接已å¤åˆ¶ï¼Œå¯å‘é€ç»™å¸æœºâ€ï¼›é“¾æŽ¥ä¸ºç©ºæˆ–å¤åˆ¶å¤±è´¥æ—¶ç»™å‡ºæ˜Žç¡®é”™è¯¯ä¸”ä¸è¯¯æŠ¥æˆåŠŸã€‚ +- [ ] å¤åˆ¶å‡ºçš„链接å¯ç”±å¸æœºåœ¨æ‰‹æœºæµè§ˆå™¨ä¸­ç‹¬ç«‹æ‰“开,无需登录管ç†åŽå°ï¼Œå¹¶å±•ç¤ºå½“å‰æ´¾å•的实时行程。 +- [ ] 看æ¿ä¸å†ä½¿ç”¨ `ItinerarySendSheet` 或模拟“已å‘é€è¡Œç¨‹å•â€ï¼Œæ”¹æ´¾åŽä¸ä¼šå¤åˆ¶æ—§æ´¾å•链接。 - [ ] æ‰“å¼€æŽ’è½¦æ­¥éª¤æ—¶ï¼Œå€™é€‰è¯·æ±‚åŒæ—¶æºå¸¦å­—符串 `orderId`ã€`requirementId` å’Œå½“å‰ `fleetItemIndex`,ä¸å†å‡ºçŽ°â€œæ”¹æ´¾å€™é€‰æŸ¥è¯¢å¿…é¡»æºå¸¦å½“å‰è®¢å•IDã€ç”¨è½¦éœ€æ±‚ID和车型项索引â€ã€‚ - [ ] æäº¤æ—¶è°ƒç”¨æ—¢æœ‰ `changeAssignment`,ä¸è°ƒç”¨åˆ›å»ºæ´¾å•接å£ã€‚ - [ ] `assigned`ã€`completed`ã€`canceled` ä¸è¯¯æ˜¾ç¤ºå…¥å£ã€‚