From a4fb47b2e3c7393f36df9ad46275f4684a85a525 Mon Sep 17 00:00:00 2001 From: lc Date: Tue, 11 Aug 2026 18:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B4=BE=E5=8D=95=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E5=BF=AB=E7=85=A7=E5=A5=91=E7=BA=A6?= =?UTF-8?q?=EF=BC=88#5862=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...œæ—¥å¿—补全æ“作人与改派快照-修改接å£-管ç†åŽå°.md | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 changelogs-v2/2026-08/11_5862_æ´¾å•æ“作日志补全æ“作人与改派快照-修改接å£-管ç†åŽå°.md diff --git a/changelogs-v2/2026-08/11_5862_æ´¾å•æ“作日志补全æ“作人与改派快照-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-08/11_5862_æ´¾å•æ“作日志补全æ“作人与改派快照-修改接å£-管ç†åŽå°.md new file mode 100644 index 0000000..07c9ad6 --- /dev/null +++ b/changelogs-v2/2026-08/11_5862_æ´¾å•æ“作日志补全æ“作人与改派快照-修改接å£-管ç†åŽå°.md @@ -0,0 +1,225 @@ +--- +schema: "hl-changelog/v2" +ticket: "5862" +title: "æ´¾å•æ“作日志补全æ“ä½œäººã€æ“作时间与改派资æºå¿«ç…§" +consumer: "admin" +author: "lc(GIT)" +change_type: "修改接å£" +backend_status: "deployed" +gateway_status: "verified" +frontend_status: "not_required" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "PR #5869 å·²åˆå…¥ dev-v3 并部署 TESTï¼›çœŸå®žç™»å½•ç» Gateway éªŒè¯æ“ä½œæ—¶é—´ã€æ“作人ã€åŠ¨ä½œæ‘˜è¦åŠåކ岿”¹æ´¾é™çº§å¥‘约。现有管ç†ç«¯å¯ç›´æŽ¥å±•示,无å‰ç«¯ä»£ç å˜æ›´ã€‚" +updated_at: "2026-08-11" +base: "dev-v3" +--- + +# 车务派å•:æ“作日志补全æ“ä½œäººã€æ“作时间与改派资æºå¿«ç…§ + +> **æœåŠ¡**: hl-fleet-service(8087) +> **PR**: #5869 +> **Issue**: #5862 +> **日期**: 2026-08-11 +> **å½±å“范围**: 管ç†ç«¯è½¦åŠ¡çœ‹æ¿è®¢å•详情和“查看日志â€ä¸­çš„æ´¾å•æ“作记录 + +--- + +## âš ï¸ å…³é”®å˜åŒ– + +- æ“作日志现在稳定返回 `time`ã€`operatorName`ã€`opTypeLabel` å’Œ `summary`,æ“作人按“ä¼ä¸šå¾®ä¿¡å§“å → 系统用户å → 系统â€çš„顺åºè§£æžã€‚ +- 改派日志新增结构化 `changeDetail`。新日志ä¿å­˜æ“作当时的新旧车牌ã€å¸æœºå§“å快照,ä¸å†è¦æ±‚è°ƒç”¨æ–¹è§£æž `detailJson` 中的 ID åŽæŸ¥è¯¢å½“å‰è½¦è¾†æˆ–叿œºæ¡£æ¡ˆã€‚ +- åŽ†å²æ—¥å¿—æ²¡æœ‰å¿«ç…§æ—¶ä¿æŒå…¼å®¹ï¼šå±•示字段å…许按 ID æŸ¥è¯¢å½“å‰æ¡£æ¡ˆï¼Œ`dataCompleteness` 明确返回 `HISTORICAL_PARTIAL`,ä¸å¾—æŠŠå½“å‰æ¡£æ¡ˆå€¼è¯¯è®¤ä¸ºæ“作时快照。 + +## 一ã€å˜æ›´æŽ¥å£æ¸…å• + +| # | æŽ¥å£ | 方法 | 路径 | å˜æ›´ç±»åž‹ | 说明 | +|---|---|---|---|---|---| +| 1 | æ´¾å•æ“作时间线 | GET | `/admin/fleet/orders/{orderId}/operation-log` | å“应增强 | 日志行补全æ“作信æ¯ä¸Žç»“构化改派详情 | +| 2 | 车务看æ¿è®¢å•详情 | GET | `/admin/fleet/board/orders/{orderId}` | å“应增强 | `operationLog.records[]` åŒæ­¥è¿”回相åŒå­—段 | + +ä¸¤ä¸ªæŽ¥å£æ²¿ç”¨åŽŸæœ‰è·¯å¾„ã€é‰´æƒå’Œåˆ†é¡µå¥‘çº¦ï¼Œä¸æ–°å¢žè¯·æ±‚字段。 + +## äºŒã€æŽ¥å£è¯¦æƒ… + +### 1. æ´¾å•æ“作时间线 `GET /admin/fleet/orders/{orderId}/operation-log` + +**å“应模型**: `Result` + +#### å…¥å‚ + +| 字段 | ä½ç½® | 类型 | å¿…å¡« | çº¦æŸ | 说明 | +|---|---|---|---|---|---| +| orderId | Path | String | 是 | Long 字符串 | è®¢å• ID | +| page | Query | Integer | å¦ | 默认 1 | é¡µç  | +| pageSize | Query | Integer | å¦ | 默认 50,最大 200 | æ¯é¡µæ¡æ•° | +| sortBy | Query | String | å¦ | `time,desc` / `time,asc` | 默认按æ“ä½œæ—¶é—´å€’åº | +| keyword | Query | String | å¦ | 最长 32 å­— | 按展示åŽçš„æ‘˜è¦ã€æ“作人等内容æœç´¢ | +| startDate | Query | LocalDateTime | å¦ | ISO 8601 | æ“作时间起点 | +| endDate | Query | LocalDateTime | å¦ | ISO 8601 | æ“作时间终点 | + +#### æ—¥å¿—è¡Œå‡ºå‚ + +| 字段 | 类型 | 说明 | +|---|---|---| +| id | String / null | 日志 IDï¼›åˆæˆé‡Œç¨‹ç¢‘记录å¯ä¸º null | +| time | String | æ“ä½œæ—¶é—´ï¼Œæ ¼å¼ `yyyy-MM-dd HH:mm:ss` | +| opType | String | æ“作类型英文枚举 | +| opTypeLabel | String | å¯ç›´æŽ¥å±•示的中文动作åç§° | +| summary | String | åŽç«¯ç”Ÿæˆçš„æ“ä½œæ‘˜è¦ï¼Œæ”¹æ´¾æ—¶åŒ…å«å‰åŽèµ„æºå’Œç”Ÿæ•ˆæ—¥ | +| operatorName | String | ä¼ä¸šå¾®ä¿¡å§“å优先,无ä¼ä¸šå¾®ä¿¡å§“åæ—¶ä½¿ç”¨ç³»ç»Ÿç”¨æˆ·å;自动任务为“系统†| +| effectiveDate | String / null | ç”Ÿæ•ˆæ—¥æœŸï¼Œæ ¼å¼ `yyyy-MM-dd` | +| detailJson | String / null | 兼容ä¿ç•™çš„原始明细 JSON,ä¸å»ºè®®å‰ç«¯å†è‡ªè¡Œè§£æž ID | +| changeDetail | Object / null | æ”¹æ´¾ç»“æž„åŒ–è¯¦æƒ…ï¼›éžæ”¹æ´¾åŠ¨ä½œè¿”å›ž null | + +#### `changeDetail` 字段 + +| 字段 | 类型 | 说明 | +|---|---|---| +| changeDimensions | String[] | å˜æ›´ç»´åº¦ï¼š`VEHICLE`ã€`DRIVER`ã€`VEHICLE_FEE` | +| previousVehicleId / newVehicleId | String / null | åŽŸè½¦ã€æ–°è½¦ ID | +| previousVehiclePlateSnapshot / newVehiclePlateSnapshot | String / null | æ“ä½œå½“æ—¶çš„åŽŸè½¦ç‰Œã€æ–°è½¦ç‰Œå¿«ç…§ï¼›åކ岿— å¿«ç…§æ—¶ä¸º null | +| previousVehiclePlate / newVehiclePlate | String / null | å±•ç¤ºå€¼ï¼›ä¼˜å…ˆä½¿ç”¨å¿«ç…§ï¼ŒåŽ†å²æ•°æ®æ‰æŒ‰ ID é™çº§æŸ¥è¯¢å½“剿¡£æ¡ˆ | +| previousDriverId / newDriverId | String / null | åŽŸå¸æœºã€æ–°å¸æœº ID | +| previousDriverNameSnapshot / newDriverNameSnapshot | String / null | æ“ä½œå½“æ—¶çš„åŽŸå¸æœºã€æ–°å¸æœºå§“åå¿«ç…§ï¼›åŽ†å²æ— å¿«ç…§æ—¶ä¸º null | +| previousDriverName / newDriverName | String / null | å±•ç¤ºå€¼ï¼›ä¼˜å…ˆä½¿ç”¨å¿«ç…§ï¼ŒåŽ†å²æ•°æ®æ‰æŒ‰ ID é™çº§æŸ¥è¯¢å½“剿¡£æ¡ˆ | +| effectiveDate / endDate | String / null | æœ¬æ¬¡å˜æ›´çš„ç”Ÿæ•ˆæ—¥å’Œç»“æŸæ—¥ | +| previousUsedDays | Integer / null | 生效日å‰åŽŸèµ„æºåœ¨åŒä¸€æ§½ä½å·²ä½¿ç”¨çš„æœ‰æ•ˆæœåŠ¡æ—¥æ•°ï¼›åŽ†å²æœªçŸ¥ä¸º null | +| affectedServiceDates | String[] | æœ¬æ¬¡å®žé™…å˜æ›´çš„æœåŠ¡æ—¥æœŸï¼Œæ”¯æŒéžè¿žç»­æ—¥æœŸé›†åˆ | +| affectedDays | Integer / null | æœ¬æ¬¡å®žé™…å˜æ›´æœåŠ¡æ—¥æ•°ï¼›åŽ†å²æœªçŸ¥ä¸º null | +| reason | String / null | å˜æ›´åŽŸå›  | +| dataCompleteness | String | `COMPLETE` 或 `HISTORICAL_PARTIAL` | + +#### 完整快照å“应示例 + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "data": { + "records": [ + { + "id": "2086386125831561218", + "time": "2026-08-11 15:05:14", + "opType": "change_completed", + "opTypeLabel": "修改派å•完æˆ", + "summary": "lc 修改派å•完æˆï¼šè’™A-E2E99王信 → è’™A-E2E01é“å°”å‰ï¼Œç”Ÿæ•ˆæ—¥ 2026-08-23", + "operatorName": "lc", + "effectiveDate": "2026-08-23", + "detailJson": "{...}", + "changeDetail": { + "changeDimensions": ["VEHICLE", "DRIVER"], + "previousVehicleId": "2086000000000000001", + "previousVehiclePlateSnapshot": "è’™A-E2E99", + "previousVehiclePlate": "è’™A-E2E99", + "previousDriverId": "2086000000000000002", + "previousDriverNameSnapshot": "王信", + "previousDriverName": "王信", + "newVehicleId": "2086000000000000003", + "newVehiclePlateSnapshot": "è’™A-E2E01", + "newVehiclePlate": "è’™A-E2E01", + "newDriverId": "2086000000000000004", + "newDriverNameSnapshot": "é“å°”å‰", + "newDriverName": "é“å°”å‰", + "effectiveDate": "2026-08-23", + "endDate": "2026-08-25", + "previousUsedDays": 2, + "affectedServiceDates": ["2026-08-23", "2026-08-24", "2026-08-25"], + "affectedDays": 3, + "reason": "è°ƒæ•´è½¦è¾†ä¸Žå¸æœº", + "dataCompleteness": "COMPLETE" + } + } + ], + "total": 1, + "page": 1, + "pageSize": 50 + }, + "success": true +} +``` + +#### åŽ†å²æ—¥å¿—é™çº§ç¤ºä¾‹ + +```json +{ + "previousVehiclePlateSnapshot": null, + "previousVehiclePlate": "è’™A-E2E99", + "previousDriverNameSnapshot": null, + "previousDriverName": "王信", + "newVehiclePlateSnapshot": null, + "newVehiclePlate": "è’™A-E2E01", + "newDriverNameSnapshot": null, + "newDriverName": "é“å°”å‰", + "previousUsedDays": null, + "affectedServiceDates": [], + "affectedDays": null, + "dataCompleteness": "HISTORICAL_PARTIAL" +} +``` + +### 2. 车务看æ¿è®¢å•详情 `GET /admin/fleet/board/orders/{orderId}` + +订å•详情原有 `operationLog.records[]` å¤ç”¨ä¸Šè¿°æ—¥å¿—è¡Œæ¨¡åž‹ã€‚æœ¬æ¬¡åŒæ­¥å¢žåŠ å¹¶è¡¥å…¨ `time`ã€`opTypeLabel`ã€`summary`ã€`operatorName` å’Œ `changeDetail`,字段å«ä¹‰åŠåކå²é™çº§è§„则与独立æ“作时间线接å£ä¸€è‡´ã€‚ + +## 三ã€ä¿®æ”¹å‰åŽå¯¹æ¯” + +### 字段级对比 + +| 字段 | ä¿®æ”¹å‰ | ä¿®æ”¹åŽ | +|---|---|---| +| time | 部分æ“作记录展示字段ä¸å®Œæ•´ | æ¯æ¡å¯å±•示记录返回标准æ“作时间 | +| operatorName | å¯èƒ½åªæœ‰æ³›åŒ–è§’è‰²åæˆ–缺失 | ä¼ä¸šå¾®ä¿¡å§“å优先,系统用户å兜底,自动任务显示“系统†| +| summary / opTypeLabel | 动作信æ¯ä¸å®Œæ•´æˆ–需è¦è°ƒç”¨æ–¹æ‹¼è£… | 返回中文动作åç§°å’Œå¯ç›´æŽ¥å±•ç¤ºçš„å®Œæ•´æ‘˜è¦ | +| detailJson | 调用方需解æžè½¦è¾†ã€å¸æœº ID,且查询结果会å—当剿¡£æ¡ˆå˜åŒ–å½±å“ | 兼容ä¿ç•™ï¼Œä¸å†ä½œä¸ºç¨³å®šå±•示契约 | +| changeDetail | æ—  | 返回新旧车辆ã€å¸æœºã€ä½¿ç”¨å¤©æ•°ã€å½±å“日期åŠå®Œæ•´æ€§æ ‡è®° | +| è½¦ç‰Œä¸Žå¸æœºå§“å | å¯èƒ½å±•ç¤ºå½“å‰æ¡£æ¡ˆå€¼ï¼Œæ— æ³•è¯æ˜Žæ“作当时åç§° | 新日志ä¿å­˜æ“ä½œæ—¶å¿«ç…§ï¼›åŽ†å²æ—¥å¿—明确标记é™çº§çŠ¶æ€ | + +### 行为级对比 + +| 场景 | ä¿®æ”¹å‰ | ä¿®æ”¹åŽ | +|---|---|---| +| æ“作人展示 | å¯èƒ½æ— æ³•识别具体人员 | ä¼å¾®å§“å优先,无ä¼å¾®å§“åæ—¶æ˜¾ç¤ºç³»ç»Ÿç”¨æˆ·å | +| æ¢è½¦æˆ–æ¢å¸æœº | 仅凭 ID 无法稳定还原å‰åŽèµ„æº | 直接返回æ“ä½œå½“æ—¶çš„æ–°æ—§è½¦ç‰Œä¸Žå¸æœºå§“åå¿«ç…§ | +| åŽ†å²æ— å¿«ç…§ | å®¹æ˜“æŠŠå½“å‰æ¡£æ¡ˆè¯¯å½“作历å²äº‹å®ž | å¯é™çº§å±•示,但通过 `HISTORICAL_PARTIAL` 明确说明ä¸å®Œæ•´ | +| 车辆费用å•独å˜åŒ– | å¯èƒ½è¢«è¯¯å†™æˆæ¢è½¦æˆ–æ¢å¸æœº | `changeDimensions` å•独标记 `VEHICLE_FEE`ï¼ŒåŠ¨ä½œæ‘˜è¦æŒ‰å®žé™…ç»´åº¦ç”Ÿæˆ | + +## å››ã€å¥‘约约æŸä¸Žå…¼å®¹è¾¹ç•Œ + +- 调用方应优先读å–结构化 `changeDetail`ï¼›`detailJson` 仅为兼容字段,ä¸ä¿è¯é€‚åˆä½œä¸ºé•¿æœŸå±•ç¤ºæ•°æ®æºã€‚ +- `*Snapshot` 是æ“作时事实;ä¸å¸¦ `Snapshot` 的车牌ã€å¸æœºå±•示字段å¯èƒ½æ˜¯åކ岿•°æ®æŒ‰ ID æŸ¥è¯¢å½“å‰æ¡£æ¡ˆåŽçš„é™çº§å€¼ã€‚ +- åªæœ‰æœ¬æ¬¡æ“作应ä¿å­˜çš„è½¦ç‰Œå’Œå¸æœºå§“åå¿«ç…§å‡é½å…¨æ—¶ï¼Œ`dataCompleteness` æ‰è¿”回 `COMPLETE`ï¼›å­˜é‡æ—¥å¿—ä¸ä¼šä¼ªé€ å¿«ç…§ã€‚ +- ä»…å˜æ›´è½¦è¾†ã€ä»…å˜æ›´å¸æœºã€åŒæ—¶å˜æ›´è½¦è¾†ä¸Žå¸æœºã€ä»…å˜æ›´è½¦è¾†è´¹ç”¨ï¼Œå‡ä»¥ `changeDimensions` 的实际值为准。 +- ID 按字符串返回,调用方ä¸å¾—转æ¢ä¸º JavaScript Number。 +- æœ¬æ¬¡ä¸æ”¹å˜æŽ¥å£è·¯å¾„ã€è¯·æ±‚傿•°ã€æƒé™ã€åˆ†é¡µã€æŽ’åºå’Œç»Ÿä¸€ `Result` å“应结构。 +- 快照仅包å«è½¦ç‰Œå’Œå¸æœºå§“åï¼Œä¸æ–°å¢žæ‰‹æœºå·ã€è¯ä»¶å·æˆ–å…¶ä»–æ•æ„Ÿä¿¡æ¯ã€‚ + +## 五ã€å‰ç«¯å½±å“ + +`frontend_status=not_required`。现有管ç†ç«¯å·²ç»å¯ä»¥ç›´æŽ¥å±•示æ“ä½œæ—¶é—´ã€æ“作人和åŽç«¯æ‘˜è¦ï¼Œæœ¬æ¬¡ TEST 页é¢å·²çœ‹åˆ°â€œåŽŸè½¦ç‰Œ/åŽŸå¸æœº → 新车牌/æ–°å¸æœºâ€çš„æ”¹æ´¾ç»“æžœï¼Œæ— éœ€åŒæ­¥ä¿®æ”¹å‰ç«¯ä»£ç ã€‚其他调用方如ä»è§£æž `detailJson`ï¼Œåº”é€æ­¥æ”¹ä¸ºä¼˜å…ˆæ¶ˆè´¹ `changeDetail`。 + +## å…­ã€éªŒè¯ä¸Žæµ‹è¯•è¯æ® + +- PR #5869 å·²åˆå…¥ `dev-v3`,åˆå¹¶æäº¤ï¼š`2d9c6ba4f8af1ad997b8b6e3ba7d215b9754ae66`ï¼›TEST çš„ Fleet æœåŠ¡åŒå®žä¾‹å¥åº·ã€‚ +- ä½¿ç”¨çœŸå®žç™»å½•èº«ä»½ç» TEST Gateway 调用 `GET /admin/fleet/orders/{orderId}/operation-log` 返回 200ã€‚è®¢å• `26-3420` çš„ 10 æ¡è®°å½•å‡å…·æœ‰éžç©ºæ“作时间ã€åŠ¨ä½œã€æ“作人和摘è¦ã€‚ +- TEST 管ç†ç«¯è®¢å• `26-6436` 的日志页é¢ç›´æŽ¥å±•示 `è’™A-E2E99/王信 → è’™A-E2E01/é“å°”å‰`ã€åŠ¨ä½œã€ç”Ÿæ•ˆæ—¥ã€æ“作人和时间。 +- åŒä¸€è®¢å• 3 æ¡å­˜é‡æ”¹æ´¾è®°å½•å‡è¿”回 `HISTORICAL_PARTIAL`,且 `changeDetail` å¿«ç…§ã€å±•示值ã€ä½¿ç”¨å¤©æ•°å’Œå—影哿—¥æœŸç­‰å¥‘çº¦å­—æ®µå®Œæ•´å­˜åœ¨ï¼ŒåŽ†å²æ— å¿«ç…§å­—æ®µä¿æŒ null。 +- #5862 定å‘自动化测试 620 项通过;Fleet 扩大测试 3604 项通过ã€0 失败ã€0 错误ã€7 è·³è¿‡ï¼›å›ºå®šç«¯å£ MySQL é›†æˆæµ‹è¯• 11/11 通过。 +- 为é¿å…é€šçŸ¥ã€æ´¾å•和审计副作用,TEST 验收未æäº¤æ–°çš„æ”¹æ´¾æ“作;新写日志 `COMPLETE` 快照路径由自动化测试覆盖,测试业务数æ®çŠ¶æ€æœªæ”¹å˜ã€‚ +- å·¥å•验收标准 14/14 已勾选,验收记录已写入,Issue #5862 已关闭。 + +## 七ã€ä¸å½±å“范围 + +- 䏿–°å¢žæˆ–修改数æ®åº“结构。 +- ä¸ä¿®æ”¹ç®¡ç†ç«¯ã€å°ç¨‹åºã€H5 或其他å‰ç«¯ä»£ç ã€‚ +- 䏿”¹å˜æ´¾å•çŠ¶æ€æœºã€æ´¾å•确认ã€å¸æœºé€šçŸ¥ã€ä¿é™©ã€ç»“算和车辆费用计算规则。 +- ä¸å›žå¡«æˆ–æ”¹å†™åŽ†å²æ—¥å¿—;历å²è®°å½•åªåšåªè¯»é™çº§å±•示。 + +## å…³è” + +- Issue: #5862 +- PR: #5869 +- åŽç«¯åˆå¹¶æäº¤: `2d9c6ba4f8af1ad997b8b6e3ba7d215b9754ae66` +- è”系人: @lc