# MES-UI 迁移功能测试流程文档（累积追加版）

> 本文档用于记录每次 MES-UI 迁移完成后的功能测试流程。
> 采用**累积追加**模式：每次完成新功能迁移，将对应测试内容追加到本文件末尾，并在「目录」中补充章节索引。
> 测试人员按章节顺序执行用例，每完成一项需在「[ ]」中改为「[x]」并填写实际结果；对未通过项在「问题记录」区域详细描述。
>
> **测试结果约定**：
> - ✅ 通过（Pass）  
> - ❌ 失败（Fail）  
> - ⚠️ 阻塞（Block，依赖其他功能未通过）
>
> **填写示例**：
> - `[x] 1.1 列表正常加载  ✅  实际：10 条记录，分页正常`
> - `[ ] 1.2 编码为空校验  ❌  实际：未拦截空值，提示词缺失`

---

## 目录

- [一、测试环境与通用前置条件](#一测试环境与通用前置条件)
- [二、物料类别列表（Material Category）](#二物料类别列表material-category)
- [三、物料信息管理（Material Master）](#三物料信息管理material-master)

---

## 一、测试环境与通用前置条件

> 所有功能测试前，请先确认以下环境和基础数据准备就绪。

### 1.1 测试环境

| 项目 | 要求 |
|------|------|
| 操作系统 | Windows 10 / 11 或 macOS |
| 浏览器 | Chrome ≥ 100（推荐）、Edge ≥ 100 |
| Node.js | ≥ 16.0（用于本地构建） |
| MES-UI 仓库 | `d:\code\mes\mes-ui`，已安装依赖 `pnpm install` |
| 后端服务 | Webman 后台已启动（地址、端口按部署环境），数据库表 `material_category` 已存在 |
| 启动命令 | `pnpm dev` 或 `npm run serve`，默认 `http://localhost:8080` |
| 登录账号 | 具备「生产配置」菜单权限的账号，建议使用 `admin` 角色 |
| 网络 | 能正常访问后端 API |

### 1.2 通用前置条件

1. 已完成 `pnpm install`，依赖安装无错误。
2. `pnpm dev` 启动成功，浏览器可访问 `http://localhost:8080`。
3. 使用具有「生产配置 / 物料模型 / 物料类别列表」访问权限的账号登录。
4. 后端数据库中 `material_category` 表至少有 1 条数据，用于列表展示和编辑。
5. 中英文语言切换正常：在右上角下拉框切换「中文 / English」，所有标签翻译均能显示。
6. 浏览器 DevTools 的 Network 面板可见请求 URL 类似 `production_configuration/matetial_model/matetial_category/list?...`（迁移后保持旧 URL）。

### 1.3 测试结果总览（按功能）

| 功能 | 章节 | 用例数 | 通过 | 失败 | 阻塞 | 测试人 / 日期 |
|------|------|:----:|:----:|:----:|:----:|---------------|
| 物料类别列表 | 二 | 22 |  |  |  |  |
| 物料信息管理 | 三 | 30 |  |  |  |  |

---

## 二、物料类别列表（Material Category）

### 2.1 功能概述

- **一级模块**：生产配置（Production Master Data）
- **二级模块**：物料模型（Material Model）
- **三级模块**：物料类别列表（Material Category）
- **功能说明**：用于维护物料类别（区分原材料和半成品），支持编码、名称、备注、创建时间等字段的增删改查
- **菜单路径**：生产配置 → 物料模型 → 物料类别列表
- **路由地址**：`/production_configuration/matetial_model/matetial_category`（迁移阶段沿用旧 URL）
- **涉及文件**：
  - 页面：[src/views/production-master-data/material-model/material-category/index.vue](file:///d:/code/mes/mes-ui/src/views/production-master-data/material-model/material-category/index.vue)
  - API：[src/api/production-master-data/material-category.js](file:///d:/code/mes/mes-ui/src/api/production-master-data/material-category.js)
  - 路由：[src/router/modules/production-master-data.js](file:///d:/code/mes/mes-ui/src/router/modules/production-master-data.js)
  - i18n：`src/locales/zh-chs.json` & `en.json`（key 前缀 `page.production_master_data.material_model.material_category.*`）

### 2.2 字段说明

| 字段 | 类型 | 必填 | 长度限制 | 说明 |
|------|------|:----:|---------|------|
| 序号 | 数字 | — | — | 表格自增序号，由 `useTableColumns` 自动生成 |
| 物料类别编码 | 字符串 | ✅ | 1~45 | 唯一标识 |
| 物料类别名称 | 字符串 | ✅ | 1~45 | 类别中文名 |
| 备注 | 字符串 | ❌ | — | 多行文本 |
| 创建时间 | 日期 | — | — | 后端自动填充 |
| 操作 | — | — | — | 行内「编辑」「删除」按钮 |

### 2.3 前置条件

1. 已登录具备「生产配置 / 物料模型 / 物料类别列表」权限的账号。
2. 后端 `material_category` 表存在；若为空，可通过本测试用例的「新增」步骤补足。
3. 浏览器地址栏输入 `/production_configuration/matetial_model/matetial_category` 可直接访问。
4. 当前页面右上角语言切换为「中文」；切换为「English」后再次验证关键标签。

### 2.4 测试用例

#### 2.4.1 列表与搜索

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 1.1 | 打开「物料类别列表」页面 | 表格自动加载，列表正常显示；表头依次为：序号 / 物料类别编码 / 物料类别名称 / 备注 / 创建时间 / 操作 |  | ☐ |
| 1.2 | 在「物料类别编码」输入框输入已存在的关键字，点击「查询」 | 列表仅显示编码模糊匹配的数据，页码回到 1；URL 不暴露搜索值 |  | ☐ |
| 1.3 | 在「物料类别名称」输入框输入已存在的关键字，点击「查询」 | 列表仅显示名称模糊匹配的数据 |  | ☐ |
| 1.4 | 同时输入编码 + 名称后点击「查询」 | 列表为 AND 条件过滤结果 |  | ☐ |
| 1.5 | 在搜索框内按 `Enter` 键 | 触发查询，效果与点击「查询」一致 |  | ☐ |
| 1.6 | 点击「重置」按钮 | 搜索框清空，列表恢复初始数据，页码回到 1 |  | ☐ |
| 1.7 | 翻到第 2 页，点击「重置」 | 页码回到 1，列表刷新 |  | ☐ |
| 1.8 | 列表行数超过 1 页时，切换「每页显示条数」 | 列表按新分页重新加载，URL / 请求参数同步变化 |  | ☐ |
| 1.9 | 切换右上角语言为「English」 | 表头列名翻译正确：No. / Category Code / Category Name / Remark / Create Time / Actions |  | ☐ |
| 1.10 | 后端返回空数据 | 表格区域显示空数据占位，分页总数为 0 |  | ☐ |

#### 2.4.2 新增物料类别

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 2.1 | 点击工具栏「新增」按钮 | 弹出「新增物料类别」对话框，含编码 / 名称 / 备注三个表单项，编码默认聚焦 |  | ☐ |
| 2.2 | 编码留空，名称输入「测试类别 A」，备注输入「原材料」，点击「确定」 | 弹框内编码字段红色错误提示「请输入物料类别编码」；不会提交成功 |  | ☐ |
| 2.3 | 编码输入「TEST_001」，名称留空，点击「确定」 | 名称字段红色错误提示「请输入物料类别名称」 |  | ☐ |
| 2.4 | 编码输入 46 个字符（如 46 个 `a`），名称输入「测试类别 A」，点击「确定」 | 编码字段提示「长度在 1 到 45 个字符」 |  | ☐ |
| 2.5 | 名称输入 46 个字符，编码输入「TEST_002」，点击「确定」 | 名称字段提示「长度在 1 到 45 个字符」 |  | ☐ |
| 2.6 | 编码输入已存在的编码（如数据库现存 `RAW_001`），名称输入「重复测试」，点击「确定」 | 提交失败，弹出后端返回的错误提示（如「编码已存在」）；列表不刷新 |  | ☐ |
| 2.7 | 编码输入「TEST_001」，名称输入「测试类别 A」，备注输入「用于半成品分类」，点击「确定」 | 提交成功，弹框关闭，顶部提示「操作成功」；列表新增一行 |  | ☐ |
| 2.8 | 在弹框中点击「取消」 | 弹框关闭，不提交任何数据 |  | ☐ |
| 2.9 | 打开新增弹框后点击右上角 × 关闭 | 弹框关闭，再次打开时表单已重置 |  | ☐ |
| 2.10 | 重复 2.7 步骤的编码「TEST_001」再次提交 | 后端返回「编码已存在」或类似错误，不重复创建 |  | ☐ |

#### 2.4.3 编辑物料类别

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 3.1 | 在列表中找到「测试类别 A」（2.7 创建），点击行内「编辑」 | 弹出「编辑物料类别」对话框，编码 / 名称 / 备注自动回填 |  | ☐ |
| 3.2 | 将名称修改为「测试类别 A1」，备注改为「原材料-已更新」，点击「确定」 | 提交成功，弹框关闭，提示「操作成功」；列表行名称 / 备注同步更新 |  | ☐ |
| 3.3 | 编辑时清空编码并保存 | 编码字段必填提示「请输入物料类别编码」 |  | ☐ |
| 3.4 | 编辑时清空名称并保存 | 名称字段必填提示「请输入物料类别名称」 |  | ☐ |
| 3.5 | 编辑时将编码修改为与另一行相同的值（如 `RAW_001`），点击「确定」 | 后端返回「编码已存在」错误 |  | ☐ |
| 3.6 | 编辑弹框打开后点击「取消」 | 数据不保存，列表无变化 |  | ☐ |
| 3.7 | 编辑后重新打开编辑弹框 | 表单仍展示上一次保存后的数据 |  | ☐ |
| 3.8 | 编辑成功后检查「创建时间」字段 | 创建时间未变化（仅首次新增时赋值） |  | ☐ |

#### 2.4.4 删除物料类别

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 4.1 | 在列表中找到「测试类别 A1」，点击行内「删除」 | 弹出确认框「确定要执行该操作吗?」，标题为「提示」 |  | ☐ |
| 4.2 | 在确认框中点击「取消」 | 删除取消，列表无变化 |  | ☐ |
| 4.3 | 在确认框中点击「确定」 | 确认框关闭，顶部提示「操作成功」；该行从列表中消失 |  | ☐ |
| 4.4 | 在仅剩 1 条数据的列表上点击「删除」并确认 | 删除成功后，列表变为空，分页回到第 1 页 |  | ☐ |
| 4.5 | 尝试删除仍被「物料信息」引用的物料类别 | 后端返回「存在引用，无法删除」或类似错误 |  | ☐ |
| 4.6 | 删除操作期间切换「每页显示条数」 | 删除后页码自动修正，避免出现空页 |  | ☐ |

#### 2.4.5 权限与异常场景

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 5.1 | 使用无「新增」权限的账号登录 | 工具栏「新增」按钮不显示或不可点击 |  | ☐ |
| 5.2 | 使用无「编辑」权限的账号登录 | 行内「编辑」按钮不显示 |  | ☐ |
| 5.3 | 使用无「删除」权限的账号登录 | 行内「删除」按钮不显示 |  | ☐ |
| 5.4 | 断网后刷新页面 | 表格显示加载失败或空态，DevTools Network 显示请求失败 |  | ☐ |
| 5.5 | 后端返回 500 错误（如临时停服） | 顶部红色错误提示（如「操作失败」），不卡死页面 |  | ☐ |
| 5.6 | 同时打开两个浏览器标签页，在 A 标签新增数据后，B 标签刷新列表 | B 标签列表应能看到 A 标签新增的数据 |  | ☐ |

#### 2.4.6 国际化与界面

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 6.1 | 中文状态下打开新增弹框 | 弹框标题、字段标签、按钮文字均为中文 |  | ☐ |
| 6.2 | 切换为「English」后再次打开新增弹框 | 弹框标题「Add Material Category」，按钮「Confirm / Cancel」 |  | ☐ |
| 6.3 | 中文状态下点击删除，确认弹框标题为「提示」 | 确认框标题与按钮文字中文显示 |  | ☐ |
| 6.4 | 英文状态下点击删除，确认弹框标题为「Tip」 | 确认框英文显示 |  | ☐ |
| 6.5 | 列表右上角「帮助」按钮（? 图标） | 鼠标悬停或点击显示「物料类别用于区分原材料和半成品」 |  | ☐ |
| 6.6 | 备注字段为空时点击保存 | 提交成功，列表中备注列空白（无 `null` / `undefined` 文本） |  | ☐ |

### 2.5 接口契约（用于前后端联调核对）

| 方法 | URL | 旧 method 名 | 入参关键 key | 备注 |
|------|-----|-------------|-------------|------|
| GET | `production_configuration/matetial_model/matetial_category/list` | `production_configuration_matetial_model_matetial_category_list` | `code / name / page_no / page_size` | 列表查询 |
| GET | `…/all` | `…_all` | — | 全部类别（下拉框用，可选） |
| POST | `…/create` | `…_create` | `code / name / remark` | 新增 |
| PUT | `…/edit` | `…_edit` | `id / code / name / remark` | 编辑（`id` 为行主键） |
| DELETE | `…/delete` | `…_delete` | `id: [rowId]` | 删除，参数名 `id` 数组（与旧项目保持一致） |

### 2.6 问题记录

> 测试人员发现问题时填写。每条问题一行，格式：`[编号] [用例编号] [现象] [复现步骤] [期望] [截图/日志] [负责人] [处理状态]`。

| 编号 | 用例 | 现象 | 复现步骤 | 期望 | 截图/日志 | 负责人 | 状态 |
|:---:|:---:|------|---------|------|----------|:----:|:----:|
|  |  |  |  |  |  |  |  |

### 2.7 备注

- 本页面沿用旧 URL 与后台 method 名，待后台数据库路由表统一更新后统一修改。
- 涉及 `confirmMixin` / `useTableColumns` / `useTableButtons` / `i18nMixin` 等公共 Composable，如其他页面出现类似问题，先确认是否在迁移组件时有遗漏。
- 若新增 / 编辑成功后接口返回结构变化（`res.data` 包裹层调整），需要同步更新 `fetchData` 的解析逻辑。

---

## 三、物料信息管理（Material Master）

### 3.1 功能概述

- **一级模块**：生产配置（Production Master Data）
- **二级模块**：物料模型（Material Model）
- **三级模块**：物料信息管理（Material Master）
- **功能说明**：用于维护物料主数据，包括物料编码、名称、所属物料类别、单位、备注等，支持新增、编辑、删除、批量删除、按编码/名称/类别检索。
- **菜单路径**：生产配置 → 物料模型 → 物料信息管理
- **路由地址**：`/production_configuration/matetial_model/matetial_management`（迁移阶段沿用旧 URL）
- **涉及文件**：
  - 页面：[src/views/production-master-data/material-model/material-master/index.vue](file:///d:/code/mes/mes-ui/src/views/production-master-data/material-model/material-master/index.vue)
  - API：[src/api/production-master-data/material-master.js](file:///d:/code/mes/mes-ui/src/api/production-master-data/material-master.js)
  - 路由：[src/router/modules/production-master-data.js](file:///d:/code/mes/mes-ui/src/router/modules/production-master-data.js)
  - i18n：`src/locales/zh-chs.json` & `en.json`（key 前缀 `page.production_master_data.material_model.material_master.*`）

### 3.2 字段说明

| 字段 | 类型 | 必填 | 长度限制 | 说明 |
|------|------|:----:|---------|------|
| 序号 | 数字 | — | — | 表格自增序号 |
| 物料编码 | 字符串 | ✅ | 1~100 | 唯一标识 |
| 物料名称 | 字符串 | ✅ | 1~100 | 物料中文名 |
| 物料类别 | 下拉 | ✅ | — | 来源于物料类别下拉（依赖「物料类别列表」已迁移） |
| 单位 | 输入/下拉 | ❌ | — | 当前版本以文本框占位；待「计量单位」模块迁移后接入下拉数据源 |
| 备注 | 字符串 | ❌ | — | 多行文本，超过 20 字符鼠标悬停展示全量 |
| 创建人 | 字符串 | — | — | 后端返回 |
| 创建时间 | 日期 | — | — | 后端自动填充 |
| 操作 | — | — | — | 行内「编辑」「删除」按钮 |

### 3.3 前置条件

1. 已登录具备「生产配置 / 物料模型 / 物料信息管理」权限的账号。
2. 已完成「物料类别列表」迁移，「物料类别」下拉数据正常加载（用于新增/编辑时的类别选择）。
3. 后端 `material` 表存在；若为空，可通过本测试用例的「新增」步骤补足。
4. 浏览器地址栏输入 `/production_configuration/matetial_model/matetial_management` 可直接访问。
5. 当前页面右上角语言切换为「中文」；切换为「English」后再次验证关键标签。

### 3.4 测试用例

#### 3.4.1 列表与搜索

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 1.1 | 打开「物料信息管理」页面 | 表格自动加载，列表正常显示；表头依次为：序号 / 物料编码 / 物料名称 / 物料类别 / 单位 / 备注 / 创建人 / 创建时间 / 操作 |  | ☐ |
| 1.2 | 物料类别下拉可正常展开，选项来源于物料类别数据 | 下拉选项与「物料类别列表」一致，支持搜索过滤 |  | ☐ |
| 1.3 | 在「物料编码」输入框输入已存在的关键字，点击「查询」 | 列表仅显示编码模糊匹配的数据，页码回到 1 |  | ☐ |
| 1.4 | 在「物料名称」输入框输入已存在的关键字，点击「查询」 | 列表仅显示名称模糊匹配的数据 |  | ☐ |
| 1.5 | 在「物料类别」下拉中选择某一项，点击「查询」 | 列表仅显示该类别下的物料 |  | ☐ |
| 1.6 | 同时输入编码 + 名称 + 类别后点击「查询」 | 列表为 AND 条件过滤结果 |  | ☐ |
| 1.7 | 在搜索框内按 `Enter` 键 | 触发查询，效果与点击「查询」一致 |  | ☐ |
| 1.8 | 点击「重置」按钮 | 搜索框清空，列表恢复初始数据，页码回到 1 |  | ☐ |
| 1.9 | 翻到第 2 页，点击「重置」 | 页码回到 1，列表刷新 |  | ☐ |
| 1.10 | 列表行数超过 1 页时，切换「每页显示条数」 | 列表按新分页重新加载，请求参数 `page_size` 同步变化 |  | ☐ |
| 1.11 | 切换右上角语言为「English」 | 表头列名翻译正确：No. / Material Code / Material Name / Category / Unit / Remark / Created By / Created At / Action |  | ☐ |
| 1.12 | 备注长度 > 20 字符时，鼠标悬停单元格 | 弹层显示完整备注内容 |  | ☐ |
| 1.13 | 备注长度 <= 20 字符时 | 单元格直接展示文本，不显示弹层 |  | ☐ |
| 1.14 | 后端返回空数据 | 表格区域显示空数据占位，分页总数为 0 |  | ☐ |

#### 3.4.2 新增物料信息

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 2.1 | 点击工具栏「新增」按钮 | 弹出「新增物料信息」对话框，依次为：物料编码 / 物料名称 / 物料类别 / 单位 / 备注 |  | ☐ |
| 2.2 | 编码留空，名称输入「测试物料 A」，类别下拉选择「原材料」，点击「确定」 | 编码字段红色错误提示「请输入物料编码」 |  | ☐ |
| 2.3 | 编码输入「MAT_001」，名称留空，点击「确定」 | 名称字段红色错误提示「请输入物料名称」 |  | ☐ |
| 2.4 | 编码、名称都填写，类别留空，点击「确定」 | 类别字段红色错误提示「请选择物料类别」 |  | ☐ |
| 2.5 | 编码输入 101 个字符（如 101 个 `a`），名称输入「测试物料 A」，点击「确定」 | 编码字段提示「长度在 1 到 100 个字符」 |  | ☐ |
| 2.6 | 名称输入 101 个字符，编码输入「MAT_002」，点击「确定」 | 名称字段提示「长度在 1 到 100 个字符」 |  | ☐ |
| 2.7 | 编码输入已存在的编码，名称输入「重复测试」，点击「确定」 | 提交失败，弹出后端返回的错误提示（如「编码已存在」）；列表不刷新 |  | ☐ |
| 2.8 | 编码输入「MAT_001」，名称输入「测试物料 A」，类别选择「原材料」，单位输入「个」，备注输入「用于产线领料」，点击「确定」 | 提交成功，弹框关闭，顶部提示「操作成功」；列表新增一行且所有字段正确展示 |  | ☐ |
| 2.9 | 在弹框中点击「取消」 | 弹框关闭，不提交任何数据 |  | ☐ |
| 2.10 | 打开新增弹框后点击右上角 × 关闭，再次点击「新增」 | 弹框再次打开时表单已重置 |  | ☐ |
| 2.11 | 重复 2.8 步骤的编码「MAT_001」再次提交 | 后端返回「编码已存在」或类似错误，不重复创建 |  | ☐ |

#### 3.4.3 编辑物料信息

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 3.1 | 在列表中找到「MAT_001」（2.8 创建），点击行内「编辑」 | 弹出「编辑物料信息」对话框，编码 / 名称 / 类别 / 单位 / 备注自动回填 |  | ☐ |
| 3.2 | 将名称修改为「测试物料 A1」，类别改为「半成品」，单位改为「箱」，备注改为「用于产线补料」，点击「确定」 | 提交成功，弹框关闭，提示「操作成功」；列表行各字段同步更新 |  | ☐ |
| 3.3 | 编辑时清空编码并保存 | 编码字段必填提示「请输入物料编码」 |  | ☐ |
| 3.4 | 编辑时清空名称并保存 | 名称字段必填提示「请输入物料名称」 |  | ☐ |
| 3.5 | 编辑时清空类别并保存 | 类别字段必填提示「请选择物料类别」 |  | ☐ |
| 3.6 | 编辑时将编码修改为与另一行相同的值，点击「确定」 | 后端返回「编码已存在」错误 |  | ☐ |
| 3.7 | 编辑弹框打开后点击「取消」 | 数据不保存，列表无变化 |  | ☐ |
| 3.8 | 编辑后重新打开编辑弹框 | 表单仍展示上一次保存后的数据 |  | ☐ |
| 3.9 | 编辑成功后检查「创建时间」字段 | 创建时间未变化（仅首次新增时赋值） |  | ☐ |
| 3.10 | 编辑时清空备注并保存 | 提交成功，列表中备注列空白（无 `null` / `undefined` 文本） |  | ☐ |

#### 3.4.4 删除与批量删除

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 4.1 | 在列表中找到「MAT_001」，点击行内「删除」 | 弹出确认框「确定要执行该操作吗?」，标题为「提示」 |  | ☐ |
| 4.2 | 在确认框中点击「取消」 | 删除取消，列表无变化 |  | ☐ |
| 4.3 | 在确认框中点击「确定」 | 确认框关闭，顶部提示「操作成功」；该行从列表中消失 |  | ☐ |
| 4.4 | 在仅剩 1 条数据的列表上点击「删除」并确认 | 删除成功后，列表变为空，分页回到第 1 页 |  | ☐ |
| 4.5 | 不勾选任何数据，直接点击工具栏「批量删除」 | 顶部红色错误提示「请先选择要删除的数据」 |  | ☐ |
| 4.6 | 勾选 3 条数据，点击「批量删除」，确认框标题与按钮中文显示 | 弹出确认框「确定要删除所选物料吗?」 |  | ☐ |
| 4.7 | 在 4.6 弹出的确认框中点击「确定」 | 3 条数据全部删除，顶部提示「操作成功」；列表刷新 |  | ☐ |
| 4.8 | 尝试删除被其他业务（如 BOM）引用的物料 | 后端返回「存在引用，无法删除」或类似错误 |  | ☐ |
| 4.9 | 删除操作期间切换「每页显示条数」 | 删除后页码自动修正，避免出现空页 |  | ☐ |

#### 3.4.5 权限与异常场景

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 5.1 | 使用无「新增」权限的账号登录 | 工具栏「新增」按钮不显示或不可点击 |  | ☐ |
| 5.2 | 使用无「编辑」权限的账号登录 | 行内「编辑」按钮不显示 |  | ☐ |
| 5.3 | 使用无「删除」权限的账号登录 | 行内「删除」按钮不显示 |  | ☐ |
| 5.4 | 使用无「批量删除」权限的账号登录 | 工具栏「批量删除」按钮不显示或不可点击 |  | ☐ |
| 5.5 | 断网后刷新页面 | 表格显示加载失败或空态，DevTools Network 显示请求失败 |  | ☐ |
| 5.6 | 后端返回 500 错误（如临时停服） | 顶部红色错误提示（如「操作失败」），不卡死页面 |  | ☐ |
| 5.7 | 物料类别下拉数据加载失败时进入新增弹框 | 类别下拉为空，但仍可正常打开弹框 |  | ☐ |
| 5.8 | 同时打开两个浏览器标签页，在 A 标签新增数据后，B 标签刷新列表 | B 标签列表应能看到 A 标签新增的数据 |  | ☐ |

#### 3.4.6 国际化与界面

| # | 操作步骤 | 预期结果 | 实际结果 | 通过 |
|---|---------|---------|---------|:----:|
| 6.1 | 中文状态下打开新增弹框 | 弹框标题、字段标签、按钮文字均为中文 |  | ☐ |
| 6.2 | 切换为「English」后再次打开新增弹框 | 弹框标题「Add Material」，按钮「Confirm / Cancel」 |  | ☐ |
| 6.3 | 中文状态下点击删除，确认弹框标题为「提示」 | 确认框标题与按钮文字中文显示 |  | ☐ |
| 6.4 | 英文状态下点击删除，确认弹框标题为「Tip」 | 确认框英文显示 |  | ☐ |
| 6.5 | 列表右上角「帮助」按钮（? 图标） | 鼠标悬停或点击显示「物料信息用于维护物料编码、名称、规格等属性」 |  | ☐ |
| 6.6 | 中文状态下批量删除无选中数据 | 错误提示「请先选择要删除的数据」 |  | ☐ |
| 6.7 | 英文状态下批量删除无选中数据 | 错误提示「Please select data first」 |  | ☐ |

### 3.5 接口契约（用于前后端联调核对）

| 方法 | URL | 旧 method 名 | 入参关键 key | 备注 |
|------|-----|-------------|-------------|------|
| GET | `production_configuration/matetial_model/matetial_management/list` | `production_configuration_matetial_model_matetial_management_list` | `code / name / bom_source_category_id / page_no / page_size` | 列表查询 |
| GET | `…/all` | `…_all` | — | 全部物料（下拉框用，可选） |
| POST | `…/create` | `…_create` | `code / name / bom_source_category_id / unit_id / remark` | 新增 |
| PUT | `…/edit` | `…_edit` | `id / code / name / bom_source_category_id / unit_id / remark` | 编辑（`id` 为行主键） |
| DELETE | `…/delete` | `…_delete` | `id: [rowId]` | 单条删除，参数名 `id` 数组（与旧项目保持一致） |
| DELETE | `…/batch_delete` | `…_batch_delete` | `id: [id1, id2, …]` | 批量删除 |
| POST | `…/get_import_template` | `…_get_import_template` | — | 导入模板下载（响应 `blob`），本版本预留 |
| POST | `…/matetial_data_import` | `…_matetial_data_import` | `import_data: JSON.stringify([...])` | 物料数据导入，本版本预留 |
| POST | `…/matetial_data_export_task` | `…_matetial_data_export_task` | — | 物料数据导出任务创建，本版本预留 |

> 说明：本版本优先实现列表 / 新增 / 编辑 / 删除 / 批量删除五大核心功能；导入 / 导出（Excel 模板下载、批量导入、导出任务）保留 API 方法和钩子位置，待后续迭代中补齐弹框 UI。

### 3.6 问题记录

> 测试人员发现问题时填写。每条问题一行，格式：`[编号] [用例编号] [现象] [复现步骤] [期望] [截图/日志] [负责人] [处理状态]`。

| 编号 | 用例 | 现象 | 复现步骤 | 期望 | 截图/日志 | 负责人 | 状态 |
|:---:|:---:|------|---------|------|----------|:----:|:----:|
|  |  |  |  |  |  |  |  |

### 3.7 备注

- 本页面沿用旧 URL 与后台 method 名，待后台数据库路由表统一更新后统一修改。
- 「物料类别」下拉数据由 `getMaterialCategoryAll` 提供，依赖「物料类别列表」功能已迁移完成；如该下拉为空，请先检查该模块是否正常运行。
- 「单位」字段在当前版本以文本框占位，依赖「计量单位」模块迁移后接入下拉数据源（与 BOM 等联动），测试时需在「备注」中注明该功能尚未启用。
- 涉及 `confirmMixin` / `useTableColumns` / `useTableButtons` / `i18nMixin` 等公共 Composable，如其他页面出现类似问题，先确认是否在迁移组件时有遗漏。
- 备注长度 > 20 字符时使用 `el-popover` 悬停展示全量内容；该交互与旧项目保持一致。
- 若新增 / 编辑成功后接口返回结构变化（`res.data` 包裹层调整），需要同步更新 `fetchData` 的解析逻辑。
