From 584f0b76edf3b35657e291d1711867ee9e0d151b Mon Sep 17 00:00:00 2001 From: wx <2636507191@qq.com> Date: Sun, 19 Jul 2026 19:34:19 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E9=80=9A=E7=9F=A5=E8=BD=A6=E5=8A=A1?= =?UTF-8?q?=E6=B4=BE=E5=8D=95=E5=8F=AF=E9=9D=A0=E9=80=9A=E7=9F=A5=E4=B8=8E?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E9=87=8D=E6=B4=BE=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...¯é é€šçŸ¥å–æ¶ˆé‡æ´¾ä¸Žå‘é€çжæ€-修改接å£-管ç†åŽå°.md | 370 ++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 changelogs-v2/2026-07/68_4933_车务派å•å¯é é€šçŸ¥å–æ¶ˆé‡æ´¾ä¸Žå‘é€çжæ€-修改接å£-管ç†åŽå°.md diff --git a/changelogs-v2/2026-07/68_4933_车务派å•å¯é é€šçŸ¥å–æ¶ˆé‡æ´¾ä¸Žå‘é€çжæ€-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-07/68_4933_车务派å•å¯é é€šçŸ¥å–æ¶ˆé‡æ´¾ä¸Žå‘é€çжæ€-修改接å£-管ç†åŽå°.md new file mode 100644 index 0000000..4c67916 --- /dev/null +++ b/changelogs-v2/2026-07/68_4933_车务派å•å¯é é€šçŸ¥å–æ¶ˆé‡æ´¾ä¸Žå‘é€çжæ€-修改接å£-管ç†åŽå°.md @@ -0,0 +1,370 @@ +# ã€å‰ç«¯å¯¹æŽ¥Â·ç®¡ç†åŽå°ã€‘车务派å•å¯é é€šçŸ¥ã€å–消åŽé‡æ´¾ä¸Žå‘é€çжæ€å¥‘约 + +> Issue: [wx/HL#4933](https://git.1814.love:8443/wx/HL/issues/4933) +> +> PR: [wx/HL#5073](https://git.1814.love:8443/wx/HL/pulls/5073)ã€[wx/HL#5084](https://git.1814.love:8443/wx/HL/pulls/5084) +> +> æœåŠ¡: `hl-fleet-service` / `hl-user-service` / `hl-order-service-v3` / `hl-gateway` +> +> 日期: 2026-07-19 +> +> å½±å“范围: æ´¾å•/æ”¹æ´¾å¼¹çª—ã€æ´¾å•详情æ“作记录ã€é€šçŸ¥å‘逿—¥å¿—ã€è®¢å•详情推é€è®°å½•ã€å–消åŽé‡æ–°æ´¾è½¦ + +## 一ã€å‰ç«¯ç»“论 + +- `holdMode=1` 的创建派å•和改派现在会冻结本次通知模æ¿ä¸Žæ­£æ–‡ï¼Œå¹¶ç”±åŽç«¯å¼‚步执行å¯é çŸ­ä¿¡å‘é€ã€‚ +- 创建 HOLD æˆåŠŸåªè¡¨ç¤ºæ´¾å•和通知æ„图已è½åº“;首次å“应中的 `holdSentAt` 固定为 `null`ã€‚åªæœ‰ä¾›åº”商真实å—ç†åŽï¼Œæ´¾å•详情的 `currentAssignment.holdSentAt` æ‰ä¼šå›žæ˜¾å‘逿—¶é—´ã€‚ +- 通知日志 `status` 已从旧的少é‡çŠ¶æ€æ‰©å±•为 `0~6`。å‰ç«¯å¿…须展示“投递中ã€ç»“æžœä¸ç¡®å®šã€æŽˆæƒæ’¤é”€â€ï¼Œä¸å¾—把它们归并æˆå‘逿ˆåŠŸæˆ–å¤±è´¥ã€‚ +- å–æ¶ˆæ´¾å•æˆåŠŸåŽï¼ŒåŽç«¯ä¼šå¯é åœ°æŠŠå½“å‰ç”Ÿæ•ˆç”¨è½¦éœ€æ±‚釿–°æ‰“开,å…è®¸å†æ¬¡æ´¾è½¦ï¼›è¯¥è¿‡ç¨‹ä¸ºæœ€ç»ˆä¸€è‡´ã€‚å‰ç«¯åˆ·æ–°çœ‹æ¿å’Œè¯¦æƒ…,并以最新 `canAssign`/当å‰éœ€æ±‚状æ€å†³å®šæ˜¯å¦å¼€æ”¾é‡æ´¾ï¼Œä¸è°ƒç”¨å†…部é‡å¼€æŽ¥å£ã€‚ +- 订å•详情推é€è®°å½•çš„å½’ä¸€åŒ–çŠ¶æ€æžšä¸¾å·²è°ƒæ•´ï¼Œå‰ç«¯éœ€è¦åŒæ­¥æ–°æžšä¸¾ã€‚ +- `/internal/**`ã€`/v3/internal/**` å‡ä¸ºæœåŠ¡é—´æŽ¥å£ï¼Œç»ç½‘å…³è°ƒç”¨è¿”å›žä¸šåŠ¡ç  `403`;任何 Web/å°ç¨‹åºä»£ç éƒ½ä¸å¾—调用。 + +## 二ã€å‰ç«¯å¯è°ƒç”¨æŽ¥å£ + +| æŽ¥å£ | 方法 | 路径 | 本轮å˜åŒ– | +|---|---|---|---| +| åˆ›å»ºæ´¾å• | POST | `/admin/fleet/assignments` | 新增 `messageTemplateId/customBody`;明确 `holdSentAt` 语义 | +| ä¿®æ”¹æ´¾å• | POST | `/admin/fleet/assignments/{assignmentId}/change` | HOLD 改派新增 `messageTemplateId/customBody` | +| æ´¾å•看æ¿è¯¦æƒ… | GET | `/admin/fleet/board/orders/{orderId}` | 回显真实 `holdSentAt`ï¼›æ“作记录补é½å–消/退ä¿å®Œæ•´æ—¶é—´çº¿ | +| æ´¾å•çœ‹æ¿æ±‡æ€» | GET | `/admin/fleet/board/summary` | å–æ¶ˆåŽåˆ·æ–°å½“å‰çжæ€ä¸Žèƒ½åŠ›å­—æ®µ | +| æ´¾å•看æ¿åˆ—表 | GET | `/admin/fleet/board/orders` | å–æ¶ˆåŽåˆ·æ–°å½“å‰çжæ€ä¸Žèƒ½åŠ›å­—æ®µ | +| 通知å‘逿—¥å¿— | GET | `/admin/notification/logs` | çŠ¶æ€æ‰©å±•为 `0~6`,新增å¯é æŠ•递审计字段 | +| 通知å‘é€ç»Ÿè®¡ | GET | `/admin/notification/logs/stats` | æ–°å¢žè·³è¿‡ã€æŠ•é€’ä¸­ã€ä¸ç¡®å®šã€æ’¤é”€ç­‰ç»Ÿè®¡ | +| 人工核对å¯é çŸ­ä¿¡ | PUT | `/admin/notification/logs/{id}/resolve-reliable` | 新增,仅专用æƒé™å¯ç”¨ | +| 订å•详情推é€è®°å½• | GET | `/v3/admin/order/{id}/push-records` | å½’ä¸€åŒ–çŠ¶æ€æžšä¸¾è°ƒæ•´ | + +## 三ã€åˆ›å»º/修改 HOLD æ´¾å• + +### 3.1 请求字段 + +ä¸¤ä¸ªå†™æŽ¥å£æ–°å¢žç›¸åŒçš„å¯é€‰å­—段: + +| 字段 | 类型 | 规则 | +|---|---|---| +| `messageTemplateId` | string | HOLD é€šçŸ¥æ¨¡æ¿ IDï¼›å¯ç©ºï¼Œç©ºæ—¶ä½¿ç”¨ `hold_notify` 默认模æ¿ï¼›`holdMode=0` 时忽略 | +| `customBody` | string | 本次通知自定义正文;å¯ç©ºï¼Œæœ€å¤§ 4000 字符;åªå†»ç»“本次内容,ä¸å›žå†™æ¨¡æ¿ | + +所有雪花 ID 继续按字符串传递和ä¿å­˜ï¼Œç¦æ­¢è½¬ä¸º JavaScript `Number`。 + +创建 HOLD 请求示例: + +```http +POST /admin/fleet/assignments +Content-Type: application/json +Authorization: Bearer +``` + +```json +{ + "orderId": "2074746808742928386", + "requirementId": "2075001000000000001", + "vehicleId": "2076001000000000001", + "driverId": "2077001000000000001", + "startDate": "2026-07-20", + "endDate": "2026-07-22", + "headcount": 4, + "holdMode": 1, + "messageTemplateId": "20260706000101", + "customBody": "王师傅您好,26-7218 团 7 月 20 日待确认。", + "fromEntry": "from-board", + "requestId": "hold-2074746808742928386-001" +} +``` + +修改为 HOLD 请求示例: + +```http +POST /admin/fleet/assignments/2078001000000000001/change +Content-Type: application/json +Authorization: Bearer +``` + +```json +{ + "effectiveDate": "2026-07-21", + "newVehicleId": "2076001000000000002", + "newDriverId": "2077001000000000002", + "holdMode": 1, + "messageTemplateId": "20260706000101", + "customBody": "æŽå¸ˆå‚…您好,本团 7 月 21 日起调整由您æœåŠ¡ï¼Œè¯·ç¡®è®¤ã€‚", + "reason": "åŽŸå¸æœºä¸´æ—¶æ— æ³•执行", + "requestId": "change-2078001000000000001-001" +} +``` + +### 3.2 创建å“应与 `holdSentAt` + +HOLD 创建æˆåŠŸå“应示例: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "id": "2078001000000000001", + "assignmentGroupId": "2078001000000000001", + "assignmentSlotId": "2078001000000000001", + "assignmentStatus": "holding", + "stageCode": "holding_wait_driver", + "stageLabel": "æŽ’è½¦ä¸­Â·ç­‰å¾…å¸æœºç¡®è®¤", + "currentStep": 3, + "skippedStepCodes": [], + "protocolPrice": "1300.00", + "holdSentAt": null, + "confirmedAt": null, + "sideEffects": null, + "dailyDifferences": [] + } +} +``` + +å‰ç«¯å¤„ç†è§„则: + +1. `code=200` 且 `assignmentStatus=holding` åŽç«‹å³å…³é—­é‡å¤æäº¤å…¥å£ï¼Œå¹¶åˆ·æ–°è¯¦æƒ…。 +2. `holdSentAt=null` 䏿˜¯æŽ¥å£å¤±è´¥ï¼Œä¹Ÿä¸èƒ½æ˜¾ç¤ºâ€œçŸ­ä¿¡å·²å‘é€â€ï¼›åº”显示“通知处ç†ä¸­/等待å‘é€ç»“æžœâ€ã€‚ +3. åŽç»­è¯»å– `GET /admin/fleet/board/orders/{orderId}`,仅当 `currentAssignment.holdSentAt` éžç©ºæ—¶æ˜¾ç¤ºçœŸå®žå‘逿—¶é—´ã€‚ +4. 模æ¿ç¼ºå¤±ã€ä¾›åº”商失败或结果ä¸ç¡®å®šæ—¶ï¼Œæ´¾å•ä»ä¿æŒ `holding`,å‰ç«¯é€šè¿‡é€šçŸ¥æ—¥å¿—查看真实状æ€ï¼Œä¸è‡ªè¡Œæ”¹æ´¾å•状æ€ã€‚ + +## å››ã€é€šçŸ¥å‘逿—¥å¿—çŠ¶æ€ + +### 4.1 çŠ¶æ€æžšä¸¾ + +`GET /admin/notification/logs` çš„è¯·æ±‚ç­›é€‰å‚æ•°å’Œå“应字段 `status` 统一使用: + +| status | å«ä¹‰ | å‰ç«¯å±•示建议 | +|---:|---|---| +| 0 | å‘逿ˆåŠŸï¼Œä¾›åº”å•†æ˜Žç¡®å—ç† | æˆåŠŸ | +| 1 | 明确失败 | 失败 | +| 2 | 无收件人 | 已跳过·无收件人 | +| 3 | æ— æ¨¡æ¿ | å·²è·³è¿‡Â·æ— æ¨¡æ¿ | +| 4 | 投递中 | 投递中 | +| 5 | 结果ä¸ç¡®å®š | 待核对 | +| 6 | æŽˆæƒæ’¤é”€ | 已撤销 | + +å‰ç«¯ä¸å¾—把 `4/5/6` 计入æˆåŠŸæˆ–å¤±è´¥ã€‚çŠ¶æ€ `5` 也ä¸èƒ½è‡ªåЍé‡å‘,é¿å…供应商实际已å‘逿—¶é‡å¤é€šçŸ¥å¸æœºã€‚ + +啿¡æ—¥å¿—新增字段: + +```json +{ + "id": 2080001000000000001, + "eventCode": "FLEET_DISPATCH_CREATED", + "channel": "SMS", + "bizId": "2078001000000000001", + "bizType": "FLEET_ASSIGNMENT_HOLD", + "status": 5, + "latestProviderAttemptAt": "2026-06-19T10:00:00", + "providerSentAt": null, + "resultTime": null, + "manualResolvedAt": null, + "manualResolvedBy": null, + "manualResolutionReason": null +} +``` + +新增统计字段: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "totalToday": 20, + "successToday": 12, + "failToday": 2, + "skippedToday": 3, + "dispatchingToday": 1, + "unknownToday": 1, + "canceledToday": 1, + "terminalAttemptToday": 14, + "successRate": 85.71, + "channelStats": [] + } +} +``` + +`successRate` çš„åˆ†æ¯æ˜¯ `terminalAttemptToday = successToday + failToday`,å‰ç«¯ä¸è¦å†ç”¨ `totalToday` 自行计算。 + +## 五ã€äººå·¥æ ¸å¯¹ç»“æžœä¸ç¡®å®šçŸ­ä¿¡ + +该入å£åªå¤„ç†è¶…过供应商 29 天查询窗å£ã€ä»ä¸º `status=5` 的车务å¯é çŸ­ä¿¡ï¼Œå¹¶è¦æ±‚ `NOTIFICATION_RELIABLE_RESOLVE` 专用æƒé™ã€‚当å‰åŽç«¯åªæŽˆäºˆ `SUPER_ADMIN`;普通管ç†å‘˜å³ä½¿æ‰‹å·¥æž„造请求也会被拒ç»ã€‚ + +确认已å‘é€ï¼š + +```http +PUT /admin/notification/logs/2080001000000000001/resolve-reliable +Content-Type: application/json +Authorization: Bearer +``` + +```json +{ + "resolution": "SUCCESS", + "reason": "阿里云控制å°å‘é€è®°å½•æ ¸å¯¹ï¼Œå·¥å• SMS-20260719-001", + "externalMessageId": "SMS-20260719-001", + "providerSentAt": "2026-06-19T10:00:30" +} +``` + +确认未å‘é€ï¼š + +```json +{ + "resolution": "NOT_SENT", + "reason": "é˜¿é‡Œäº‘æŽ§åˆ¶å°æœªæŸ¥åˆ°å¯¹åº”å‘é€è®°å½•", + "externalMessageId": null, + "providerSentAt": null +} +``` + +æˆåŠŸå“应: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": null +} +``` + +处ç†è§„则: + +- `SUCCESS` 必须传 `externalMessageId` å’Œ `providerSentAt`;事实时间必须ä½äºŽæœ€è¿‘一次供应商å°è¯•æ—¶é—´å‰åŽ 5 分钟内。 +- `NOT_SENT` ä¸å¾—ä¼  `providerSentAt`。 +- 请求返回 `100001` è¡¨ç¤ºå‚æ•°æˆ–è¯æ®æ—¶é—´ä¸åˆæ³•;返回 `100003` 表示无æƒé™ã€æ—¥å¿—ä¸ç¬¦åˆäººå·¥æ ¸å¯¹æ¡ä»¶æˆ–状æ€å·²å˜åŒ–。 +- æ“作æˆåŠŸåŽåˆ·æ–°å½“剿—¥å¿—行和统计;ä¸è¦åœ¨å‰ç«¯ç›´æŽ¥ç¯¡æ”¹çжæ€ã€‚ + +## å…­ã€è®¢å•详情推é€è®°å½•çŠ¶æ€ + +`GET /v3/admin/order/{id}/push-records` çš„ `records[].status` 改为: + +| status | å«ä¹‰ | +|---|---| +| `SENT` | 供应商明确å—ç† | +| `FAILED` | 明确失败 | +| `SKIPPED_NO_RECIPIENT` | 无收件人 | +| `SKIPPED_NO_TEMPLATE` | æ— æ¨¡æ¿ | +| `DISPATCHING` | 投递中 | +| `UNKNOWN` | 结果ä¸ç¡®å®š | +| `CANCELED` | 授æƒå·²æ’¤é”€ | +| `UNRECOGNIZED` | 未识别的存é‡çŠ¶æ€ | + +å“应示例: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "success": true, + "data": { + "total": 1, + "records": [ + { + "id": 2080001000000000001, + "eventCode": "FLEET_DISPATCH_CREATED", + "channel": "SMS", + "channelName": "短信", + "kind": "sms", + "target": "王师傅", + "status": "UNKNOWN", + "statusName": "结果ä¸ç¡®å®š", + "rawStatus": 5, + "failReason": null, + "bizId": "2078001000000000001", + "bizType": "FLEET_ASSIGNMENT_HOLD", + "sentAt": "2026-07-19T10:00:00" + } + ], + "summary": { + "all": 1, + "sms": 1, + "miniapp": 0, + "officialAccount": 0, + "inapp": 0, + "internal": 0, + "wework": 0, + "other": 0, + "failed": 0 + } + } +} +``` + +`summary.failed` åªç»Ÿè®¡ `rawStatus=1`,ä¸åŒ…å« `UNKNOWN/DISPATCHING/CANCELED`。 + +## 七ã€å–消åŽé‡æ–°æ´¾è½¦ + +å‰ç«¯ä»è°ƒç”¨æ—¢æœ‰æŽ¥å£å–消: + +```http +DELETE /admin/fleet/assignments/{assignmentId} +``` + +æˆåŠŸåŽçš„æ­£ç¡®æµç¨‹ï¼š + +1. 接å—å–æ¶ˆå“应中的 `assignmentStatus=canceled`。 +2. 釿–°è¯·æ±‚ `/admin/fleet/board/summary`ã€`/admin/fleet/board/orders` å’Œ `/admin/fleet/board/orders/{orderId}`。 +3. åŽç«¯å®Œæˆéœ€æ±‚é‡å¼€åŽï¼Œå½“å‰è®¢å•釿–°å‡ºçް坿´¾çжæ€ï¼›æŒ‰é’®åªçœ‹æœ€æ–°å“应的 `canAssign`,ä¸è¦æœ¬åœ°å¼ºåˆ¶æ”¹ä¸ºå¯æ´¾ã€‚ +4. å¦‚æžœé¦–æ¬¡åˆ·æ–°ä»æœªå¼€æ”¾é‡æ´¾ï¼Œä¿æŒå¤„ç†ä¸­å¹¶çŸ­æš‚é‡è¯•刷新;ä¸è¦è°ƒç”¨ `/v3/internal/order/**`,也ä¸è¦è®©ç”¨æˆ·é‡å¤å–消。 +5. 釿–°æ´¾è½¦æˆåŠŸåŽå†æ¬¡åˆ·æ–°æœåŠ¡ç«¯çŠ¶æ€ï¼Œä¸èƒ½æ²¿ç”¨å·²å–消派å•çš„ `assignmentId`。 + +æ´¾å•详情 `operationLog.records[]` 会ä¿ç•™ä¸å¯å˜å–消时间线,新增/强化的 `opType` 包括: + +- `cancel_requested` +- `driver_notification_recorded` +- `cancel_evidence_recorded` +- `insurance_refund_pending` +- `insurance_refund_succeeded` +- `insurance_refund_failed` +- `cancel_completed` +- `cancel_restored` +- `cancel_failed` + +å‰ç«¯ä¼˜å…ˆå±•示åŽç«¯è¿”回的 `opTypeLabel`ã€`operationStatusLabel` å’Œ `summary`,ä¸è¦å¦ç»´æŠ¤ä¸­æ–‡æ–‡æ¡ˆã€‚`operationStatus` å…许 `pending/succeeded/failed`。 + +## å…«ã€ç½‘å…³ internal 边界 + +ä¸‹åˆ—è·¯å¾„å…¨éƒ¨ç¦æ­¢å®¢æˆ·ç«¯è°ƒç”¨ï¼š + +```text +/internal +/internal/** +/v3/internal +/v3/internal/** +``` + +网关按项目å议返回 HTTP 200,但å“应体为: + +```json +{ + "code": 403, + "message": "接å£ä¸å¯è®¿é—®", + "success": false, + "data": null +} +``` + +请å‰ç«¯å…¨ä»“检查是å¦ä»æœ‰ `/v3/internal/mp/**` 等历å²è°ƒç”¨ï¼›å¦‚存在,ä¸è¦è‡ªè¡Œæ”¹æˆå¦ä¸€ä¸ª internal 地å€ï¼Œåº”å馈åŽç«¯è¡¥æ­£å¼ BFF/admin 契约。 + +## ä¹ã€å‰ç«¯å¾…å¤„ç†æ¸…å• + +- [ ] æ´¾å•/改派弹窗在 HOLD æ¨¡å¼æ”¯æŒ `messageTemplateId/customBody`,DIRECT 模å¼ä¸æäº¤æˆ–忽略这两个字段。 +- [ ] HOLD 创建æˆåŠŸæ—¶æŠŠ `holdSentAt=null` 展示为处ç†ä¸­ï¼Œä¸æ˜¾ç¤ºâ€œå·²å‘é€â€ã€‚ +- [ ] é€šçŸ¥æ—¥å¿—ç­›é€‰ã€æ ‡ç­¾å’Œç»Ÿè®¡é€‚é… `0~6` 状æ€åŠæ–°å¢žå­—段。 +- [ ] 仅对具备专用æƒé™çš„è´¦å·å±•示“人工核对å¯é çŸ­ä¿¡â€å…¥å£ï¼Œå¹¶å®žçް `SUCCESS/NOT_SENT` 两ç§è¡¨å•校验。 +- [ ] 订å•详情推é€è®°å½•适酿–°çš„å½’ä¸€åŒ–çŠ¶æ€æžšä¸¾ã€‚ +- [ ] å–æ¶ˆæ´¾å•åŽåˆ·æ–°æœåŠ¡ç«¯çŠ¶æ€ï¼Œä»¥ `canAssign` æŽ§åˆ¶é‡æ–°æ´¾è½¦å…¥å£ã€‚ +- [ ] 确认å‰ç«¯ä¸å­˜åœ¨ä»»ä½• `/internal/**` 或 `/v3/internal/**` 调用。 +- [ ] 所有雪花 ID ä¿æŒå­—符串。 + +## åã€åŽç«¯äº¤ä»˜ä¸Žæµ‹è¯•çŽ¯å¢ƒçŠ¶æ€ + +- åŽç«¯ PR #5073ã€#5084 å·²åˆå¹¶åˆ° `dev-v3`。 +- `hl-order-service-v3`ã€`hl-fleet-service`ã€`hl-gateway` 已按顺åºéƒ¨ç½² TEST,åŒå®žä¾‹å¥åº·ï¼›å½“å‰ OpenAPI 已公开本文全部管ç†ç«¯æŽ¥å£ã€‚ +- 已用真实测试订å•å®Œæˆ DIRECTã€å–消ã€éœ€æ±‚é‡å¼€ã€å†æ¬¡ DIRECTã€å¸æœºåŒæ­¥å’Œé€€ä¿æ—¶é—´çº¿éªŒæ”¶ã€‚ +- TEST å½“å‰ `hold_notify` 短信模æ¿ä»æ˜¯å ä½é…置,真实 HOLD 短信会失败关闭,`holdSentAt` ä¿æŒ `null`;这是环境é…置阻塞,ä¸åº”ç”±å‰ç«¯ä¼ªé€ æˆå‘逿ˆåŠŸã€‚ +- 本文件åªåšå¥‘约交接,ä¸ä¿®æ”¹ `hl-ui`。 +