From 69c0b76bb94f044a29b4b3a0c608d1d31f4f89fb Mon Sep 17 00:00:00 2001 From: lc Date: Wed, 30 Sep 2026 16:21:51 +0800 Subject: [PATCH] =?UTF-8?q?docs(changelog):=20#8579=20=E6=8E=A5=E9=80=81?= =?UTF-8?q?=E6=9C=BA=E9=85=8D=E7=BD=AE=E8=A1=A5=E5=8F=91=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E6=94=BE=E5=AE=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs wx/HL#8579 --- ...Ž¥送机配置补发条件放宽-修改接口-管理后台.md | 266 ++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 changelogs-v2/2026-09/30_8579_接送机配置补发条件放宽-修改接口-管理后台.md diff --git a/changelogs-v2/2026-09/30_8579_接送机配置补发条件放宽-修改接口-管理后台.md b/changelogs-v2/2026-09/30_8579_接送机配置补发条件放宽-修改接口-管理后台.md new file mode 100644 index 00000000..c7706fc1 --- /dev/null +++ b/changelogs-v2/2026-09/30_8579_接送机配置补发条件放宽-修改接口-管理后台.md @@ -0,0 +1,266 @@ +--- +schema: "hl-changelog/v2" +ticket: "8579" +title: "接送机配置接口补发条件放宽:门禁已满足且订单有接送机声明时重存也会补发最终方案,NO_GATE_TRANSITION 出现频率下降" +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 #8595 已合并 dev-v3(0f19f383f),hl-fleet-service 已部署 TEST(8e00cc98b)并经 Gateway 实测。响应结构未变,前端无需改代码。" +updated_at: "2026-09-30" +base: "dev-v3" +--- + +# hl-fleet-service: 接送机配置接口补发条件放宽 + +> **存放目录**: `changelogs-v2/2026-09/` +> **服务**: hl-fleet-service (端口 8089) +> **PR**: #8595 +> **Issue**: #8579 +> **日期**: 2026-09-30 +> **影响范围**: 车务四步向导第③步「接送机配置」保存后的最终方案补发 + +--- + +## ⚠️ 关键变化 + +- **以前**:只有「本次保存前门禁不满足、保存后满足」才补发最终方案;门禁本来就满足时再保存一次,一律回 `NO_GATE_TRANSITION`、不补发。 +- **现在**:保存后门禁满足,并且(保存前不满足,**或**订单大交通有接送机声明)就尝试补发。门禁本来就满足、订单有接送机声明时重存,也会补发。 +- **补发仍要过全部守卫**:换版后留下旧定稿(`STALE_FINALIZED_PLAN`)、方案代际不一致、没派满,照样不发,并如实回原因。换版后的订单仍须车务重新确认执行,本次没有绕开这道守卫。 +- **前端无需改代码**:请求体、响应结构、错误码都没变;只是 `finalPlanPublished=true` 出现得更多、`NO_GATE_TRANSITION` 出现得更少。 + +--- + +## 二、变更接口清单 + +| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | +|---|------|------|------|----------|------| +| 1 | 接送机配置(按派车行整批幂等覆盖) | PUT | `/admin/fleet/assignments/pickup-dropoff-config` | 补发时机放宽 | 请求、响应结构不变 | + +--- + +## 三、接口详情 + +### 1. 接送机配置 `PUT /admin/fleet/assignments/pickup-dropoff-config` + +**VO**: `PickupDropoffConfigReqVO → PickupDropoffConfigRespVO` + +#### 使用场景 + +车务四步向导第③步保存接送机勾选。排车(`POST /admin/fleet/assignments/batch`)时大交通要求接/送机的日期还没配车,最终方案被压住(batch 回 `GATE_UNSATISFIED`);在本接口配齐后,服务端当场补发。 + +#### 入参(未变) + +| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | +|------|------|------|------|------|------| +| `orderId` | Body | Long | ✅ | - | 订单 ID | +| `requirementId` | Body | Long | ✅ | - | 当前生效用车需求 ID | +| `kind` | Body | String | - | `TRAVEL`(默认)/ `TRANSFER` | 需求类别 | +| `requestId` | Body | String | ✅ | 非空 | 幂等请求标识 | +| `items[]` | Body | Array | ✅ | 只列参与接送的行 | 两个标志都为 false 的行不要放进来(否则 400);未列入的行服务端置 0 | +| `items[].assignmentId` | Body | Long | ✅ | 当前需求下生效派车行 | 派车行 ID | +| `items[].pickupParticipant` | Body | Boolean | ✅ | - | 当天是否参与接机 | +| `items[].dropoffParticipant` | Body | Boolean | ✅ | - | 当天是否参与送机 | + +#### 出参 `Result`(结构未变) + +| 字段 | 类型 | 说明 | +|------|------|------| +| `finalPlanPublished` | Boolean | 本次是否补发了最终方案 | +| `finalPlanNotPublishedReason` | String | 未补发原因,补发时为 `null`;取值见六.5 | +| `requirementReopened` | Boolean | 是否把已完成订单拉回处理中(未变) | +| `reopenBlockedReason` | String | 本该拉回却没拉回的原因(未变) | +| `pickupDropoffGate` | Object | 写入后的门禁状态:`arrivalRequiredDates` / `departureRequiredDates` / `missingPickupDates` / `missingDropoffDates` / `declared` / `satisfied` | + +#### 请求示例 + +```json +{ + "orderId": "2105196047255126017", + "requirementId": "2105197351138410497", + "kind": "TRAVEL", + "requestId": "pd-2105196047255126017-20260930-02", + "items": [ + { "assignmentId": "2105197584132046850", "pickupParticipant": true, "dropoffParticipant": false }, + { "assignmentId": "2105197584157212674", "pickupParticipant": false, "dropoffParticipant": true } + ] +} +``` + +#### 响应示例(配齐即补发) + +```json +{ + "code": 200, + "message": "成功", + "success": true, + "data": { + "finalPlanPublished": true, + "finalPlanNotPublishedReason": null, + "requirementReopened": false, + "reopenBlockedReason": null, + "pickupDropoffGate": { + "arrivalRequiredDates": ["2026-10-12"], + "departureRequiredDates": ["2026-10-14"], + "missingPickupDates": [], + "missingDropoffDates": [], + "declared": true, + "satisfied": true + } + } +} +``` + +#### 响应示例(换版后配齐,仍被陈旧定稿拦下) + +```json +{ + "code": 200, + "message": "成功", + "success": true, + "data": { + "finalPlanPublished": false, + "finalPlanNotPublishedReason": "STALE_FINALIZED_PLAN", + "requirementReopened": false, + "reopenBlockedReason": null, + "pickupDropoffGate": { "declared": true, "satisfied": true, "missingPickupDates": [], "missingDropoffDates": [] } + } +} +``` + +#### 空数据 / 降级响应 + +订单大交通没有接送机声明时 `pickupDropoffGate` 各日期数组为空、`declared=false`、`satisfied=true`;此时重存不补发: + +```json +{ "code": 200, "success": true, "data": { "finalPlanPublished": false, "finalPlanNotPublishedReason": "NO_GATE_TRANSITION", "pickupDropoffGate": { "declared": false, "satisfied": true, "missingPickupDates": [], "missingDropoffDates": [] } } } +``` + +#### 错误响应 + +```json +{ + "code": 400, + "message": "同一行接送机标志不能全为 false;不参与的行不要出现在配置列表中", + "success": false, + "data": null +} +``` + +#### 业务边界 + +- 补发时机:保存后门禁满足,且保存前不满足或订单有接送机声明。订单大交通没有接送机声明时,重存不会补发(回 `NO_GATE_TRANSITION`),避免每存一次都发一版没有变化的最终方案。 +- 补发仍依次过陈旧定稿、方案代际、满派拓扑、接送机门禁四道判据,只回第一个没通过的原因。 +- 同一需求多次补发,order-v3 的配车记录按最新一版整体替换,不会重复累加。 + +--- + +## 四、契约约束与正确调用方式 + +- `finalPlanPublished=false` 不是错误,按 `finalPlanNotPublishedReason` 提示车务下一步:`GATE_UNSATISFIED`/`NO_GATE_TRANSITION` 看 `pickupDropoffGate.missing*Dates` 补配;`STALE_FINALIZED_PLAN` 提示车务重新确认执行;`PLAN_INCOMPLETE` 提示补派。 +- 不要按 `NO_GATE_TRANSITION` 判断「这次保存没生效」:勾选照常落库,它只表示本次没有尝试补发。 + +--- + +## 五、数据库行为 + +- 补发时写 fleet `fleet_vehicle_assignment_snapshot_state`(修订号 +1)和 `fleet_vehicle_assignment_snapshot_outbox`,再异步写 order-v3 `order_vehicle_assignment`(旧行软删、按新一版重建)。 +- 不补发时只更新派车行的接送标志。 + +--- + +## 六、边界行为 + +- 未登录 → 401(网关拦截) +- `items` 含两个标志都为 false 的行 → 400「同一行接送机标志不能全为 false」 +- 换版后未经车务重新确认 → 不补发,回 `STALE_FINALIZED_PLAN` + +--- + +## 六.5、枚举 / 数据字典 + +### finalPlanNotPublishedReason(`FinalPlanNotPublishedReasons`) + +| 取值 | 含义 | +|------|------| +| `STALE_FINALIZED_PLAN` | 存在按旧需求定稿的陈旧行,需车务重新确认 | +| `INVALID_PLAN_GENERATION` | 方案代际不一致 | +| `PLAN_INCOMPLETE` | 满派拓扑不完整(缺车 / 缺司机 / 在途行越窗等) | +| `CAPACITY_INSUFFICIENT` | 未定稿方案载客量不足 | +| `GATE_UNSATISFIED` | 大交通要求的接/送机日未配车 | +| `NO_GATE_TRANSITION` | **口径变化**:本次没有尝试补发——保存后门禁仍不满足,或门禁满足但订单没有接送机声明且保存前已满足 | +| `PICKUP_DROPOFF_GATE_DISABLED` | 接送机门禁开关关闭 | + +--- + +## 六.6、修改前后对比 + +### 行为级对比 + +| 场景 | 修改前 | 修改后 | +|------|--------|--------| +| 保存前缺配、保存后配齐 | 补发 | 补发(不变) | +| 门禁本已满足、订单有接送机声明,再保存 | `NO_GATE_TRANSITION`,不补发 | 尝试补发(过全部守卫) | +| 门禁本已满足、订单无接送机声明,再保存 | `NO_GATE_TRANSITION` | `NO_GATE_TRANSITION`(不变) | +| 保存后仍缺配 | `NO_GATE_TRANSITION` | `NO_GATE_TRANSITION`(不变) | +| 换版后配齐 | `NO_GATE_TRANSITION` 或 `STALE_FINALIZED_PLAN` | `STALE_FINALIZED_PLAN` | + +--- + +## 六.7、影响评估 + +- **是否破坏向后兼容**: 否 +- **前端是否必须同步上线**: 否 +- **前端 workaround 清理点**: 无 + +--- + +## 七、不影响范围 + +- **仅影响**: `PUT /admin/fleet/assignments/pickup-dropoff-config` 的补发时机 +- **零影响**: 请求体与响应结构;`POST /admin/fleet/assignments/batch`;确认执行接口(缺失日期字段的删除见 #8603 changelog) + +--- + +## 八、测试环境已验证 + +2026-09-30 TEST(hl-fleet-service @ 8e00cc98b)经 Gateway 实测,夹具订单验收后已行前取消: + +| 场景 | 结果 | +|------|------| +| batch 排满三天、首日接机末日送机未配 | `finalPlanPublished=false` + `GATE_UNSATISFIED`,缺 `2026-10-12` / `2026-10-14` | +| 只配接机 | `NO_GATE_TRANSITION`,门禁仍缺 `2026-10-14` | +| 配齐接机 + 送机 | `finalPlanPublished=true`,outbox 1 行,order-v3 配车记录 3 行 | +| 换版后配齐 | `finalPlanPublished=false` + `STALE_FINALIZED_PLAN`,门禁 `satisfied=true`,无快照发出 | + +--- + +## 九、相关历史 PR + +- #8429:统一 batch / 接送机配置 / 确认三处的最终方案发布判据,引入 `finalPlanNotPublishedReason`。 +- #8603(PR #8608):确认执行响应删除恒为空的缺失日期字段,缺失日期改由 605914/605915 错误消息承载。 + +--- + +## 十、相关文档 + +- 关联 Issue: [wx/HL#8579](https://git.1814.love/wx/HL/issues/8579) +- 关联 PR: [wx/HL#8595](https://git.1814.love/wx/HL/pulls/8595) + +## 关联 / 联系人 + +### 链接 + +- **Issue**: [#8579](https://git.1814.love/wx/HL/issues/8579) +- **PR**: [#8595](https://git.1814.love/wx/HL/pulls/8595) +- **Merge commit**: [0f19f383f](https://git.1814.love/wx/HL/commit/0f19f383faf3f0df9489b342c15afb42addf09f5) + +### 联系人 + +- 后端:@lc