---
schema: "hl-changelog/v2"
ticket: "5594"
title: "退保前校验保单已出单，未出单撤销投保任务而非退保成功"
consumer: "admin"
author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: ""
status_note: "后端完成：PR #5606 已合并 dev-v3 并部署 TEST，网关验证通过。退保收敛前校验保单已出单（INSURED），未出单时撤销投保任务并收敛退保为撤销终态，不再产生'未投保却退保成功'假象。"
updated_at: "2026-08-06"
base: "dev-v3"
generated: "2026-08-06T16:10:00+08:00"
---

# 退保前校验保单已出单，未出单撤销投保任务而非退保成功

> 后端完成：PR #5606 已合并 dev-v3 并部署 TEST，网关验证通过。

## 关联 / 联系人

### 链接

- **Issue**: [#5594](https://git.1814.love:8443/wx/HL/issues/5594)
- **PR**: [#5606](https://git.1814.love:8443/wx/HL/pulls/5606)
- **Merge commit**: [a95d949b](https://git.1814.love:8443/wx/HL/commit/a95d949b)

### 联系人

- **后端负责人**: @wx

## 背景

TEST 实证（道尔吉 08-30）：派单取消退保时，投保任务（PURCHASE）仍处于 PENDING（错误 100503「司机险任务锁暂不可用」，insurance_order_id 为空），但同日退保检查（REFUND_CHECK）已收敛 SUCCESS——形成「未投保成功却退保成功」假象。

根因：`refundServiceDateIfNoActiveAssignment` 在退保候选保单（INSURED/INSURING）为空时直接收敛 REFUND_CHECK 为 SUCCESS；`retryRefund`/`refundPolicyUnderLifecycleLock` 在无保单或非退保候选时按幂等「退保成功」收敛——未出单投保任务被悬挂、退保却显示成功，投保/退保状态机不一致。

## 变更接口

| 方法 | 路径 | 来源 | 说明 |
|---|---|---|---|
| `GET` | `/fleet/driver-insurance/task/list` | `DriverInsuranceController`（fleet） | 状态枚举新增 `CANCELLED`（已撤销）终态：未出单投保任务撤销后任务列表展示「已撤销」，退保任务同样收敛为「已撤销」而非「成功」 |

无请求/响应字段增减；仅 `FleetInsuranceTaskStatusEnum` 新增 `CANCELLED` 状态值，管理后台任务状态展示与筛选可见新增状态。**无前端 API 变化**。

## 行为变化

- **退保前校验保单已出单**：`refundServiceDateIfNoActiveAssignment` 发现该司机该服务日无已出单保单（INSURED）且存在未出单投保任务（PURCHASE PENDING/PROCESSING 且 insurance_order_id 为空）时，先撤销投保任务为 `CANCELLED`（终态），再收敛退保任务为撤销终态，**不再产生「退保成功」假象**
- **幂等边界**：已有保险订单的投保中任务（如退保后重投）不撤销，避免误伤合法在途投保
- **投保/退保状态机一致性**：PURCHASE 未出单 → CANCELLED（撤销，无保单）；REFUND/REFUND_CHECK 在无投保任务时保持既有幂等 SUCCESS（权威保单本就无可退）；撤销场景统一收敛 CANCELLED
- **汇总收敛**：`summarizeRefundChecks` 将 CANCELLED 计为撤销收敛，避免误判 RETRYABLE_FAILURE 无限重试

## 前端/调用方动作

无。任务列表状态展示自动透出新枚举值「已撤销」，无需前端配合。

## 验证证据

- 定向测试：FleetInsuranceTaskServiceTest 142/142（含 3 个新增用例：取消退保撤销投保、无任务幂等成功、重试退保撤销）；保险域 187 项全过
- fleet verify **3199 项**（含 MySQL 集成）0 失败；spotless 通过
- 网关验证（TEST，16:22 部署后）：① 任务列表 200，道尔吉 08-30 存量任务可见（PURCHASE PENDING 未出单 + REFUND SUCCESS 旧假象），部署未破坏存量；② 保单接口实证 08-30 起保保单 0 张（"未投保却退保成功"场景实锤）；③ 对已 SUCCESS REFUND 任务 retry 幂等安全（返回 SUCCESS、不调保司、不重复退保）
