From 31e2bc4fec36c161969ccc002fdff79e99d6ee87 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Mon, 6 Jul 2026 09:32:59 +0800 Subject: [PATCH] docs: add fleet insurance API handoff --- ...¦åŠ¡èœå•全接å£éªŒæ”¶ä¸Žå‰ç«¯å¥‘约收å£-管ç†åŽå°.md | 8 +- ...¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约-管ç†åŽå°.md | 318 ++++++++++++++++++ 2 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 changelogs-v2/2026-07/26_4760_è½¦åŠ¡å¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约-管ç†åŽå°.md diff --git a/changelogs-v2/2026-07/25_4756_车务èœå•全接å£éªŒæ”¶ä¸Žå‰ç«¯å¥‘约收å£-管ç†åŽå°.md b/changelogs-v2/2026-07/25_4756_车务èœå•全接å£éªŒæ”¶ä¸Žå‰ç«¯å¥‘约收å£-管ç†åŽå°.md index a4fac82..6d936ce 100644 --- a/changelogs-v2/2026-07/25_4756_车务èœå•全接å£éªŒæ”¶ä¸Žå‰ç«¯å¥‘约收å£-管ç†åŽå°.md +++ b/changelogs-v2/2026-07/25_4756_车务èœå•全接å£éªŒæ”¶ä¸Žå‰ç«¯å¥‘约收å£-管ç†åŽå°.md @@ -22,7 +22,7 @@ | 场景 | å‰ç«¯å¤„ç† | |------|----------| | 当å‰è§’色 | 车务èœå•åªèƒ½ç”± `VEHICLE_MANAGER` 或 `SUPER_ADMIN` 访问;`wx/CUSTOMIZER` 访问 `/admin/fleet/**` 返回 `403`,æç¤ºåˆ‡æ¢è½¦åŠ¡è§’è‰²ã€‚ | -| 叿œºç»“ç®—æ–¹å¼ | 叿œºæ–°å¢ž/编辑/导入使用字典 `driver_settlement_mode`:`direct`=直接结算,`fleet_leader`=车队长结算。 | +| 叿œºç»“ç®—æ–¹å¼ | 叿œºæ–°å¢ž/编辑/导入使用字典 `driver_settlement_mode`:`direct`=直接结算,`captain`=车队长结算。 | | 待审核详情 ID | `GET /admin/fleet/drivers/pending/{pendingId}` å“应主键字段是 `id`ï¼Œä¸æ˜¯ `pendingId`;路径å˜é‡ä»å« `pendingId`。 | | æ´¾å•é‡å¤ç¡®è®¤ | `POST /admin/fleet/assignments/{assignmentId}/confirm` åªå…许 `holding -> assigned`ï¼›éž `holding` 返回 `605020`。 | | å–æ¶ˆé‡å¤æ“作 | ç»ˆæ€æ´¾å•冿¬¡å–消也返回 `605020`。 | @@ -737,7 +737,7 @@ PUT /admin/fleet/drivers/{driverId} "preferredTypeKey": "suv", "preferredModel": "SUV", "vehicleSource": "company", - "settlementMode": "fleet_leader", + "settlementMode": "captain", "license": { "no": "L6966520260705", "type": "C1", @@ -762,7 +762,7 @@ PUT /admin/fleet/drivers/{driverId} "phone": "199****9999", "driverStatus": "idle", "season": "active", - "settlementMode": "fleet_leader", + "settlementMode": "captain", "license": { "no": "L6966520260705", "type": "C1", "expire": "2035-12-31" }, "insurance": { "type": "none" }, "tags": ["API_TEST_FLEET_FULL"] @@ -775,7 +775,7 @@ PUT /admin/fleet/drivers/{driverId} | 值 | 展示 | |----|------| | `direct` | 直接结算 | -| `fleet_leader` | 车队长结算 | +| `captain` | 车队长结算 | éžæ³•值å“应: diff --git a/changelogs-v2/2026-07/26_4760_è½¦åŠ¡å¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约-管ç†åŽå°.md b/changelogs-v2/2026-07/26_4760_è½¦åŠ¡å¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约-管ç†åŽå°.md new file mode 100644 index 0000000..a100400 --- /dev/null +++ b/changelogs-v2/2026-07/26_4760_è½¦åŠ¡å¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约-管ç†åŽå°.md @@ -0,0 +1,318 @@ +# ã€å‰ç«¯å¯¹æŽ¥Â·ç®¡ç†åŽå°ã€‘è½¦åŠ¡å¸æœºé™©è‡ªåŠ¨æŠ•é€€ä¿é—­çŽ¯ä¸Žä¿é™©èœå•契约 + +> **Issue**: [wx/HL#4760](https://git.1814.love:8443/wx/HL/issues/4760) +> **æœåŠ¡**: hl-fleet-service + hl-order-service-v3 insurance Feign +> **日期**: 2026-07-06 +> **å½±å“范围**: è½¦åŠ¡ç®¡ç† / ä¿é™©èœå• / æ´¾å•确认 / å–æ¶ˆ / æå‰å®Œç»“ / 车队对账 + +--- + +## 1. 结论 + +- 车务ä¿é™©èœå•åªå±•ç¤ºå¸æœºé™©ä»»åŠ¡ï¼Œä¸å±•示游客ä¿é™©ã€è®¢å•ä¿é™©ã€å®¢æˆ·é€€æ¬¾ä¿é™©æ˜Žç»†ã€‚ +- `insurance.type=perTrip` çš„å¸æœºåœ¨æ´¾å•确认进入 `assigned` åŽï¼ŒåŽç«¯æŒ‰ `driverId + serviceDate` è‡ªåŠ¨ä¸€æ—¥ä¸€ä¿æŠ•ä¿ã€‚ +- åŒä¸€å¸æœºåŒä¸€æœåŠ¡æ—¥åªèƒ½æœ‰ä¸€ä»½å¸æœºé™©ï¼›å‰åŽè®¢å•ç›¸æŽ¥åŒæ—¥ä¸é‡å¤ä¹°ã€‚ +- å–æ¶ˆ/æå‰å®Œç»“åŽï¼Œåªé€€è¯¥å¸æœºè¯¥æœåŠ¡æ—¥å·²æ— å…¶å®ƒ active æ´¾å•å ç”¨çš„啿—¥é™©ã€‚ +- 叿œºé™©åªè¿›å…¥è½¦é˜Ÿ/叿œºæˆæœ¬ï¼Œä¸è¿›å…¥å®¢æˆ·é€€æ¬¾ã€è®¢å•æ”¶æ¬¾ã€æ¸¸å®¢ä¿é™©æˆ–åˆåŒä¿é™©ã€‚ +- 自动投退ä¿å¤±è´¥ä¸é˜»æ–­æ´¾å•主æµç¨‹ï¼Œä½†å¿…须进入车务ä¿é™©ä»»åС待处ç†ã€‚ + +--- + +## 2. 角色与èœå• + +| 角色 | 行为 | +|------|------| +| `admin` / 车务角色 | å¯è®¿é—® `/admin/fleet/insurance/**`ï¼Œå¯æŸ¥çœ‹ä»»åŠ¡ã€é‡è¯•ã€æ ‡è®°çº¿ä¸‹å®Œæˆã€å¿½ç•¥ | +| `wx` / 定制师 | ä¸åº”展示车务ä¿é™©èœå•;若访问 `/admin/fleet/**` 按角色守å«è¿”回 `403` | + +å‰ç«¯ä¸è¦å¤ç”¨è®¢å•ä¿é™©é¡µé¢çš„æ•°æ®æºã€‚车务ä¿é™©èœå•åªè°ƒæœ¬æ–‡ä»¶æŽ¥å£ã€‚ + +--- + +## 3. 接å£ä¸€ï¼šå¸æœºé™©ä»»åŠ¡/æµæ°´åˆ†é¡µ + +```http +GET /admin/fleet/insurance/tasks +``` + +### 3.1 Query 傿•° + +| 傿•° | 类型 | å¿…å¡« | 示例 | 说明 | +|------|------|------|------|------| +| `page` | number | å¦ | `1` | é¡µç  | +| `pageSize` | number | å¦ | `20` | æ¯é¡µæ¡æ•° | +| `pendingOnly` | boolean | å¦ | `true` | `true` åªæŸ¥ `PENDING/PROCESSING`ï¼›ä¸ä¼ æŸ¥å…¨éƒ¨ | +| `taskType` | string | å¦ | `PURCHASE` | `PURCHASE` æŠ•ä¿ / `REFUND` é€€ä¿ | +| `taskStatus` | string | å¦ | `PENDING` | `PENDING/PROCESSING/SUCCESS/RESOLVED/IGNORED` | +| `driverId` | string | å¦ | `188800000000000001` | 叿œº ID | +| `assignmentId` | string | å¦ | `194000000000000001` | æ´¾å• ID | +| `orderId` | string | å¦ | `193900000000000001` | è®¢å• ID | +| `serviceDateFrom` | string | å¦ | `2026-07-01` | æœåŠ¡æ—¥èµ·ï¼Œ`yyyy-MM-dd` | +| `serviceDateTo` | string | å¦ | `2026-07-31` | æœåŠ¡æ—¥æ­¢ï¼Œä¸èƒ½æ—©äºŽèµ·å§‹æ—¥ | + +### 3.2 è¯·æ±‚ä¾‹å­ + +```http +GET /admin/fleet/insurance/tasks?pendingOnly=true&taskType=PURCHASE&serviceDateFrom=2026-07-01&serviceDateTo=2026-07-31&page=1&pageSize=20 +Authorization: Bearer +``` + +### 3.3 å“åº”ä¾‹å­ + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "page": 1, + "pageSize": 20, + "total": 2, + "records": [ + { + "taskId": "194100000000000001", + "bizKey": "PURCHASE:188800000000000001:2026-07-06", + "taskType": "PURCHASE", + "taskTypeLabel": "投ä¿", + "taskStatus": "PENDING", + "taskStatusLabel": "待处ç†", + "driverId": "188800000000000001", + "driverName": "王师傅", + "assignmentId": "194000000000000001", + "orderId": "193900000000000001", + "orderNo": "HL20260705001", + "insuranceOrderId": null, + "policyNo": "", + "serviceDate": "2026-07-06", + "coverageStartDate": "2026-07-06", + "coverageEndDate": "2026-07-06", + "premiumAmount": "0.00", + "source": "BAOYOU", + "sourceLabel": "ä¿æ¸¸ç½‘", + "errorCode": "540007", + "errorMessage": "ä¿é™©è®¡åˆ’没有匹é…该ä¿éšœå¤©æ•°çš„费率", + "suggestedAction": "ä¿é™©è®¡åˆ’没有匹é…该ä¿éšœå¤©æ•°çš„费率,请维护费率åŽé‡è¯•", + "retryCount": 1, + "proofUrls": [], + "handledBy": null, + "handledAt": null, + "handleRemark": "", + "createTime": "2026-07-06T09:10:00", + "updateTime": "2026-07-06T09:12:00" + }, + { + "taskId": "194100000000000002", + "bizKey": "PURCHASE:188800000000000001:2026-07-07", + "taskType": "PURCHASE", + "taskTypeLabel": "投ä¿", + "taskStatus": "SUCCESS", + "taskStatusLabel": "å·²æˆåŠŸ", + "driverId": "188800000000000001", + "driverName": "王师傅", + "assignmentId": "194000000000000002", + "orderId": "193900000000000002", + "orderNo": "HL20260705002", + "insuranceOrderId": "194200000000000001", + "policyNo": "BY-20260707001", + "serviceDate": "2026-07-07", + "coverageStartDate": "2026-07-07", + "coverageEndDate": "2026-07-07", + "premiumAmount": "18.00", + "source": "BAOYOU", + "sourceLabel": "ä¿æ¸¸ç½‘", + "errorCode": "", + "errorMessage": "", + "suggestedAction": "", + "retryCount": 0, + "proofUrls": [], + "handledBy": "0", + "handledAt": "2026-07-06T09:10:05", + "handleRemark": "", + "createTime": "2026-07-06T09:10:05", + "updateTime": "2026-07-06T09:10:05" + } + ] + } +} +``` + +### 3.4 字段说明 + +| 字段 | 说明 | +|------|------| +| `bizKey` | åŽç«¯å¹‚等键,å‰ç«¯åªå±•示/排查,ä¸è¦æ‹¼ä¸šåŠ¡é€»è¾‘ | +| `taskType` | `PURCHASE` 投ä¿ï¼Œ`REFUND` é€€ä¿ | +| `taskStatus` | `PENDING` 待处ç†ï¼Œ`PROCESSING` 处ç†ä¸­ï¼Œ`SUCCESS` 线上æˆåŠŸï¼Œ`RESOLVED` 线下解决,`IGNORED` 已忽略 | +| `premiumAmount` | 真实ä¿è´¹/退回金é¢ï¼Œå­—符串;å‰ç«¯ä¸è¦è½¬ number åšç²¾åº¦è¿ç®— | +| `source` | `BAOYOU` ä¿æ¸¸ç½‘,`OFFLINE` çº¿ä¸‹å¤„ç† | +| `proofUrls` | 线下处ç†å‡­è¯ URL;线上æˆåŠŸé€šå¸¸ä¸ºç©ºæ•°ç»„ | +| `handledBy=0` | åŽç«¯è‡ªåЍæˆåŠŸæµæ°´ï¼Œä¸æ˜¯äººå·¥è´¦å· | + +--- + +## 4. 接å£äºŒï¼šé‡è¯•任务 + +```http +POST /admin/fleet/insurance/tasks/{taskId}/retry +``` + +### 4.1 è¯·æ±‚ä¾‹å­ + +```http +POST /admin/fleet/insurance/tasks/194100000000000001/retry +Authorization: Bearer +``` + +æ—  body。 + +### 4.2 å“åº”ä¾‹å­ + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "taskId": "194100000000000001", + "taskStatus": "SUCCESS", + "taskStatusLabel": "å·²æˆåŠŸ" + } +} +``` + +### 4.3 å‰ç«¯å¤„ç† + +- ç‚¹å‡»åŽæŒ‰é’®åŠ  loadingï¼ŒæŽ¥å£æœ‰å¹‚ç­‰ä¿æŠ¤ï¼Œä¸è¦è¿žç»­æäº¤ã€‚ +- æˆåŠŸåŽåˆ·æ–°åˆ†é¡µåˆ—表。 +- 如果ä»è¿”回 `PENDING`,说明é‡è¯•失败但已更新错误信æ¯å’Œ `retryCount`,å‰ç«¯å±•示最新 `errorMessage/suggestedAction`。 + +--- + +## 5. 接å£ä¸‰ï¼šæ ‡è®°çº¿ä¸‹å®Œæˆ + +```http +POST /admin/fleet/insurance/tasks/{taskId}/offline-done +``` + +### 5.1 è¯·æ±‚å‚æ•° + +| 字段 | 类型 | å¿…å¡« | 示例 | 说明 | +|------|------|------|------|------| +| `policyNo` | string | 是 | `OFFLINE-20260701001` | 真实ä¿å•å· / 退ä¿å‡­è¯å· | +| `premiumAmount` | decimal string | 是 | `"18.00"` | 真实ä¿è´¹é‡‘é¢ï¼›é€€ä¿å¡«å®žé™…退回/冲å‡é‡‘é¢ | +| `proofUrls` | string[] | 是 | `["https://...jpg"]` | 至少 1 ä¸ªå‡­è¯ URL | +| `remark` | string | å¦ | `ä¿å¸åŽå°çº¿ä¸‹è¡¥æŠ•` | 处ç†å¤‡æ³¨ | + +### 5.2 è¯·æ±‚ä¾‹å­ + +```json +{ + "policyNo": "OFFLINE-20260701001", + "premiumAmount": "18.00", + "proofUrls": [ + "https://oss.test.1814.love/fleet/insurance/OFFLINE-20260701001.jpg" + ], + "remark": "ä¿å¸åŽå°çº¿ä¸‹è¡¥æŠ•,截图已上传" +} +``` + +### 5.3 å“åº”ä¾‹å­ + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "taskId": "194100000000000001", + "taskStatus": "RESOLVED", + "taskStatusLabel": "已解决" + } +} +``` + +### 5.4 校验 + +- `policyNo` ä¸ºç©ºï¼šå‚æ•°æ ¡éªŒå¤±è´¥ã€‚ +- `premiumAmount` ä¸ºç©ºæˆ–è´Ÿæ•°ï¼šå‚æ•°æ ¡éªŒå¤±è´¥ã€‚ +- `proofUrls` 为空数组或ä¸ä¼ ï¼šè¿”回 `100001` / 傿•°æ ¡éªŒå¤±è´¥ã€‚ + +--- + +## 6. 接å£å››ï¼šå¿½ç•¥ä»»åŠ¡ + +```http +POST /admin/fleet/insurance/tasks/{taskId}/ignore +``` + +### 6.1 è¯·æ±‚ä¾‹å­ + +```json +{ + "remark": "é‡å¤äººå·¥è®°å½•,ä¿å•已由å¦ä¸€ä»»åС处ç†" +} +``` + +### 6.2 å“åº”ä¾‹å­ + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "taskId": "194100000000000001", + "taskStatus": "IGNORED", + "taskStatusLabel": "已忽略" + } +} +``` + +--- + +## 7. 自动触å‘场景 + +| 场景 | åŽç«¯è¡Œä¸º | å‰ç«¯å…³æ³¨ | +|------|----------|----------| +| æ´¾å•确认 `holding -> assigned` | perTrip 叿œºæŒ‰æœåŠ¡æ—¥é€æ—¥æŠ•ä¿ | ç¡®è®¤æ´¾å•æˆåŠŸä¸ä»£è¡¨ä¿é™©ä¸€å®šæˆåŠŸï¼Œéœ€çœ‹ä¿é™©ä»»åŠ¡ | +| 已有线上ä¿å•覆盖åŒå¸æœºåŒæ—¥ | ä¸é‡å¤è´­ä¹°ï¼Œå†™ `SUCCESS` å¹‚ç­‰æµæ°´ | ä¸è¦æç¤ºé‡å¤æŠ•ä¿ | +| 已有手工/å¹´ä¿è¦†ç›–åŒå¸æœºåŒæ—¥ | ä¸ä¹°æŒ‰å•险,写 `PENDING` æé†’核对 | 展示 `suggestedAction` | +| æ´¾å•å–æ¶ˆ | åªé€€è¯¥å¸æœºè¯¥æœåŠ¡æ—¥æ— å…¶å®ƒ active æ´¾å•å ç”¨çš„啿—¥é™© | åŒæ—¥ä»æœ‰å…¶å®ƒè®¢å•æ—¶ä¸ä¼šé€€ | +| æå‰å®Œç»“ | 退新 `endDate` 之åŽä¸å†ä½¿ç”¨çš„啿—¥é™© | 定时完结通常无动作 | +| æ’¤é”€å–æ¶ˆæ¢å¤ä¸º assigned | 如果之å‰å·²é€€é™©ï¼Œæ¢å¤åŽè¡¥ä¹° | å‰ç«¯åˆ·æ–°ä»»åŠ¡åˆ—è¡¨ | + +--- + +## 8. å‰ç«¯ä¸è¦åšçš„事 + +- ä¸è¦ç”¨å¤§äº¤é€šæ—¥æœŸæŽ¨å¯¼å¸æœºé™©ä¿éšœæ—¥æœŸï¼›å¸æœºé™©ä¿éšœæ—¥æœŸä»¥æ´¾å•æœåŠ¡æ—¥ä¸ºå‡†ã€‚ +- ä¸è¦æŠŠå¸æœºé™©é€€ä¿ç»“æžœå‚与客户退款计算。 +- ä¸è¦æŠŠ `premiumAmount` è½¬æˆ JS number å†è®¡ç®—。 +- ä¸è¦åœ¨å‰ç«¯æ‹¼é‡è¯•ä¸šåŠ¡å‚æ•°ï¼Œé‡è¯•åªä¼  `taskId`。 +- ä¸è¦åœ¨è½¦åŠ¡ä¿é™©èœå•å±•ç¤ºè®¢å•æ¸¸å®¢é™©ã€‚ +- ä¸è¦æŠŠ `SUCCESS` è‡ªåŠ¨æµæ°´å½“æˆå¾…办æç¤ºï¼›å¾…办åªçœ‹ `PENDING/PROCESSING`。 + +--- + +## 9. é”™è¯¯ç æç¤º + +| code | 场景 | å‰ç«¯æ–‡æ¡ˆå»ºè®® | +|------|------|--------------| +| `100001` | 傿•°éžæ³•ã€ä»»åŠ¡ç¼ºä¸Šä¸‹æ–‡ã€æœåŠ¡æ—¥åŒºé—´å了 | 展示åŽç«¯ message | +| `100502` | å¹‚ç­‰ä¿æŠ¤ï¼Œé‡å¤æäº¤ | “正在处ç†ï¼Œè¯·å‹¿é‡å¤æäº¤â€ | +| `540007` | ä¿é™©è®¡åˆ’缺费率 | “请维护ä¿é™©è®¡åˆ’费率åŽé‡è¯•†| +| `540032` | åŒå¸æœºæœåŠ¡æ—¥å·²æœ‰ä¿å•覆盖 | “已有ä¿å•覆盖,请核对åŽå¤„ç†â€ | +| `605601` | ä¿é™©æœåŠ¡ä¸å¯ç”¨ | “ä¿é™©æœåŠ¡æš‚ä¸å¯ç”¨ï¼Œè¯·ç¨åŽé‡è¯•或线下处ç†â€ | + +--- + +## 10. æµ‹è¯•è¦æ±‚ + +å‰ç«¯è”è°ƒä¸è¦åªæµ‹æŽ¥å£ 200。至少覆盖: + +- æ–°å»ºè®¢å• -> 补出行人 -> 补大交通 -> æç”¨è½¦éœ€æ±‚ -> 车务派å•确认 -> ä¿é™©ä»»åŠ¡ç”Ÿæˆã€‚ +- åŒä¸€å¸æœºåŒä¸€æœåŠ¡æ—¥å¤šè®¢å•,ä¸é‡å¤ä¹°ä¿é™©ã€‚ +- å–æ¶ˆæ´¾å•时,åŒå¸æœºåŒæ—¥è¿˜æœ‰å…¶å®ƒ active æ´¾å•则ä¸é€€ä¿ã€‚ +- 投ä¿å¤±è´¥åŽé‡è¯•æˆåŠŸã€‚ +- 线下完æˆå¿…须上传凭è¯ã€‚ +- 定制师角色ä¸å¯è§è½¦åŠ¡ä¿é™©èœå•。