---
schema: "hl-changelog/v2"
ticket: "N/A"
title: "核单「完成核单」按钮校验逻辑简化"
consumer: "admin"
change_type: "修改接口"
author: "yaosutu(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_owner: "mmg"
frontend_ref: "ce4d98b3"
target_release: ""
verified_at: ""
status_note: "已实现。canComplete 由 5 条减为 3 条 UI 态防误触（hasLoadingStep/hasSavingStep/dirty），askComplete 同步删 vehicleSettlementBlocked 兜底拦截，并删除车辆分类顶部常驻提示条；LEGACY 金额未知空态的车辆编辑锁保留（防空草稿存成 0 元）。frontend_ref=ce4d98b3。"
updated_at: "2026-08-09"
base: "dev-v3"
---

# 核单「完成核单」按钮校验逻辑简化

## 变更类型
修改接口（前端逻辑调整，后端零改动）

## 端类型
管理后台

## 变更说明

「完成核单」按钮的前端校验逻辑简化，去掉业务约束类校验，只保留 UI 态防误触校验。

### 改动前（5 条校验）

```javascript
const canSubmit = computed(() =>
  !hasLoadingStep &&      // 1. 没有任何分类在加载中
  !hasSavingStep &&       // 2. 没有任何分类在保存中
  !dirty &&               // 3. 没有任何未保存的修改
  !vehicleSettlementBlocked &&  // 4. 车辆核单状态不被拦（删）
  reportsReady            // 5. 司机报账表 + 单团核算表都已生成（删）
)
```

### 改动后（3 条校验）

```javascript
const canSubmit = computed(() =>
  !hasLoadingStep &&      // 1. 没有任何分类在加载中
  !hasSavingStep &&       // 2. 没有任何分类在保存中
  !dirty                  // 3. 没有任何未保存的修改
)
```

### 删除的 2 条校验及原因

| 删除项 | 原因 |
|---|---|
| `vehicleSettlementBlocked` | 后端 `finalize` 已有统一硬校验（`performSubmitBlockingChecks`），前端无需重复拦截 |
| `reportsReady` | 报表是 finalize 的**产出**而非**前置条件**，逻辑反了，直接删除 |

### 后端统一拦截行为

用户点击「完成核单」后，后端 `finalize` 接口统一校验：
- 对账一致性（支付流水 = 手工收款）
- 车辆费用 freeze 校验
- 导游/摄影费用确认状态
- 司机结算完成 + 转账凭证
- 其他收入确认状态

校验失败返回对应错误码 + 提示信息，前端直接展示即可。

## 影响范围
- 管理后台核单页面「完成核单」按钮
- 后端零改动

## 关联
- 无 Issue（口头需求）
