# 发货模板需求卡

## 目录

- [REQ-SHIPTPL-001 菜单入口](#req-shiptpl-001-菜单入口)
- [REQ-SHIPTPL-002 列表与分页](#req-shiptpl-002-列表与分页)
- [REQ-SHIPTPL-003 条件查询与重置](#req-shiptpl-003-条件查询与重置)
- [REQ-SHIPTPL-004 查看发货模板](#req-shiptpl-004-查看发货模板)
- [REQ-SHIPTPL-005 新增发货模板](#req-shiptpl-005-新增发货模板)
- [REQ-SHIPTPL-006 编辑发货模板](#req-shiptpl-006-编辑发货模板)
- [REQ-SHIPTPL-007 模板信息规则](#req-shiptpl-007-模板信息规则)
- [REQ-SHIPTPL-008 基本信息规则](#req-shiptpl-008-基本信息规则)
- [REQ-SHIPTPL-009 收发货信息规则](#req-shiptpl-009-收发货信息规则)
- [REQ-SHIPTPL-010 货物信息规则](#req-shiptpl-010-货物信息规则)
- [REQ-SHIPTPL-011 附件规则](#req-shiptpl-011-附件规则)
- [REQ-SHIPTPL-012 选择常用地址](#req-shiptpl-012-选择常用地址)
- [REQ-SHIPTPL-013 选择常用线路](#req-shiptpl-013-选择常用线路)
- [REQ-SHIPTPL-014 选择常用货物](#req-shiptpl-014-选择常用货物)
- [REQ-SHIPTPL-015 从模板新建](#req-shiptpl-015-从模板新建)
- [REQ-SHIPTPL-016 单条删除](#req-shiptpl-016-单条删除)
- [REQ-SHIPTPL-017 批量删除](#req-shiptpl-017-批量删除)
- [REQ-SHIPTPL-018 权限与审计](#req-shiptpl-018-权限与审计)
- [REQ-SHIPTPL-019 运单模板布局](#req-shiptpl-019-运单模板布局)
- [REQ-SHIPTPL-020 运费信息规则](#req-shiptpl-020-运费信息规则)
- [REQ-SHIPTPL-021 查看过程配置按钮](#req-shiptpl-021-查看过程配置按钮)
- [通用规则](#通用规则)

---

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

- 功能点：
  - 新增主菜单“业务管理”。
  - 在“业务管理”菜单下提供“发货模板”模块入口。
  - 用户进入发货模板页面后，可进行查询、新建模板、编辑、删除、从模板新建等操作。

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

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

---

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

- 功能点：
  - 默认展示当前组织下的发货模板数据。
  - 列表展示字段与编辑表单字段保持一致，并额外展示更新人、创建时间、更新时间。
  - 列表至少展示模板编号、模板名称、模板类型、项目、客户合同、运输类型、发货地址、收货地址、货物信息、备注、更新人、创建时间、更新时间、操作等信息。
  - 操作按钮列固定在右侧，不随横向滚动条滑动。
  - 支持勾选多行数据进行批量删除。
  - 分页默认10条/页，支持20/50/100条/页。

- 异常与边界：
  - 查询无数据时展示空状态。
  - 横向字段较多时允许表格横向滚动，但操作列必须保持固定。
  - 当前页删除后无数据时自动回退页码并刷新列表。
  - 列表加载失败时保留当前查询条件和分页条件。

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

---

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

- 功能点：
  - 支持按模板编号、模板名称、模板类型查询。
  - 模板编号使用输入框，支持模糊查询。
  - 模板名称使用输入框，支持模糊查询。
  - 模板类型使用下拉单选控件。
  - 点击查询后，按模板编号、模板名称、模板类型组合条件筛选列表。
  - 点击重置后清空所有查询条件，恢复默认列表。

- 异常与边界：
  - 查询条件为空时点击查询，按默认规则展示当前组织数据。
  - 查询结果为空时展示空状态，不清空用户已输入条件。
  - 重置后页码恢复第一页，并重新加载列表。

- 反例：
  - 不允许重置后仍保留隐藏查询条件。
  - 不允许模板编号查询变成精确匹配。
  - 不允许查询后改变列表字段展示范围。

---

### REQ-SHIPTPL-004 查看发货模板

- 功能点：
  - 支持通过行操作查看发货模板详情。
  - 详情展示模板信息、基本信息、收发货信息、货物信息、附件、更新人、创建时间、更新时间等内容。
  - 查看状态下所有字段置灰不可编辑。
  - 查看页面或弹窗底部仅显示关闭或返回按钮。

- 异常与边界：
  - 数据已删除或不存在时提示数据不存在，并刷新列表。
  - 详情加载失败时提示失败原因，不改变列表数据。
  - 附件加载失败时不影响其他字段展示。

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

---

### REQ-SHIPTPL-005 新增发货模板

- 功能点：
  - 点击新建模板后进入新建模板页面，默认进入运输计划模板类型。
  - 新建页面包含模板信息、基本信息、收发货信息、货物信息、附件等区域。
  - 模板编号由系统自动生成，只读不可编辑。
  - 模板名称必填，使用输入框。
  - 模板类型默认显示运输计划，可切换至常规运单；切换后下方填写信息按对应模板类型展示。
  - 项目必填，使用模糊搜索选择框。
  - 客户合同必填，选择项目后自动带出；若项目下存在多个客户合同，则以下拉框供用户选择。
  - 运输类型必填，选择项目时自动带出，允许用户修改。
  - 发货地址、收货地址必填，控件类型随运输类型变化。
  - 货物信息中货物类型必填，支持新增、删除货物行。
  - 附件为非必填，支持上传多个 JPG、PNG、PDF 等文件。
  - 保存成功后刷新列表。

- 异常与边界：
  - 模板名称为空时阻止提交并提示。
  - 项目、客户合同、运输类型为空时阻止提交并提示。
  - 发货地址或收货地址为空时阻止提交并提示。
  - 货物信息中任一货物行的货物类型为空时阻止提交。
  - 字段长度、数值、下拉枚举、附件格式不符合要求时阻止提交并提示。
  - 提交失败时保留用户已填写内容。

- 反例：
  - 不允许用户手工填写模板编号。
  - 不允许缺少项目、合同或运输类型仍保存。
  - 不允许没有任何货物行时保存。
  - 不允许切换模板类型后继续提交旧模板类型的无效字段。

---

### REQ-SHIPTPL-006 编辑发货模板

- 功能点：
  - 支持编辑已存在的发货模板。
  - 模板编号在编辑状态下只读不可编辑。
  - 模板名称、模板类型、备注、基本信息、收发货信息、货物信息、附件可按规则编辑。
  - 编辑页面回显模板全部信息。
  - 保存成功后刷新列表。

- 异常与边界：
  - 编辑时修改模板类型，应按新模板类型刷新下方字段结构，并提示用户确认是否清空不适用字段。
  - 编辑的数据已不存在时提示数据不存在，并刷新列表。
  - 提交失败时保留用户修改内容。

- 反例：
  - 不允许编辑时修改模板编号。
  - 不允许编辑后提交不符合当前模板类型的字段。
  - 不允许保存后列表仍展示旧数据。

---

### REQ-SHIPTPL-007 模板信息规则

- 功能点：
  - 模板编号为模板唯一编码，由系统自动生成，只读展示。
  - 模板编号规则为 MBJH + 8位年月日 + 3位流水号，最长30字符。
  - 模板名称使用输入框，必填，最长50字符。
  - 模板类型为固定枚举，默认显示运输计划，可切换至常规运单。
  - 模板备注使用文本输入框，非必填，最长200字符。

- 异常与边界：
  - 模板编号生成失败时阻止保存并提示。
  - 模板名称为空或超过50字符时阻止保存。
  - 模板类型为空或不在允许枚举内时阻止保存。
  - 模板备注超过200字符时阻止保存。

- 反例：
  - 不允许手工编辑模板编号。
  - 不允许保存无模板名称的数据。
  - 不允许提交未知模板类型。

---

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

- 功能点：
  - 项目使用模糊搜索选择框，必填，用于选择计划所属项目。
  - 客户合同使用选择框，必填，选择项目后自动带出，不允许单独修改；若项目下存在多个客户合同，则下拉供用户选择。
  - 运输类型使用下拉单选控件，必填，枚举包含公路整车、公路零担、空运、铁路、水运等，默认公路整车。
  - 基本信息备注使用文本输入框，非必填，最长200字符。

- 异常与边界：
  - 项目为空时阻止提交。
  - 客户合同未能根据项目带出时阻止提交，并提示用户重新选择项目。
  - 运输类型为空或不在允许枚举内时阻止提交。
  - 基本信息备注超过200字符时阻止提交。

- 反例：
  - 不允许未选项目时选择客户合同。
  - 不允许客户合同脱离项目单独维护。
  - 不允许使用非枚举运输类型。

---

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

- 功能点：
  - 公路运输时，发货地址和收货地址使用地址选择框或输入搜索选择框，可从常用地址库选择，也可按地址搜索选择。
  - 水运或海运时，发货地址和收货地址显示为港口选择，交互变为从基础数据选择港口。
  - 空运时，发货地址和收货地址显示为空港选择，交互变为从基础数据选择空港。
  - 铁运时，发货地址和收货地址显示为站点选择，交互变为从基础数据选择站点。
  - 非公路运输选择基础数据后，前侧展示名称或编码，后侧展示详细地址。
  - 发货联系人、收货联系人使用输入框，最长20字符。
  - 发货联系方式、收货联系方式使用输入框，最长20字符。
  - 计划发货日期、计划完成日期使用日期选择控件。
  - 支持通过选择常用线路自动回填发货地址、收货地址、联系人、联系方式等信息。

- 异常与边界：
  - 发货地址或收货地址为空时阻止提交。
  - 非公路运输未选择对应基础数据时阻止提交。
  - 联系方式超过20字符或格式不合法时阻止提交。
  - 联系人超过20字符时阻止提交。
  - 计划完成日期早于计划发货日期时阻止提交。
  - 切换运输类型后，不适用的收发货地址字段应清空或重新选择。

- 反例：
  - 不允许水运、空运、铁运继续使用公路地址选择逻辑。
  - 不允许运输类型切换后沿用旧类型地址数据。
  - 不允许保存缺失发货地址或收货地址的模板。

---

### REQ-SHIPTPL-010 货物信息规则

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

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

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

---

### REQ-SHIPTPL-011 附件规则

- 功能点：
  - 支持上传模板相关附件。
  - 附件为非必填，支持多个文件。
  - 支持 JPG、PNG、PDF 等格式。
  - 编辑时支持查看、追加或删除附件。

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

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

---

### REQ-SHIPTPL-012 选择常用地址

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

- 异常与边界：
  - 查询无数据时展示空状态。
  - 选择的数据已失效或不存在时提示重新选择。
  - 地址类型与当前运输类型不匹配时不允许选择。

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

---

### REQ-SHIPTPL-013 选择常用线路

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

- 异常与边界：
  - 查询无数据时展示空状态。
  - 线路已删除或不可用时提示重新选择。
  - 常用线路的运输类型或地址类型与当前模板运输类型不匹配时不允许选择。

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

---

### REQ-SHIPTPL-014 选择常用货物

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

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

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

---

### REQ-SHIPTPL-015 从模板新建

- 功能点：
  - 支持在列表行操作中点击从模板新建。
  - 系统根据当前发货模板的模板类型自动分流：
    - 模板类型为运输计划时，跳转至“运输计划”模块的新建页面。
    - 模板类型为常规运单或运单时，跳转至“运单管理”模块的新建页面。
  - 跳转后目标页面自动回填当前模板可映射的数据，包含模板信息、基本信息、收发货信息、货物信息、附件等内容。
  - 回填后用户可继续补充或调整目标模块中允许编辑的字段。
  - 若模板包含目标模块特有字段，按目标模块规则进行回填，不适配字段不强制带入。

- 异常与边界：
  - 模板数据已删除或不存在时提示数据不存在。
  - 模板缺少目标模块必填字段时，跳转后应明确提示用户补齐。
  - 模板类型无法识别时，不允许跳转，提示模板类型不支持。
  - 跳转失败时不影响原模板数据。

- 反例：
  - 不允许从模板新建时修改原模板数据。
  - 不允许跳转错误目标模块。
  - 不允许跳转后不回填模板数据。
  - 不允许缺失模板数据时静默创建失败。

---

### REQ-SHIPTPL-016 单条删除

- 功能点：
  - 支持通过行操作删除单条发货模板。
  - 点击删除弹出二次确认弹窗。
  - 确认后删除该模板，删除成功刷新列表，并提示“删除成功”。

- 异常与边界：
  - 数据不存在时提示数据不存在，并刷新列表。
  - 删除失败时提示失败原因，不改变列表其他数据。
  - 用户取消二次确认时不执行删除。

- 反例：
  - 不允许跳过二次确认直接删除。
  - 不允许删除失败后仍提示成功。
  - 不允许删除成功后列表不刷新。

---

### REQ-SHIPTPL-017 批量删除

- 功能点：
  - 支持勾选多行发货模板后批量删除。
  - 点击批量删除弹出二次确认弹窗。
  - 确认后批量删除所选模板。
  - 删除成功后刷新列表，并提示“删除成功”。

- 异常与边界：
  - 未勾选数据时点击批量删除，应提示先选择需要删除的数据。
  - 部分删除失败时应提示成功数量与失败数量。
  - 用户取消二次确认时不执行删除。

- 反例：
  - 不允许未选择数据时执行批量删除。
  - 不允许因为部分失败而回滚已成功删除的数据，除非后端明确按事务处理。
  - 不允许删除后不刷新列表。

---

### REQ-SHIPTPL-018 权限与审计

- 功能点：
  - 根据用户权限控制查询、新建模板、编辑、删除、从模板新建、批量删除等操作入口。
  - 创建人、创建时间、更新人、更新时间由系统自动记录。
  - 列表、详情、导出预览等用户可见场景优先展示用户姓名，不直接展示用户 ID。

- 异常与边界：
  - 无权限访问时提示权限不足。
  - 无按钮权限时不展示对应按钮。
  - 操作失败时不记录为成功日志。

- 反例：
  - 不允许无权限用户执行新增、编辑、删除、从模板新建等操作。
  - 不允许手动维护创建人、创建时间、更新人、更新时间。
  - 不允许删除或篡改审计信息。

---

### REQ-SHIPTPL-019 运单模板布局

- 功能点：
  - 运单类型页面采用模板信息、基本信息、收发货信息、货物信息、运费信息、附件等分区布局。
  - 模板信息区包含模板编号、模板名称、模板类型、备注。
  - 基本信息区包含项目、客户合同、发货计划、运输类型、备注。
  - 收发货信息区包含发货地址、发货联系人、联系方式、收货地址、收货联系人、联系方式，以及计划发货日期、计划完成日期等字段。
  - 货物信息区以表格方式维护货物明细，支持新增、删除、导入货物、常用货物。
  - 底部固定展示保存模板、返回等操作按钮，操作区与内容区分离。

- 异常与边界：
  - 切换到运单类型时，模板类型与下方布局必须联动切换。
  - 非运单模板不展示运费信息区。
  - 运单页面若从模板新建进入，应默认带入模板信息并维持运单布局。

- 反例：
  - 不允许运单页面沿用发货模板的表单布局。
  - 不允许将运单类型与模板类型混为同一字段。
  - 不允许保存按钮被滚动内容遮挡。

---

### REQ-SHIPTPL-020 运费信息规则

- 功能点：
  - 运输类型为铁、水、空时显示运费信息区。
  - 运费信息区包含运费、数量、其他运费合计、运费合计、币种等字段。
  - 运费合计为只读字段，由系统自动计算，规则为运费 + 其他运费合计。
  - 如果货物的数量与计量单位已填写，且单价已填写，则系统自动计算运费，运费允许用户修改。
  - 若数量、计量单位或单价缺少任一项，则不自动计算运费。
  - 运输类型为公路时不展示该运费信息区。
  - 币种默认显示 USD 或人民币等对应枚举值，支持下拉选择。

- 异常与边界：
  - 运费、其他运费合计为数值输入，最多2位小数。
  - 运费合计不允许手工编辑。
  - 当数量、计量单位、单价完整但自动计算失败时应提示计算异常。
  - 运输类型切换后，运费信息区应按当前类型重新展示与计算。

- 反例：
  - 不允许公路类型继续显示铁、水、空运费区。
  - 不允许运费合计被手工改写。
  - 不允许数量或单价缺失时仍强制自动计算运费。

---

### REQ-SHIPTPL-021 查看过程配置按钮

- 功能点：
  - 底部提供查看过程配置按钮。
  - 点击后弹出过程配置弹窗，展示该项目配置的现行过程节点。
  - 若该项目未配置过程配置，则不展示该按钮。
  - 弹窗仅用于查看，不允许修改过程节点配置。

- 异常与边界：
  - 项目无过程配置时不显示查看过程配置按钮。
  - 过程配置加载失败时提示失败原因。
  - 弹窗关闭后不影响当前表单内容。

- 反例：
  - 不允许未配置项目强制展示查看过程配置按钮。
  - 不允许在查看弹窗中修改节点配置。
  - 不允许按钮点击后丢失当前运单表单数据。

---

## 通用规则

- 发货模板用于沉淀运输计划或常规运单的常用填写内容，提升创建运输计划和运单的效率。
- 发货模板归属于新增主菜单“业务管理”。
- 模板编号由系统自动生成，规则为 MBJH + 8位年月日 + 3位流水号，且不可编辑。
- 模板名称必填，最长50字符。
- 项目、客户合同、运输类型、发货地址、收货地址、货物类型为核心必填项。
- 运输类型为公路时，收发货地址按地址选择逻辑处理；运输类型为水运或海运时选择港口，空运时选择空港，铁运时选择站点。
- 收发货地址从基础数据、常用地址或常用线路选择后，必须同步回填名称、编码、详细地址等关联信息。
- 货物信息至少保留一行，货物类型必填。
- 运单类型页面需支持查看过程配置按钮和运费信息区。
- 从模板新建时需按模板类型自动跳转到运输计划或运单管理模块，并回填模板可映射数据。
- 运费合计自动计算为运费加其他运费合计，并只读展示。
- 当数量、计量单位、单价完整时可自动计算运费，计算结果允许用户修改。
- 附件非必填，支持多个 JPG、PNG、PDF 等格式文件。
- 新增、编辑、删除、批量删除成功后均需刷新列表。
