# 运输计划需求卡

## 目录

- [REQ-PLAN-001 菜单入口](#req-plan-001-菜单入口)
- [REQ-PLAN-002 列表与分页](#req-plan-002-列表与分页)
- [REQ-PLAN-003 条件查询与重置](#req-plan-003-条件查询与重置)
- [REQ-PLAN-004 状态展示与操作列](#req-plan-004-状态展示与操作列)
- [REQ-PLAN-005 新增运输计划](#req-plan-005-新增运输计划)
- [REQ-PLAN-006 编辑运输计划](#req-plan-006-编辑运输计划)
- [REQ-PLAN-007 查看运输计划](#req-plan-007-查看运输计划)
- [REQ-PLAN-008 基本信息规则](#req-plan-008-基本信息规则)
- [REQ-PLAN-009 收发货信息规则](#req-plan-009-收发货信息规则)
- [REQ-PLAN-010 非公路地址规则](#req-plan-010-非公路地址规则)
- [REQ-PLAN-011 货物信息规则](#req-plan-011-货物信息规则)
- [REQ-PLAN-012 运输数量合计](#req-plan-012-运输数量合计)
- [REQ-PLAN-013 附件规则](#req-plan-013-附件规则)
- [REQ-PLAN-014 选择常用地址](#req-plan-014-选择常用地址)
- [REQ-PLAN-015 选择常用线路](#req-plan-015-选择常用线路)
- [REQ-PLAN-016 选择常用货物](#req-plan-016-选择常用货物)
- [REQ-PLAN-017 批量导入](#req-plan-017-批量导入)
- [REQ-PLAN-018 批量导出](#req-plan-018-批量导出)
- [REQ-PLAN-019 复制运输计划](#req-plan-019-复制运输计划)
- [REQ-PLAN-020 调度运输计划](#req-plan-020-调度运输计划)
- [REQ-PLAN-021 取消运输计划](#req-plan-021-取消运输计划)
- [REQ-PLAN-022 完成运输计划](#req-plan-022-完成运输计划)
- [REQ-PLAN-023 删除运输计划](#req-plan-023-删除运输计划)
- [REQ-PLAN-024 底部操作按钮](#req-plan-024-底部操作按钮)
- [REQ-PLAN-025 权限与审计](#req-plan-025-权限与审计)
- [REQ-PLAN-026 计划详情布局](#req-plan-026-计划详情布局)
- [REQ-PLAN-027 详情基本信息](#req-plan-027-详情基本信息)
- [REQ-PLAN-028 详情调度数据](#req-plan-028-详情调度数据)
- [REQ-PLAN-029 详情运单记录](#req-plan-029-详情运单记录)
- [REQ-PLAN-030 详情操作按钮](#req-plan-030-详情操作按钮)
- [REQ-PLAN-031 计划调度页布局](#req-plan-031-计划调度页布局)
- [REQ-PLAN-032 待调度列表](#req-plan-032-待调度列表)
- [REQ-PLAN-033 新增编辑调度弹窗](#req-plan-033-新增编辑调度弹窗)
- [REQ-PLAN-034 精简录入调度信息](#req-plan-034-精简录入调度信息)
- [REQ-PLAN-035 完整录入调度信息](#req-plan-035-完整录入调度信息)
- [REQ-PLAN-036 调度货量与费用规则](#req-plan-036-调度货量与费用规则)
- [REQ-PLAN-037 调度保存与生成运单](#req-plan-037-调度保存与生成运单)
- [REQ-PLAN-038 计划导入页布局](#req-plan-038-计划导入页布局)
- [REQ-PLAN-039 导入信息填写](#req-plan-039-导入信息填写)
- [REQ-PLAN-040 导入模板字段](#req-plan-040-导入模板字段)
- [REQ-PLAN-041 导入数据校验](#req-plan-041-导入数据校验)
- [REQ-PLAN-042 错误报告下载](#req-plan-042-错误报告下载)
- [REQ-PLAN-043 待导入数据明细](#req-plan-043-待导入数据明细)
- [REQ-PLAN-044 疑似重复处理](#req-plan-044-疑似重复处理)
- [REQ-PLAN-045 确认导入生成运单](#req-plan-045-确认导入生成运单)
- [通用规则](#通用规则)

---

### REQ-PLAN-001 菜单入口

- 功能点：
  - 运输计划模块归属于“业务管理”主菜单。
  - 在“业务管理”菜单下提供“运输计划”模块入口。
  - 用户进入运输计划页面后，可进行查询、新建计划、导入计划、导出、编辑、复制、调度、详情、取消、完成、删除等操作。

- 异常与边界：
  - 无菜单权限时不展示“业务管理”或“运输计划”入口。
  - 有菜单权限但无按钮权限时，仅展示允许访问的页面和操作。
  - 菜单加载失败时提示失败原因，不影响其他已有菜单访问。

- 反例：
  - 不允许把运输计划挂到非业务管理主菜单下。
  - 不允许无权限用户通过 URL 直接进入模块。
  - 不允许菜单入口存在但页面无法正常访问。

---

### REQ-PLAN-002 列表与分页

- 功能点：
  - 默认展示当前组织下的运输计划数据。
  - 列表展示字段与编辑表单字段保持一致，并额外展示创建时间、更新时间。
  - 列表至少展示项目、客户合同、计划名称、计划单号、运输类型、计划开始日期、计划结束日期、收发货信息、货物信息、附件、备注、状态、创建时间、更新时间、操作等信息。
  - 状态列和操作按钮列固定在右侧，不随横向滚动条滑动。
  - 支持勾选多行数据用于批量导出。
  - 分页默认10条/页，支持20/50/100条/页。

- 异常与边界：
  - 查询无数据时展示空状态。
  - 横向字段较多时允许表格横向滚动，但状态列和操作列必须保持固定。
  - 当前页数据因删除、取消、完成等操作发生变化后，应刷新列表并保持分页逻辑正确。
  - 列表加载失败时保留当前查询条件和分页条件，提示用户重新查询。

- 反例：
  - 不允许状态列或操作列被横向滚动隐藏。
  - 不允许列表字段与编辑表单长期不一致。
  - 不允许分页后丢失当前查询条件。

---

### REQ-PLAN-003 条件查询与重置

- 功能点：
  - 支持按计划单号、计划名称、客户名称、运输类型、货物名称、货物类型、发货地址、收货地址、计划开始时间、计划结束时间、状态、数据来源等条件组合查询。
  - 计划单号、货物名称、发货地址、收货地址使用输入框。
  - 计划名称、客户名称、货物类型使用输入搜索下拉框。
  - 运输类型、状态、数据来源使用下拉单选控件。
  - 计划开始时间、计划结束时间使用日期范围选择器。
  - 点击查询后，根据当前已输入或已选择条件筛选列表。
  - 点击重置后清空所有查询条件，恢复默认列表。

- 异常与边界：
  - 查询条件为空时点击查询，按默认规则展示当前组织数据。
  - 查询结果为空时展示空状态，不清空用户已输入条件。
  - 重置后页码恢复第一页，并重新加载列表。
  - 日期范围格式不合法或开始时间晚于结束时间时阻止查询并提示。
  - 页面中出现重复业务字段时，应按同一查询含义处理，避免生成互相冲突的隐藏条件。

- 反例：
  - 不允许重置后仍保留隐藏查询条件。
  - 不允许只按单个条件查询而忽略其他已选择条件。
  - 不允许日期范围错误时继续请求列表数据。

---

### REQ-PLAN-004 状态展示与操作列

- 功能点：
  - 运输计划状态包含草稿、待调度、调度中、已完成、已取消。
  - 草稿状态可执行编辑、复制、删除；草稿来源于新建计划时点击暂存。
  - 待调度状态可执行调度、编辑、详情、复制、取消；待调度表示计划下未下挂任何运单。
  - 调度中状态可执行调度、详情、复制、完成；调度中表示计划下已下挂待执行、进行中或完成运单，已取消运单除外。
  - 已完成状态可执行详情、复制。
  - 已取消状态可执行详情、复制。
  - 操作按钮列固定在右侧，按钮展示受状态和权限共同控制。

- 异常与边界：
  - 状态为空或状态值未知时，列表应展示兜底文案，并限制高风险操作。
  - 操作执行前需重新校验最新状态，避免列表状态过期导致误操作。
  - 状态变更成功后刷新列表，展示最新状态和可执行操作。

- 反例：
  - 不允许草稿状态执行调度。
  - 不允许已完成或已取消状态继续编辑、删除、调度、完成。
  - 不允许仅根据前端显示状态跳过后端状态校验。

---

### REQ-PLAN-005 新增运输计划

- 功能点：
  - 点击“新建计划”按钮后跳转至新建运输计划页面。
  - 新建页面包含基本信息、收发货信息、货物信息、附件等区域。
  - 基本信息区包含项目、客户合同、计划名称、计划单号、运输类型、计划开始日期、计划结束日期、备注。
  - 收发货信息、货物信息、附件按运输计划新建页面布局展示。
  - 支持通过选择常用地址、选择常用线路、选择常用货物快速回填表单信息。
  - 点击确认创建后校验必填字段并创建计划，创建成功提示并返回列表。
  - 点击暂存后保存为草稿，保存成功提示并返回列表。

- 异常与边界：
  - 项目、客户合同、计划名称、计划单号、运输类型等必填项为空时，确认创建应阻止提交并提示。
  - 发货地址、收货地址、货物类型等核心业务字段缺失时，确认创建应阻止提交并提示。
  - 计划单号生成失败时阻止保存并提示。
  - 字段长度、日期、数值、枚举、附件格式不符合规则时阻止提交并提示。
  - 提交失败时保留用户已填写内容，方便修正后重新提交。

- 反例：
  - 不允许用户手工填写或修改计划单号。
  - 不允许确认创建缺少项目、合同、运输类型、收发货地址或货物类型的计划。
  - 不允许选择常用数据后只回填部分关键字段导致数据不完整。

---

### REQ-PLAN-006 编辑运输计划

- 功能点：
  - 草稿和待调度状态支持点击编辑，跳转至编辑页面。
  - 编辑页面回显运输计划完整信息。
  - 计划单号在编辑状态下只读不可编辑。
  - 项目、客户合同、计划名称、运输类型、计划开始日期、计划结束日期、收发货信息、货物信息、附件、备注等字段按规则编辑。
  - 编辑保存成功后刷新列表，并展示最新更新时间。

- 异常与边界：
  - 编辑前需校验当前计划状态，非草稿、非待调度状态不允许进入可编辑提交流程。
  - 修改项目时，客户合同应按新项目重新带出或重新选择。
  - 修改运输类型时，收发货地址控件和校验规则应按新运输类型重新匹配。
  - 编辑的数据已不存在时提示数据不存在，并刷新列表。
  - 提交失败时保留用户修改内容。

- 反例：
  - 不允许编辑时修改计划单号。
  - 不允许调度中、已完成、已取消状态继续提交编辑。
  - 不允许修改运输类型后继续沿用旧类型不适用的地址数据。

---

### REQ-PLAN-007 查看运输计划

- 功能点：
  - 支持点击详情查看运输计划完整信息。
  - 详情页上方展示计划概要信息，下方展示当前计划关联的运单记录。
  - 详情页展示基本信息、收发货信息、货物信息、附件、调度数据、运单记录、状态、创建时间、更新时间等内容。
  - 详情页字段仅供查看，不允许编辑。
  - 草稿以外的可查看状态包含待调度、调度中、已完成、已取消。
  - 详情页支持通过运单记录查看对应运单详情。

- 异常与边界：
  - 数据已删除或不存在时提示数据不存在，并刷新列表。
  - 详情加载失败时提示失败原因，不改变列表数据。
  - 附件加载失败时不影响其他字段展示。
  - 关联运单记录加载失败时保留计划概要信息，并提示运单记录加载失败。

- 反例：
  - 不允许在详情状态下保存修改。
  - 不允许详情页出现删除货物行、上传附件等编辑操作。
  - 不允许查看时自动切换为编辑状态。
  - 不允许详情页修改关联运单数据。

---

### REQ-PLAN-008 基本信息规则

- 功能点：
  - 项目使用模糊搜索选择框，必填，用于选择计划所属项目。
  - 客户合同选择项目后联动带出，必填，不允许脱离项目单独维护；若项目下存在多个客户合同，则以下拉方式供用户选择。
  - 计划名称使用输入框，必填，最长50字符。
  - 计划单号由系统自动生成，只读展示，规则为 JH + 8位年月日 + 3位流水号。
  - 运输类型选择项目时自动带出，必填，允许用户修改。
  - 计划开始日期和计划结束日期使用日期选择框，非必填。
  - 备注使用输入框或文本域，非必填，最长200字符。

- 异常与边界：
  - 项目为空时阻止确认创建并提示。
  - 客户合同未能根据项目带出或用户未选择时阻止确认创建。
  - 计划名称为空或超过50字符时阻止提交并提示。
  - 计划单号为空、生成失败或重复时阻止保存并提示。
  - 计划开始日期晚于计划结束日期时阻止提交并提示。
  - 计划结束日期早于计划开始日期时阻止提交并提示。
  - 运输类型为空或不在枚举范围内时阻止提交。
  - 备注超过200字符时阻止提交并提示。

- 反例：
  - 不允许未选择项目时选择客户合同。
  - 不允许客户合同脱离项目被单独修改。
  - 不允许计划结束日期早于计划开始日期。
  - 不允许手工改写系统生成的计划单号。

---

### REQ-PLAN-009 收发货信息规则

- 功能点：
  - 收发货信息包含发货地址、收货地址、发货联系人、发货联系方式、收货联系人、收货联系方式、计划发货日期、计划完成日期等信息。
  - 发货地址、收货地址为必填。
  - 公路运输时，发货地址和收货地址可从常用地址选择、从常用线路回填，或按地址选择逻辑填写。
  - 选择地址后自动带出地址名称、详细地址、经度、纬度等关联信息，并回填当前表单。
  - 选择常用线路后自动回填发货地址、收货地址及对应联系人、联系方式。
  - 发货联系人、收货联系人使用输入框，最长20字符。
  - 发货联系方式、收货联系方式使用输入框，最长20字符。

- 异常与边界：
  - 发货地址或收货地址为空时阻止确认创建并提示。
  - 地址选择返回信息不完整时阻止提交，并提示重新选择地址。
  - 联系人超过20字符时阻止提交。
  - 联系方式超过20字符或格式不合法时阻止提交。
  - 计划完成日期早于计划发货日期时阻止提交。

- 反例：
  - 不允许保存缺失发货地址或收货地址的计划。
  - 不允许选择地址后只回填地址名称而丢失详细地址、经纬度等关联信息。
  - 不允许计划完成日期早于计划发货日期。

---

### REQ-PLAN-010 非公路地址规则

- 功能点：
  - 当运输类型为水运或海运时，发货地址和收货地址显示为港口选择，并从基础数据中选择港口。
  - 当运输类型为空运时，发货地址和收货地址显示为空港选择，并从基础数据中选择空港。
  - 当运输类型为铁运时，发货地址和收货地址显示为站点选择，并从基础数据中选择站点。
  - 非公路运输的收发地址只能从对应基础数据中选择。
  - 通过常用地址或常用线路回填非公路地址时，也必须校验地址类型与当前运输类型匹配。

- 异常与边界：
  - 非公路运输未选择对应基础数据时阻止提交。
  - 常用地址或常用线路中的地址不是当前运输类型对应的港口、空港、站点时，不允许选择并 toast 提示“请选择港口/空港/车站地址”。
  - 切换运输类型后，应清空不适用的收发地址并要求重新选择。
  - 基础数据已删除或不可用时提示重新选择。

- 反例：
  - 不允许水运、空运、铁运继续使用公路地址自由输入逻辑。
  - 不允许非公路运输选择与运输类型不匹配的常用地址或常用线路。
  - 不允许运输类型切换后沿用旧类型地址数据。

---

### REQ-PLAN-011 货物信息规则

- 功能点：
  - 货物信息以明细行方式维护，每行可独立新增或删除。
  - 货物名称使用输入框，最长50字符，非必填。
  - 货物类型使用下拉搜索单选控件，必填，来源于货物类型基础数据。
  - 数量使用数字输入框，非必填。
  - 数量单位使用下拉单选控件，非必填，枚举包含吨、件、立方米等。
  - 包装使用下拉单选控件，非必填。
  - 品牌、规格、型号使用输入框，最长50字符。
  - 物料编码、设备编码使用输入框，最长30字符。
  - 货物行备注使用输入框，最长50字符。
  - 支持导入货物。
  - 支持选择常用货物，将常用货物信息回填到货物明细行。
  - 每行支持删除，最后一行支持新增一行。

- 异常与边界：
  - 货物类型为空时阻止确认创建并提示。
  - 数量小于0或不是数值时阻止提交。
  - 数量单位不在枚举范围内时阻止提交。
  - 货物名称、品牌、规格、型号、行备注超过50字符时阻止提交。
  - 物料编码、设备编码超过30字符时阻止提交。
  - 删除最后一行货物明细时应保留一条空行或提示至少保留一行。

- 反例：
  - 不允许无货物明细确认创建计划。
  - 不允许货物类型为空的明细行参与保存。
  - 不允许导入货物后覆盖用户已确认的不相关字段。

---

### REQ-PLAN-012 运输数量合计

- 功能点：
  - 货物信息下方展示运输数量合计。
  - 运输数量合计由系统根据货物明细中的数量自动计算。
  - 计划运输量为计划中填写的货物信息的货物数量求和。
  - 当货物明细数量变更、新增或删除时，运输数量合计同步刷新。
  - 若货物明细未填写数量，则该计划无可自动完成的计划运输量，后续完成需手动点击完成。

- 异常与边界：
  - 货物明细存在不同数量单位时，应按系统业务口径分单位汇总或提示无法合并，不得错误合计为单一数值。
  - 货物数量为空时不参与自动求和。
  - 货物数量为负数或格式错误时阻止提交并提示。

- 反例：
  - 不允许用户手工改写系统自动计算的运输数量合计。
  - 不允许把空数量当作0后误判计划已达到自动完成条件。
  - 不允许不同单位货物被无提示地合并成一个运输量。

---

### REQ-PLAN-013 附件规则

- 功能点：
  - 支持上传运输计划相关附件。
  - 附件为非必填，支持多个文件。
  - 支持 JPG、PNG、PDF 等常用业务附件格式。
  - 编辑时支持查看、追加或删除附件。
  - 详情页支持查看或下载附件，不允许上传或删除。

- 异常与边界：
  - 附件格式不支持时阻止上传并提示。
  - 附件上传失败时保留页面已填写内容。
  - 删除附件时需确认用户操作。
  - 附件已失效或下载失败时提示失败原因。

- 反例：
  - 不允许不支持格式的附件静默上传成功。
  - 不允许附件上传失败导致整页已填内容丢失。
  - 不允许详情状态下上传或删除附件。

---

### REQ-PLAN-014 选择常用地址

- 功能点：
  - 支持打开选择常用地址弹窗。
  - 弹窗支持按地址名称、地址类型、详细地址等条件查询。
  - 列表展示地址名称、地址编号、类型、站点编码、详细地址、操作等字段。
  - 常规地址的站点编码显示为“/”。
  - 点击选择后，将地址名称、地址编号、类型、站点编码、详细地址、经度、纬度等信息回填到当前发货地址或收货地址。

- 异常与边界：
  - 查询无数据时展示空状态。
  - 选择的数据已删除、不可用或不存在时提示重新选择。
  - 非公路运输选择地址时，地址类型必须与当前运输类型匹配。
  - 地址类型不匹配时 toast 提示“请选择港口/空港/车站地址”。

- 反例：
  - 不允许选择后只回填地址名称而丢失详细地址。
  - 不允许常规地址展示错误站点编码。
  - 不允许水运、空运、铁运选择不匹配的常用地址类型。

---

### REQ-PLAN-015 选择常用线路

- 功能点：
  - 支持打开选择常用线路弹窗。
  - 弹窗支持按线路名称、发货地址、收货地址等条件查询。
  - 列表展示线路名称、线路编号、发货地、发货地址、发货联系人、收货地、收货地址、收货联系人、操作等字段。
  - 点击选择后，自动回填发货地址、收货地址、发货联系人、发货联系方式、收货联系人、收货联系方式等信息。

- 异常与边界：
  - 查询无数据时展示空状态。
  - 线路已删除或不可用时提示重新选择。
  - 常用线路中的发货地址或收货地址与当前运输类型不匹配时不允许选择。
  - 非公路运输下选择不匹配线路时 toast 提示“请选择港口/空港/车站地址”。

- 反例：
  - 不允许选择线路后只回填发货地址而不回填收货地址。
  - 不允许选择与当前运输类型不匹配的线路。
  - 不允许选择失效线路。

---

### REQ-PLAN-016 选择常用货物

- 功能点：
  - 支持打开选择常用货物弹窗。
  - 弹窗支持按货物名称、货物编号、货物类型等条件查询。
  - 选择常用货物后，将货物名称、货物类型、包装、品牌、规格、型号、数量单位等信息回填到货物明细。
  - 支持选择一条或多条常用货物，回填为一行或多行货物明细。

- 异常与边界：
  - 查询无数据时展示空状态。
  - 常用货物已删除或不可用时提示重新选择。
  - 回填多条货物时应避免覆盖已有明细。
  - 回填后货物类型为空或已失效时阻止提交。

- 反例：
  - 不允许选择常用货物后丢失必填的货物类型。
  - 不允许多选回填时覆盖用户已有货物行。
  - 不允许选择已失效或不可用货物。

---

### REQ-PLAN-017 批量导入

- 功能点：
  - 点击“批量导入”按钮后跳转至导入计划页面。
  - 导入计划页面支持选择项目、上传 Excel 计划明细表、下载导入模板、查看待导入数据明细。
  - 导入流程为选择项目、上传 Excel 模板、系统自动校验、校验不通过自动下载错误报告、校验通过展示运单列表、确认导入、生成正式运单。
  - 导入字段、模板说明、校验规则、疑似重复处理和确认导入规则按计划导入专项需求执行。
  - 导入完成后刷新列表，并跳转至运单列表或返回运输计划列表。

- 异常与边界：
  - 文件格式错误时阻止导入并提示失败原因。
  - 项目、客户合同、计划名称、运输类型、发货地址、收货地址、货物类型等核心字段缺失时，对应行导入失败并写入失败原因。
  - 非公路运输地址不是对应港口、空港、站点时，对应行导入失败。
  - 日期格式错误或起止时间逻辑错误时，对应行导入失败。
  - 单行错误不影响其他校验通过的数据入库。
  - 全部失败时不入库，但仍生成错误报告。
  - 存在失败数据时下载错误报告，并提示“提交失败，报错文件已下载，请根据提示修改内容”。

- 反例：
  - 不允许异常数据静默跳过。
  - 不允许错误数据入库。
  - 不允许导入校验与新增、编辑表单校验不一致。
  - 不允许只提示失败数量而不提供错误报告。

---

### REQ-PLAN-018 批量导出

- 功能点：
  - 支持勾选多行数据后点击“批量导出”导出 Excel 文件。
  - 未勾选数据时点击批量导出，默认导出当前查询条件下的全部数据。
  - 导出字段与列表显示字段一致。
  - 导出成功后触发导出文件下载。

- 异常与边界：
  - 当前查询条件下无数据时允许导出空文件或提示无可导出数据。
  - 导出数据量较大时提示用户等待或按系统策略异步处理。
  - 导出失败时提示失败原因，不改变列表勾选状态。

- 反例：
  - 不允许未勾选时只导出当前页数据。
  - 不允许导出字段与列表字段不一致。
  - 不允许导出失败后提示成功。

---

### REQ-PLAN-019 复制运输计划

- 功能点：
  - 任意状态的运输计划均支持点击复制。
  - 系统基于当前计划复制生成新的草稿计划。
  - 复制后的计划重新生成计划单号，状态默认为草稿。
  - 复制成功后跳转至编辑页面，允许用户继续调整计划信息。

- 异常与边界：
  - 原计划已删除或不存在时提示数据不存在。
  - 复制时不得复制原计划的状态、调度记录、运单关联记录。
  - 计划单号生成失败时复制失败并提示。
  - 原计划附件是否复制应按系统文件规则处理，并在复制后保持可见范围一致。

- 反例：
  - 不允许复制后沿用原计划单号。
  - 不允许复制后直接生成待调度、调度中、已完成或已取消状态。
  - 不允许复制原计划下挂运单。

---

### REQ-PLAN-020 调度运输计划

- 功能点：
  - 待调度和调度中状态支持点击调度。
  - 点击调度后跳转至计划调度页面进行运单调度。
  - 计划调度页面展示计划概要信息和待调度列表。
  - 用户可在待调度列表新增、编辑、删除调度条目。
  - 调度完成后，若计划下挂待执行、进行中或完成状态运单，计划状态进入或保持调度中。
  - 已取消运单不计入调度中状态判断。

- 异常与边界：
  - 草稿、已完成、已取消状态不允许进入调度流程。
  - 调度前需校验计划是否存在且状态允许调度。
  - 调度页面保存失败时不改变计划原状态。
  - 调度后实际运单数据变更时，应同步刷新计划状态和列表数据。

- 反例：
  - 不允许草稿计划直接调度。
  - 不允许已完成或已取消计划继续调度。
  - 不允许将已取消运单计入调度中判断。

---

### REQ-PLAN-021 取消运输计划

- 功能点：
  - 待调度状态支持点击取消。
  - 点击取消后弹出确认关闭提示。
  - 在关闭确认弹窗中点击确认后，执行计划关闭操作，计划状态变更为已取消。
  - 取消成功后记录关闭原因，并刷新列表。

- 异常与边界：
  - 非待调度状态不允许取消。
  - 用户取消确认弹窗时不改变计划状态。
  - 取消前需校验计划是否已新增运单；若状态已变化为调度中，应阻止取消并刷新列表。
  - 取消失败时提示失败原因，计划保持原状态。

- 反例：
  - 不允许草稿、调度中、已完成、已取消状态执行取消。
  - 不允许跳过二次确认直接取消计划。
  - 不允许取消失败后仍提示成功。

---

### REQ-PLAN-022 完成运输计划

- 功能点：
  - 调度中状态支持点击完成，手动完成当前计划。
  - 当已调度运输量达到计划运输量，且关联运单全部完成时，系统自动将计划置为已完成。
  - 未满足自动完成条件时，支持用户手动完成计划。
  - 实际运输量为计划下所有完成状态运单货物数量求和。
  - 计划运输量为计划中填写的货物信息中的货物数量求和。
  - 如果计划运输量未填写，则均需手动点击完成。
  - 手动完成时，如计划运输量与实际运输量存在差异，弹窗提示“实际运输量与计划运输量不一致，是否确认完成？”。
  - 用户确认后计划状态变更为已完成，并刷新列表。

- 异常与边界：
  - 非调度中状态不允许手动完成。
  - 存在未完成的关联运单时，自动完成条件不成立。
  - 手动完成前需重新计算实际运输量，避免使用过期数据。
  - 用户在差异确认弹窗中取消时，不改变计划状态。
  - 完成失败时提示失败原因，计划保持原状态。

- 反例：
  - 不允许待执行、进行中运单仍存在时自动完成计划。
  - 不允许计划运输量和实际运输量不一致时跳过确认弹窗直接完成。
  - 不允许把已取消运单货物数量计入实际运输量。

---

### REQ-PLAN-023 删除运输计划

- 功能点：
  - 草稿状态支持点击删除。
  - 点击删除后弹出二次确认弹窗。
  - 确认后校验计划仍为草稿状态，校验通过后删除该计划。
  - 删除成功后刷新列表，并提示“删除成功”。

- 异常与边界：
  - 非草稿状态不允许删除。
  - 删除前状态已变化为非草稿时阻止删除，并刷新列表。
  - 数据不存在时提示数据不存在，并刷新列表。
  - 用户取消二次确认时不执行删除。
  - 删除失败时提示失败原因，不改变列表其他数据。

- 反例：
  - 不允许跳过二次确认直接删除。
  - 不允许删除待调度、调度中、已完成、已取消计划。
  - 不允许删除失败后仍提示成功。

---

### REQ-PLAN-024 底部操作按钮

- 功能点：
  - 新增或编辑页面底部展示确认创建、暂存、返回等操作按钮。
  - 点击确认创建时校验必填字段，创建或保存正式运输计划，成功提示并返回列表。
  - 点击暂存时直接保存草稿，成功提示并返回列表。
  - 点击返回时返回列表，不保存当前页面数据。
  - 底部操作区与页面内容区分离，便于用户在长表单中执行操作。

- 异常与边界：
  - 确认创建校验失败时停留在当前页面，并定位或提示失败字段。
  - 暂存失败时保留用户已填写内容。
  - 返回前如存在未保存改动，可按系统统一规则提示用户确认。
  - 重复点击确认创建或暂存时应防止重复提交。

- 反例：
  - 不允许确认创建时绕过必填校验。
  - 不允许点击返回后仍悄悄保存数据。
  - 不允许重复点击导致生成多条相同计划。

---

### REQ-PLAN-025 权限与审计

- 功能点：
  - 根据用户权限控制查询、新建计划、批量导入、批量导出、编辑、复制、删除、调度、详情、取消、完成等操作入口。
  - 创建时间、更新时间由系统自动记录。
  - 若列表或详情展示创建人、更新人等审计字段，应优先展示用户姓名，不直接展示用户 ID。
  - 操作日志应记录新增、编辑、复制、删除、调度、取消、完成、导入、导出等关键动作。

- 异常与边界：
  - 无权限访问时提示权限不足。
  - 无按钮权限时不展示对应按钮，并阻止绕过页面发起操作。
  - 操作失败时不记录为成功日志。
  - 审计字段缺失时不影响核心业务字段展示，但应按系统兜底规则展示。

- 反例：
  - 不允许无权限用户执行新增、编辑、删除、调度、完成等操作。
  - 不允许用户手动维护创建时间、更新时间。
  - 不允许直接向用户展示 createUser、updateUser 等用户 ID 字段。

---

### REQ-PLAN-026 计划详情布局

- 功能点：
  - 计划详情页顶部展示计划标题，标题由计划名称和计划单号组成。
  - 计划标题右侧展示计划状态标签和运输类型标签。
  - 详情顶部左侧展示客户、项目、合同编号、货物信息、计划执行时间、附件等只读信息。
  - 详情顶部右侧以起点到终点的线路形式展示发货地和收货地，包含省市区、详细地址、联系人、联系方式等信息。
  - 详情页下方展示运单记录区域，运单记录区域右上方展示计划总量、已调度量、剩余量，并提供新增调度入口。
  - 页面整体为只读详情布局，除允许的查看运单详情、新增调度等操作外，不提供表单编辑能力。

- 异常与边界：
  - 计划名称、计划单号、状态或运输类型缺失时，应展示兜底文案，避免页面标题空白。
  - 发货地或收货地信息不完整时，应按已有字段展示，不得拼接错误地址。
  - 附件为空时展示无附件状态或不展示附件链接区域。
  - 运单记录为空时展示空状态，仍保留计划概要信息。

- 反例：
  - 不允许详情页顶部缺少计划名称或计划单号。
  - 不允许起点、终点展示位置反向。
  - 不允许详情页布局中出现可编辑输入框。

---

### REQ-PLAN-027 详情基本信息

- 功能点：
  - 详情基本信息全部为只读展示。
  - 计划名称展示运输计划名称，最长100字符，作为页面标题核心内容展示。
  - 计划单号展示系统生成的计划编号，最长20字符，不可编辑。
  - 计划状态以状态标签展示，枚举包含草稿、待调度、调度中、已完成、已取消。
  - 运输类型以标签展示计划运输方式。
  - 客户展示委托客户名称，最长100字符。
  - 项目展示关联项目名称，最长100字符。
  - 合同编号展示关联合同编号，最长50字符。
  - 货物信息固定展示首条货物和总数量，总数量从计划货物信息表中求和。
  - 计划执行时间展示计划开始时间至计划结束时间，日期格式为 yyyy/MM/dd。
  - 附件以文件链接展示，支持点击下载或预览。
  - 发货地和收货地分别展示省市区、详细地址、联系人、电话。

- 异常与边界：
  - 计划状态或运输类型不在枚举范围内时展示兜底文案并限制相关操作。
  - 货物信息为空时展示“/”或无货物信息，不得展示错误合计。
  - 计划开始时间或计划结束时间缺失时，仅展示已有日期或展示“/”。
  - 附件下载或预览失败时提示失败原因，不影响详情其他内容。
  - 收发货地址超长时应换行或省略展示，鼠标悬停可查看完整内容。

- 反例：
  - 不允许详情页编辑计划名称、计划单号、状态、运输类型等字段。
  - 不允许把计划单号展示为空白或展示内部数据库 ID。
  - 不允许货物总数量脱离计划货物明细自行录入。

---

### REQ-PLAN-028 详情调度数据

- 功能点：
  - 详情页运单记录区域右侧展示调度统计数据。
  - “共X{计量单位}”统计当前计划下所有运单货物数量合计，运单范围包含草稿、待执行、进行中、已完成、已取消。
  - “已调度X{计量单位}”统计待执行、进行中、已完成状态运单的货物数量合计，用于反映已分配运力的货量。
  - “已完成X{计量单位}”统计已完成状态运单的货物数量合计，用于反映已运输完成的货量。
  - “剩余X{计量单位}”根据计划总量与已调度量计算展示。
  - 统计数值随运单新增、取消、完成等状态变化同步刷新。

- 异常与边界：
  - 运单存在不同计量单位时，应按计量单位分别统计或提示无法合并，不得强行合并为单一单位。
  - 运单货物数量为空时不参与统计。
  - 已取消运单计入“共X”总量展示，但不计入“已调度”和“已完成”统计。
  - 已调度量大于计划总量时，剩余量可展示为0或负差异，但不得影响实际数据追溯。
  - 统计加载失败时展示兜底状态，并提示用户刷新页面。

- 反例：
  - 不允许把已取消运单计入已调度量。
  - 不允许把待执行或进行中运单计入已完成量。
  - 不允许不同计量单位货量无提示合并。

---

### REQ-PLAN-029 详情运单记录

- 功能点：
  - 运单记录列表展示当前计划下的所有运单。
  - 运单记录列表字段同“运单管理”的运单字段口径。
  - 列表至少展示序号、运单号、车牌号或航班号或船号或班列号、司机、承运商、运输类型、承运类型、货物信息、发货地址、状态、操作等字段。
  - 运单记录展示运单状态，状态示例包含草稿、待执行、进行中、已完成、已取消。
  - 运单号支持点击或通过操作列进入对应运单详情。
  - 操作按钮仅提供查看运单详情。
  - 运单记录支持分页展示，分页信息展示总条数和页码。

- 异常与边界：
  - 当前计划未关联运单时展示空状态。
  - 运单详情已删除或无权限访问时提示无法查看。
  - 运单记录字段较多时允许横向滚动，操作列应保持可见。
  - 运单状态变化后返回计划详情，应刷新运单记录和调度统计。

- 反例：
  - 不允许在计划详情的运单记录中直接编辑或删除运单。
  - 不允许展示非当前计划下的运单。
  - 不允许操作列出现除详情以外的运单操作。

---

### REQ-PLAN-030 详情操作按钮

- 功能点：
  - 计划详情页运单记录右侧提供“新增调度”按钮。
  - 当当前计划状态为待调度或调度中时，展示“新增调度”按钮。
  - 点击“新增调度”后跳转至计划调度页面。
  - 运单记录操作列提供“详情”按钮，点击后跳转对应运单详情。

- 异常与边界：
  - 草稿、已完成、已取消状态不展示新增调度按钮。
  - 用户无调度权限时不展示新增调度按钮。
  - 点击新增调度前需校验计划最新状态，若状态已不允许调度则阻止跳转并刷新详情。
  - 点击运单详情时若运单不存在、已删除或无权限访问，应提示无法查看。

- 反例：
  - 不允许草稿、已完成、已取消计划在详情页新增调度。
  - 不允许无权限用户通过详情页发起调度。
  - 不允许运单记录操作列提供编辑、删除、取消等操作。

---

### REQ-PLAN-031 计划调度页布局

- 功能点：
  - 计划调度页顶部展示运输计划概要信息，布局与计划详情页保持一致。
  - 顶部标题展示计划名称、计划单号、计划状态标签和运输类型标签。
  - 顶部左侧展示客户、项目、合同编号、货物信息、计划执行时间、附件等只读信息。
  - 顶部右侧以起点到终点线路形式展示发货地、收货地、详细地址、联系人、联系方式。
  - 页面下方展示待调度列表，列表标题右侧展示计划总量、已调度量、剩余量。
  - 待调度列表标题区提供“新增”按钮，用于新增调度条目。

- 异常与边界：
  - 计划不存在、已删除或状态不允许调度时，阻止进入计划调度页并提示。
  - 计划概要信息加载失败时不展示待调度操作，避免在未知计划上调度。
  - 附件为空时展示无附件状态或不展示附件链接区域。
  - 计划总量、已调度量、剩余量加载失败时，应提示统计加载失败，并限制生成运单。

- 反例：
  - 不允许在计划调度页编辑计划基本信息。
  - 不允许草稿、已完成、已取消计划进入可调度页面。
  - 不允许调度页顶部展示与当前计划不一致的概要数据。

---

### REQ-PLAN-032 待调度列表

- 功能点：
  - 待调度列表展示当前计划下已保存但尚未最终生成运单的调度条目。
  - 列表展示序号、运输类型、承运商、司机、车牌号或航班号或船号或班列号、货物信息、发货地址、到货地址、操作等字段。
  - 列表操作列提供编辑、删除。
  - 点击编辑后弹出新增或编辑调度弹窗，并回显该条调度数据。
  - 点击删除后删除当前调度条目，并同步刷新待调度列表、已调度量和剩余量。
  - 待调度列表字段较多时支持横向滚动，操作列保持可见。

- 异常与边界：
  - 待调度列表为空时展示空状态，不影响新增调度。
  - 删除调度条目前应二次确认，用户取消时不删除。
  - 已生成运单的调度条目不允许在待调度列表继续编辑或删除。
  - 编辑或删除后统计数据应重新计算。

- 反例：
  - 不允许待调度列表展示其他计划的调度条目。
  - 不允许删除已生成运单的调度条目。
  - 不允许编辑或删除后仍显示旧的已调度量和剩余量。

---

### REQ-PLAN-033 新增编辑调度弹窗

- 功能点：
  - 点击待调度列表“新增”按钮，弹出新增或编辑调度弹窗。
  - 调度弹窗默认带出当前计划对应的收发货信息、货物信息、计划时间等内容，用户无需重复填写。
  - 调度弹窗支持精简录入和完整录入两种模式，用户可点击切换填写字段。
  - 编辑已保存调度条目时，仍通过弹窗编辑并回显原调度信息。
  - 弹窗底部展示重置、保存按钮。
  - 关闭弹窗时不自动保存未提交内容。

- 异常与边界：
  - 当前计划状态不是待调度或调度中时，不允许打开新增调度弹窗。
  - 带出的计划收发货信息缺失时，阻止保存调度并提示计划数据不完整。
  - 切换精简录入和完整录入时，应保留已填写且两个模式共用的字段。
  - 用户关闭弹窗或点击取消时，如存在未保存改动，可按系统统一规则提示确认。

- 反例：
  - 不允许新增调度时要求用户重复填写计划已有的收发货地址。
  - 不允许切换录入模式后丢失已填写的承运商、司机、车牌号、货物数量等共用字段。
  - 不允许关闭弹窗后静默保存数据。

---

### REQ-PLAN-034 精简录入调度信息

- 功能点：
  - 精简录入用于快速生成单条调度任务。
  - 精简录入展示收发货信息和任务信息两个区域。
  - 收发货信息由计划自动带出，包含发货地址、收货地址、发货联系人、发货联系方式、收货联系人、收货联系方式。
  - 承运类型使用切换按钮，选项为承运商、自运。
  - 承运类型为承运商时，承运商为必填，使用搜索选择框。
  - 司机使用搜索选择框，手机号根据司机信息带出或手工录入。
  - 车牌号为必填；运输类型为非公路时，字段名称按航班号、船号、班列号等运输方式展示。
  - 货物类型、货物名称、数量为必填，数量单位随数量一起填写。
  - 规格、型号、里程、预计发货日期、预计完成日期、单价、备注为可填写字段。
  - 备注最多500字。

- 异常与边界：
  - 承运类型为承运商且承运商为空时阻止保存。
  - 货物类型、货物名称、数量、数量单位为空时阻止保存。
  - 车牌号或对应运输载具编号为空时阻止保存。
  - 数量小于0、等于0或超过计划剩余量时阻止保存。
  - 预计完成日期早于预计发货日期时阻止保存。
  - 手机号格式不合法、里程或单价小于0时阻止保存。

- 反例：
  - 不允许承运商模式下不选择承运商。
  - 不允许保存无货物数量或数量超过剩余量的调度条目。
  - 不允许非公路运输仍固定展示车牌号字段。

---

### REQ-PLAN-035 完整录入调度信息

- 功能点：
  - 完整录入用于填写更完整的运单信息。
  - 完整录入包含收发货信息、货物信息、承运信息、费用信息、附件等区域。
  - 收发货信息由计划自动带出，允许按业务规则调整联系人和联系方式。
  - 货物信息以明细表格维护，支持新增、删除、导入货物、选择货物。
  - 货物明细展示货物名称、货物类型、剩余数量、本次数量、数量单位、包装、品牌、规格、型号、物料编码、操作等字段。
  - 货物名称、货物类型、本次数量、数量单位为必填。
  - 承运信息包含承运类型、承运商、司机、手机号、车牌号或航班号或船号或班列号、里程、预计发货日期、预计完成日期、备注。
  - 费用信息包含单价、数量合计、运费、其他运费合计、运费合计。
  - 附件支持上传调度或运单相关附件。

- 异常与边界：
  - 货物明细为空时阻止保存。
  - 任一货物行本次数量为空、小于等于0或超过该货物剩余数量时阻止保存。
  - 删除最后一行货物明细时应保留一条空行或提示至少保留一行。
  - 导入货物或选择货物后，需重新计算数量合计和剩余数量。
  - 承运信息、费用信息、附件校验规则应与运单新增或编辑保持一致。
  - 附件格式不支持或上传失败时阻止保存或提示用户重新上传。

- 反例：
  - 不允许完整录入保存没有货物明细的调度条目。
  - 不允许本次数量超过计划该货物剩余数量。
  - 不允许导入货物后绕过货物类型、数量单位等必填校验。

---

### REQ-PLAN-036 调度货量与费用规则

- 功能点：
  - 待调度列表标题区展示共X、已调度X、剩余X等调度统计。
  - 新增或编辑调度时，本次数量占用计划剩余数量。
  - 完整录入中的剩余数量展示该货物在当前计划中扣减已调度数量后的剩余可调度数量。
  - 数量合计由当前调度货物明细的本次数量自动汇总。
  - 若填写数量、数量单位和单价，则系统自动计算运费。
  - 运费允许用户修改。
  - 运费合计由运费加其他运费合计自动计算，只读展示。

- 异常与边界：
  - 不同计量单位的货物数量应按单位分别汇总或提示无法合并，不得无提示合并。
  - 编辑调度条目时，剩余数量应包含当前条目原占用数量后再重新校验。
  - 本次数量超过剩余数量时阻止保存。
  - 单价、运费、其他运费合计不能小于0，金额最多保留2位小数。
  - 数量、数量单位或单价缺少任一项时，无需自动计算运费。
  - 运费合计计算失败时提示计算异常，并阻止生成运单。

- 反例：
  - 不允许本次数量保存为0或负数。
  - 不允许调度数量超过计划剩余数量。
  - 不允许运费合计被手工修改。
  - 不允许数量或单价缺失时仍强制自动计算运费。

---

### REQ-PLAN-037 调度保存与生成运单

- 功能点：
  - 点击调度弹窗保存后，待调度列表新增或更新一条调度记录。
  - 对已保存的待调度条目，可继续编辑或删除。
  - 计划调度页右下角提供确认生成运单入口，点击后弹出确认弹窗。
  - 点击“生成运单草稿”后，跳转运单列表页，列表新增对应运单草稿。
  - 点击“确认生成运单”后，根据运单管理新增或编辑页面的状态规则生成正式运单。
  - 生成运单成功后，计划状态按调度结果变更为调度中或保持调度中，并刷新计划列表、计划详情和调度统计。

- 异常与边界：
  - 待调度列表为空时，不允许确认生成运单。
  - 生成运单前需校验所有待调度条目的必填项、货量、承运信息、费用和附件规则。
  - 生成运单时如存在校验失败条目，应阻止生成并定位到对应条目。
  - 用户在确认弹窗中取消时，不生成运单且保留待调度列表。
  - 生成运单失败时保留待调度列表，提示失败原因，便于用户修正后重试。
  - 部分运单生成失败时，应按系统事务策略整体失败或明确提示成功与失败结果，不得静默丢失条目。

- 反例：
  - 不允许待调度列表为空时生成运单。
  - 不允许生成运单时跳过运单新增或编辑状态规则。
  - 不允许生成失败后清空用户已保存的待调度条目。
  - 不允许重复点击导致重复生成运单。

---

### REQ-PLAN-038 计划导入页布局

- 功能点：
  - 点击运输计划列表的批量导入后，进入导入发货计划页面。
  - 页面上方展示导入信息填写区，包含项目、客户、客户合同、计划明细表上传、下载模板、提交、返回等内容。
  - 页面下方展示数据明细区，包含批量删除、运单数页签、疑似重复页签、待导入数据列表、分页、底部返回和导入按钮。
  - 待导入数据列表字段至少包含勾选框、序号、计划单号、计划名称、运输类型、货物名称、货物类型、数量、计量单位、发货地址、操作等字段。
  - 操作列支持编辑、保存、取消、删除。
  - 底部展示当前已选或可导入数据数量。

- 异常与边界：
  - 未上传文件时，数据明细区展示空状态或不展示待导入数据。
  - 校验失败数据不进入待导入数据明细，只通过错误报告反馈。
  - 数据明细字段较多时支持横向滚动，操作列应保持可见。
  - 页面刷新或返回前如存在已解析但未导入数据，应按系统统一规则提示用户确认。

- 反例：
  - 不允许校验失败数据混入待导入数据明细。
  - 不允许未选择项目时直接上传并确认导入。
  - 不允许操作列被横向滚动隐藏。

---

### REQ-PLAN-039 导入信息填写

- 功能点：
  - 项目为必填，使用选择框，支持模糊查询后选择项目档案。
  - 客户为必填，选择项目后自动带出，不可编辑；若项目下存在多个客户，则支持下拉选择。
  - 客户合同为必填，选择项目后自动带出，不可编辑；若项目下存在多个客户合同，则支持下拉选择。
  - 顶部承运商为批量赋值字段，选择后所有导入运单的承运商统一赋值为该值。
  - 计划明细表为必填，点击添加附件上传 Excel 文件。
  - 页面提示仅支持 Excel 格式。
  - 点击下载模板可下载 Excel 导入模板。
  - 点击提交后上传文件并解析校验。
  - 点击返回时返回计划列表，不执行导入。

- 异常与边界：
  - 项目为空时阻止提交并提示。
  - 客户或客户合同未成功带出时阻止提交，并提示重新选择项目。
  - 上传文件为空时阻止提交并提示。
  - 上传文件不是 Excel 格式时阻止提交并提示。
  - 顶部承运商为空时不影响上传校验，但不进行批量赋值。
  - 项目切换后，应清空已上传文件和已解析数据，避免跨项目导入。

- 反例：
  - 不允许客户或客户合同脱离项目单独编辑。
  - 不允许上传非 Excel 文件作为计划明细表。
  - 不允许项目切换后沿用上一个项目的待导入数据。

---

### REQ-PLAN-040 导入模板字段

- 功能点：
  - 导入模板字段包含序号、原始单号、配载标识号、车牌号或航班号或船号或班列号、运输类型、司机或船长姓名、司机或船长手机号、发货地址、发货联系人、发货联系人电话、到货地址、收货联系人、收货联系人电话、货物名称、货物类型、包装、数量、计量单位、规格、型号、里程、单价、计价单位、运费、其他费用合计、运费合计、实际发货时间、实际完成时间、预计发货时间、预计完成时间、备注、同一运单标识号。
  - 必填字段标题需增加“*”标识，包含车牌号或航班号或船号或班列号、运输类型、发货地址、到货地址、货物名称、货物类型、数量、计量单位、实际发货时间、实际完成时间。
  - 原始单号用于填写业务侧自己的单号，无需与系统编号相同。
  - 配载标识号适用于公路配载场景，填写方式为配载组加配载顺序，例如001-1。
  - 运输类型枚举包含公路整车、公路配载或零担、铁路运输、水路运输、跨境海运、航空运输。
  - 发货地址和到货地址需精确到具体地址，用于轨迹回放。
  - 货物类型必须为系统内维护的货物类型；无法按货物名称匹配到货物类型时，归为其他类。
  - 计量单位必须填写系统中的枚举值。
  - 计价单位枚举包含元/吨、元/方、元/件、元/吨/公里。
  - 备注为文本，最多200字。
  - 当同一运单包含多个货物时，需拆分多行，并填写同一运单标识号标记多行为同一运单。

- 异常与边界：
  - 模板字段缺失、字段名称被修改或字段顺序不符合模板时，应阻止解析并提示重新下载模板。
  - 必填字段为空时，对应行校验失败并写入错误原因。
  - 枚举字段不属于系统枚举值时，对应行校验失败。
  - 同一运单标识号为空时，默认按单行独立运单处理。

- 反例：
  - 不允许导入模板缺少车牌号或运输类型等关键字段。
  - 不允许把非系统枚举的运输类型、计量单位、计价单位导入成功。
  - 不允许多货物运单不填写同一运单标识号却被强行合并。

---

### REQ-PLAN-041 导入数据校验

- 功能点：
  - 上传 Excel 后系统逐行校验字段格式、必填、枚举、金额、日期、配载关系、多货物关系和重复性。
  - 同一配载标识号下车牌号必须一致；配载标识号不可重复。
  - 当运输类型为公路整车或公路配载或零担时，车牌号需满足首位汉字、次位大写字母、总长度7位或8位。
  - 当运输类型为非公路时，车牌号或航班号或船号或班列号不执行车牌格式校验。
  - 司机或船长手机号、发货联系人电话、收货联系人电话有值时，需校验11位数字格式。
  - 发货地址和到货地址未匹配到地址库时给出警告，允许继续导入，但提示轨迹回放将受影响。
  - 数量有值时必须为正数。
  - 里程有值时必须为正数。
  - 运费合计有值时，必须等于运费加其他费用合计。
  - 导入状态选择进行中时，实际发货时间和实际完成时间不必填。
  - 实际发货时间、实际完成时间、预计发货时间、预计完成时间有值时，必须为日期时间格式。
  - 实际发货时间不能晚于实际完成时间。
  - 实际完成时间不能早于实际发货时间。
  - 预计发货时间不能晚于预计完成时间。
  - 预计完成时间不能早于预计发货时间。
  - 同一运单标识号下需校验同一个车牌号或同一运输载具编号。

- 异常与边界：
  - 运输类型不是系统枚举值时，对应行报错“运输类型需系统枚举值”。
  - 公路车牌号格式不通过时，对应行报错“车牌号校验不通过”。
  - 配载单车牌号不一致或配载标识号重复时，对应行报错“配载单车牌号不一致；配载标识号重复”。
  - 手机号格式不通过时，对应行报错“手机号格式校验不通过”。
  - 货物名称为空时，对应行报错“货物名称必填”。
  - 计量单位不存在时，对应行报错“计量单位不存在”。
  - 运费合计不等于运费与其他费用合计之和时，对应行报错“运费合计不等于运费与其他运费合计之和，请调整”。
  - 同一运单车牌不一致时，对应行报错“统一运单车牌不一致”。

- 反例：
  - 不允许枚举、金额、日期明显错误的数据进入待导入明细。
  - 不允许同一配载单使用不同车牌号。
  - 不允许同一运单标识号下出现不同车牌号仍合并为一个运单。
  - 不允许运费合计与分项费用不一致仍校验通过。

---

### REQ-PLAN-042 错误报告下载

- 功能点：
  - 若上传文件存在校验不通过数据，则 toast 提示“提交失败，报错文件已下载，请根据提示修改内容”。
  - 系统自动下载错误报告 Excel。
  - 错误报告在上传文档原字段最后一列追加报错文案。
  - 同一行存在多个错误时，多个报错文案以分号隔开。
  - 校验失败的运单不展示在待导入数据明细中。
  - 错误报告文件名应包含运输计划或发货计划、报错文件或导入失败明细、时间戳。

- 异常与边界：
  - 错误报告生成失败时仍需提示提交失败，并提示用户重新上传或联系管理员。
  - 文件中仅存在警告且无报错时，允许进入待导入数据明细，并在行内展示警告信息。
  - 全部数据校验失败时，不展示待导入列表，仅下载错误报告。
  - 部分数据失败时，失败行下载错误报告，通过行进入待导入数据明细。

- 反例：
  - 不允许只提示失败但不下载错误报告。
  - 不允许错误报告丢失原始导入字段。
  - 不允许多个错误只保留最后一个错误原因。

---

### REQ-PLAN-043 待导入数据明细

- 功能点：
  - 当导入数据校验通过后，展示在待导入数据明细中。
  - 系统对每一条上传的条目自动生成唯一计划号。
  - 数据明细页签展示运单数，格式如“运单数(4)”。
  - 待导入列表支持勾选多行并批量删除。
  - 单行支持在线编辑、保存、取消、删除。
  - 点击编辑后，该行可编辑字段变为输入状态。
  - 点击保存后保存该行编辑内容，行恢复只读。
  - 点击取消后放弃修改，恢复原始值。
  - 点击删除后移除该行数据。
  - 列表支持分页，默认10条/页。

- 异常与边界：
  - 在线编辑保存时需重新执行该行字段校验。
  - 批量删除未勾选数据时提示先选择数据。
  - 删除全部待导入数据后，导入按钮不可用或点击时提示无可导入数据。
  - 行编辑过程中切换页签或分页时，应按系统统一规则提示保存或放弃修改。

- 反例：
  - 不允许编辑后绕过导入校验。
  - 不允许删除行后仍参与最终导入。
  - 不允许未通过校验的数据出现在运单数页签中。

---

### REQ-PLAN-044 疑似重复处理

- 功能点：
  - 系统需校验导入数据重复性。
  - 疑似重复判断规则为同一运单批次号下，所有导入字段数据一致。
  - 检测到疑似重复运单时，单独通过疑似重复页签展示，格式如“疑似重复(2)”。
  - 疑似重复数据允许用户在线确认、编辑或删除。
  - 用户确认保留后，该数据可参与最终导入。
  - 用户删除后，该数据不参与最终导入。

- 异常与边界：
  - 疑似重复数据未经确认时，确认导入应提示用户先处理疑似重复。
  - 编辑疑似重复数据后需重新校验重复性和字段合法性。
  - 疑似重复页签数量应随确认、编辑、删除动作实时更新。
  - 不同运单批次号下的相同字段数据不按疑似重复处理，除非系统另有全局重复规则。

- 反例：
  - 不允许疑似重复数据未经处理直接生成正式运单。
  - 不允许把仅部分字段相同的数据误判为完全重复。
  - 不允许删除疑似重复数据后仍参与导入。

---

### REQ-PLAN-045 确认导入生成运单

- 功能点：
  - 点击底部导入按钮后，对待导入明细再次执行最终校验。
  - 校验通过后生成正式运单。
  - 导入成功后跳转至运单列表。
  - 返回按钮返回计划列表，不执行导入。
  - 导入成功的数据应与所选项目、客户、客户合同建立关联。
  - 顶部承运商有值时，应批量赋值到所有导入运单。

- 异常与边界：
  - 待导入明细为空时不允许导入。
  - 存在未保存编辑行时不允许导入，并提示先保存或取消编辑。
  - 存在未处理疑似重复数据时不允许导入，并提示先处理疑似重复。
  - 导入生成运单失败时保留待导入明细，提示失败原因。
  - 重复点击导入按钮时应防止重复生成运单。
  - 部分生成失败时，应按系统事务策略整体失败或明确展示成功与失败结果。

- 反例：
  - 不允许未确认导入就生成正式运单。
  - 不允许导入失败后清空待导入数据。
  - 不允许承运商批量赋值覆盖用户已明确单独编辑的不同承运商，除非用户再次确认。

---

## 通用规则

- 运输计划用于记录项目维度下的计划运输任务，归属于“业务管理”主菜单。
- 运输计划状态包含草稿、待调度、调度中、已完成、已取消。
- 计划单号由系统自动生成，规则为 JH + 8位年月日 + 3位流水号，生成后只读不可编辑。
- 项目、客户合同、计划名称、计划单号、运输类型为基本信息核心字段；确认创建时必须校验必填。
- 发货地址、收货地址为收发货信息核心字段；货物类型为货物信息核心字段。
- 运输类型为公路时，收发货地址按地址选择逻辑处理；运输类型为水运或海运时选择港口，空运时选择空港，铁运时选择站点。
- 非公路运输通过常用地址或常用线路回填地址时，必须校验地址是否为当前运输类型对应的港口、空港、车站地址，不匹配时 toast 提示“请选择港口/空港/车站地址”。
- 货物信息至少保留一行；数量为非负数，数量单位必须来自系统枚举。
- 运输数量合计由系统根据货物明细数量自动计算，不允许手工修改。
- 计划运输量为计划中货物信息的货物数量求和；实际运输量为计划下所有完成状态运单货物数量求和。
- 已调度运输量达到计划运输量且关联运单全部完成时，计划自动变更为已完成。
- 未填写计划运输量或自动完成条件不满足时，只能通过手动完成完成计划。
- 计划详情页整体只读展示，详情页运单记录仅允许查看运单详情，不允许直接编辑或删除运单。
- 计划详情页调度统计需区分计划总量、已调度量、已完成量、剩余量，并随运单状态变化刷新。
- 计划调度页仅允许待调度和调度中状态进入，草稿、已完成、已取消状态不允许新增调度。
- 计划调度弹窗支持精简录入和完整录入，两个模式切换时应保留共用字段。
- 调度本次数量不得超过计划剩余数量，编辑时剩余数量需考虑当前条目原占用数量。
- 调度生成运单前必须按运单新增或编辑规则完成校验，生成后刷新计划状态和调度统计。
- 计划导入流程为选择项目、上传 Excel、系统校验、下载错误报告或展示待导入明细、处理疑似重复、确认导入、生成正式运单。
- 计划导入模板必填字段必须使用“*”标识，导入校验失败报告必须在原字段最后追加错误原因列。
- 计划导入中的疑似重复数据必须由用户确认、编辑或删除后才允许最终导入。
- 新增、编辑、删除、取消、完成、导入等操作成功后均需刷新列表。
- 批量导入失败明细应在原模板字段后追加“导入失败原因”，并自动下载。
- 列表、详情、导出预览等用户可见场景如展示审计人员，应展示姓名字段，避免直接展示用户 ID。
