# 功能测试流程文档 ——【异常不良管理】

> 本文档为【异常不良管理】功能迁移后的独立测试文档。测试人员请按以下流程逐步执行，对通过的用例在"通过"列打勾（`[x]`），未通过的用例在"问题记录"列描述具体现象（包括错误截图编号、操作步骤、实际/预期差异等）。

| 项目名称 | MES-UI（生产主数据 → 产品模型 → 异常不良管理） |
| --- | --- |
| 文档版本 | v1.0 |
| 适用版本 | mes-ui 本次迁移版本 |
| 编写日期 | 2026-06-02 |
| 测试入口 | 菜单：生产主数据 → 产品模型 → 异常不良管理 |
| 关联文件 | [主页面](file:///d:/code/mes/mes-ui/src/views/production-master-data/product-model/product-ng-info/index.vue) · [导入组件](file:///d:/code/mes/mes-ui/src/views/production-master-data/product-model/product-ng-info/components/ImportDialog/index.vue) · [API](file:///d:/code/mes/mes-ui/src/api/production-master-data/product-ng-info.js) · [路由](file:///d:/code/mes/mes-ui/src/router/modules/production-master-data.js) · [文件工具](file:///d:/code/mes/mes-ui/src/utils/file.js) |

---

## 一、测试环境配置要求

| 项 | 要求 |
| --- | --- |
| 后台环境 | Webman + 已部署 `production_configuration/product_model/product_ng_info/` 路由接口；数据库中已创建 `product_ng_info` 与 `device_category` 数据表 |
| 前端环境 | `npm run serve` / `pnpm run serve` 启动 mes-ui 工程；浏览器推荐 Chrome 110+ |
| 登录账号 | 拥有「生产主数据 / 异常不良管理」菜单访问权限，且分配以下权限点：<br>· `…/product_ng_info/create`（新增 / 导入）<br>· `…/product_ng_info/edit`（编辑）<br>· `…/product_ng_info/delete`（删除 / 批量删除）<br>· `…/product_ng_info/export`（导出） |
| 网络要求 | 前后端网络互通；浏览器可访问 `VUE_APP_API` 环境变量对应域名 |
| 数据准备 | · 至少 3 条设备类别（device_category）数据<br>· 至少 5 条异常不良类别记录<br>· 准备一份合法格式的 Excel 导入文件（含 3 行导入数据）和一份缺少列的非法文件 |
| 浏览器工具 | 打开 DevTools（F12）→ Network 与 Console，便于抓取接口与异常 |
| 第三方库 | `xlsx` 已安装（Excel 读写支持），确认 `node_modules/xlsx/` 目录存在 |

---

## 二、测试前置条件

1. 已成功登录系统，登录账号具备上述所有权限点。
2. 侧边栏显示 **生产主数据 → 产品模型 → 异常不良管理** 菜单可点击进入。
3. 浏览器语言切换为「简体中文」，界面文字全部为中文，无 `key is not defined` 或英文缺失。
4. 列表默认展示至少 5 条记录（通过 `product_ng_info/list` 接口返回）。
5. 浏览器缩放比例 100%；分辨率建议 1440×900 及以上。
6. DevTools 关闭缓存（Network → Disable cache），确保加载最新前端资源。

---

## 三、测试用例

> **字段说明**：
> - 设备类别 `device_category_id`：必选，从设备类别 API 动态加载
> - 类别 `type`：必选，下拉值「异常(ERR)/不良(NG)」
> - 异常不良编码 `number`：必填，长度 1~100
> - 异常不良名称 `explain`：必填，长度 1~100
> - 备注 `note`：选填，多行文本
> - 列表展示字段：复选框 / 设备类别 / 异常不良类别 / 异常不良编码 / 异常不良名称 / 备注 / 操作

### 3.1 列表展示与加载

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.1.1 | 进入「异常不良管理」菜单 | 列表正常加载，无 JS 报错；表头依次为：复选框、设备类别、异常不良类别、异常不良编码、异常不良名称、备注、操作 |  | [ ] |  |
| 3.1.2 | 观察列表加载过程 | 列表加载期间显示 loading 遮罩动画，加载完成后消失 |  | [ ] |  |
| 3.1.3 | 列表为空时（搜索条件无匹配结果） | 表格区域显示空状态占位（如"暂无数据"），无 JavaScript 报错 |  | [ ] |  |
| 3.1.4 | 分页组件：跳转到第 2 页 | 请求参数 `page_no=2` 正确，数据刷新 |  | [ ] |  |
| 3.1.5 | 修改每页条数（如从 10 改为 20） | `page_size=20`，列表重载 |  | [ ] |  |
| 3.1.6 | 列表行内操作列固定在右侧，横向滚动查看 | 操作列不随滚动条消失，固定可见 |  | [ ] |  |

### 3.2 搜索功能

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.2.1 | 点击「设备类别」下拉框 → 从列表中选择一项 → 点击「查询」 | 列表仅展示所选设备类别的记录 |  | [ ] |  |
| 3.2.2 | 在「查询类型」下拉框中选择「异常」→ 点击「查询」 | 列表仅展示 `type=ERR` 的记录 |  | [ ] |  |
| 3.2.3 | 在「查询类型」下拉框中选择「不良」→ 点击「查询」 | 列表仅展示 `type=NG` 的记录 |  | [ ] |  |
| 3.2.4 | 在「异常不良编码」输入框输入关键字 → 点击「查询」 | 列表仅展示编码包含该关键字的记录 |  | [ ] |  |
| 3.2.5 | 在「异常不良名称」输入框输入关键字 → 点击「查询」 | 列表仅展示名称包含该关键字的记录 |  | [ ] |  |
| 3.2.6 | 设备类别 + 类型 + 编码同时填写 → 点击「查询」 | 列表为三条件 AND 过滤结果 |  | [ ] |  |
| 3.2.7 | 输入查询条件后点击「重置」 | 所有输入框、下拉框恢复初始状态，列表恢复为全量数据 |  | [ ] |  |
| 3.2.8 | 在搜索输入框中按回车键 | 等同于点击「查询」，触发列表刷新 |  | [ ] |  |
| 3.2.9 | 设备类别下拉框首次展开时（即 focus 事件） | 自动调用 `/device_category/all` 加载选项；未展开时不再重复请求 |  | [ ] |  |

### 3.3 新增

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.3.1 | 点击工具栏「新增」按钮 | 弹出标题为「新增异常不良类别」的对话框，表单为空 |  | [ ] |  |
| 3.3.2 | 新增弹框打开时，设备类别下拉框自动加载可选项 | 设备类别下拉列表有数据，与搜索时的下拉来源一致 |  | [ ] |  |
| 3.3.3 | 不填任何字段，点击「确定」 | 表单校验：设备类别、类别、编码、名称四个字段下方均红字提示必填 |  | [ ] |  |
| 3.3.4 | 仅选择设备类别与类别，不填编码 → 点击「确定」 | 仅编码字段提示必填；名称字段提示必填 |  | [ ] |  |
| 3.3.5 | 编码输入 101 字符 → 点击「确定」 | 编码字段下方提示「长度在1到100个字符」 |  | [ ] |  |
| 3.3.6 | 名称输入 101 字符 → 点击「确定」 | 名称字段下方提示「长度在1到100个字符」 |  | [ ] |  |
| 3.3.7 | 正常填写：设备类别=任意、类别=异常、编码=ERR-01、名称=设备宕机、备注=生产设备意外停机 → 点击「确定」 | 弹出"操作成功"提示，对话框自动关闭，列表自动刷新并出现该条记录 |  | [ ] |  |
| 3.3.8 | 新增弹框点击「取消」或右上角 × | 对话框关闭，列表未新增任何记录 |  | [ ] |  |
| 3.3.9 | 使用无 `product_ng_info/create` 权限的账号访问 | 工具栏不显示「新增」按钮 |  | [ ] |  |
| 3.3.10 | 后端返回「编码已存在」业务错误 | 页面友好提示错误原因，弹框不关闭（可修正后重试） |  | [ ] |  |

### 3.4 编辑

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.4.1 | 列表行点击「编辑」 | 弹出标题为「编辑异常不良类别」的对话框，表单字段回显该行当前数据 |  | [ ] |  |
| 3.4.2 | 清空编码后「确定」 | 提示编码必填 |  | [ ] |  |
| 3.4.3 | 修改名称为新值，备注保留为空 → 「确定」 | 操作成功，列表对应行名称更新，备注为空 |  | [ ] |  |
| 3.4.4 | 修改编码（与已有数据重复）→ 「确定」 | 后端返回重复提示，页面友好显示不崩溃 |  | [ ] |  |
| 3.4.5 | 编辑对话中点击「取消」 | 对话框关闭，列表数据未变化 |  | [ ] |  |
| 3.4.6 | 无 `product_ng_info/edit` 权限的账号 | 行内不显示「编辑」按钮 |  | [ ] |  |
| 3.4.7 | 两个标签页同时打开同一条编辑 → A 保存后 B 再次保存 | 后端返回最新数据的验证结果，不产生脏写 |  | [ ] |  |

### 3.5 删除（行内删除）

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.5.1 | 列表行点击「删除」 | 弹出确认框，提示「确定要执行该操作吗?」 |  | [ ] |  |
| 3.5.2 | 确认框点击「取消」 | 关闭确认框，数据未删除 |  | [ ] |  |
| 3.5.3 | 确认框点击「确定」 | 操作成功，列表自动移除该记录 |  | [ ] |  |
| 3.5.4 | 删除最后一页唯一一条数据 | 列表自动回退到上一页（或空状态），不出现空白页 |  | [ ] |  |
| 3.5.5 | 删除已被其他业务引用的记录 | 后端返回业务级错误提示，数据保留，页面不崩溃 |  | [ ] |  |
| 3.5.6 | 无 `product_ng_info/delete` 权限的账号 | 行内不显示「删除」按钮 |  | [ ] |  |
| 3.5.7 | 网络断开时点击「删除」 | 提示网络异常，数据未被误删 |  | [ ] |  |

### 3.6 批量删除

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.6.1 | 不勾选任何复选框，点击「批量删除」 | 提示"请先选择数据" |  | [ ] |  |
| 3.6.2 | 勾选 2~3 行记录 → 点击「批量删除」 | 弹出确认框「确定要删除所选异常不良类别吗?」 |  | [ ] |  |
| 3.6.3 | 确认框点击「确定」 | 选中的记录全部从列表消失，操作成功提示 |  | [ ] |  |
| 3.6.4 | 确认框点击「取消」 | 数据保留，勾选状态保留 |  | [ ] |  |
| 3.6.5 | 选中的行中包含已被引用的数据 | 后端返回针对性的业务错误提示，未删除任何数据 |  | [ ] |  |
| 3.6.6 | 勾选全选（表头复选框）→ 批量删除 | 所有可见页数据被选中并删除 |  | [ ] |  |

### 3.7 Excel 导入

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.7.1 | 点击工具栏「导入」按钮 | 弹出标题为「导入异常不良数据」的对话框，上方显示黄色警告提示 |  | [ ] |  |
| 3.7.2 | 点击「下载模板」按钮 | 浏览器下载 Excel 文件（文件名为「异常不良数据导入模版.xlsx」），内容包含表头 |  | [ ] |  |
| 3.7.3 | 点击「选择文件」→ 选择非 Excel 文件（如 .txt） | 提示"上传文件格式错误" |  | [ ] |  |
| 3.7.4 | 点击「选择文件」→ 选择列缺失的 Excel（缺少"异常不良编码"列） | 提示"文件列缺失: 异常不良编码" |  | [ ] |  |
| 3.7.5 | 选择合法 Excel 文件（含 3 行数据） | 预览表格展示 3 行数据，列与 Excel 内容一致 |  | [ ] |  |
| 3.7.6 | 选择合法 Excel 后，再次选择另一个文件 | 上一个文件被替换，预览表格刷新为新文件数据 |  | [ ] |  |
| 3.7.7 | 预览数据无误后点击「确定」 | 提示"操作成功"，弹框关闭，列表刷新，新数据出现在列表中 |  | [ ] |  |
| 3.7.8 | 未选择文件（预览表格为空）点击「确定」 | 提示"请先导入数据" |  | [ ] |  |
| 3.7.9 | 导入过程中点击「取消」或关闭弹框 | 操作中断，已读取的预览数据被清空 |  | [ ] |  |
| 3.7.10 | 无 `product_ng_info/create` 权限的账号 | 工具栏不显示「导入」按钮 |  | [ ] |  |
| 3.7.11 | 导入的 Excel 中设备类别名称在后端无法匹配 | 后端返回相应错误提示，列表不新增 |  | [ ] |  |

### 3.8 Excel 导出

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.8.1 | 点击工具栏「导出」按钮 | 弹出确认框「确定要导出当前查询结果吗?」 |  | [ ] |  |
| 3.8.2 | 确认框点击「取消」 | 提示"操作已取消"，未触发任何请求 |  | [ ] |  |
| 3.8.3 | 确认框点击「确定」 | 提示"创建导出任务成功"，自动跳转至任务管理页面 |  | [ ] |  |
| 3.8.4 | 在查询条件中筛选后再点击「导出」 | 后端收到的请求包含当前搜索条件 `device_category_id` / `type` / `number` / `explain` |  | [ ] |  |
| 3.8.5 | 无 `product_ng_info/export` 权限的账号 | 工具栏不显示「导出」按钮 |  | [ ] |  |

### 3.9 权限与国际化

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.9.1 | 切换为仅有「查询」权限的账号 | 仅能查看列表与查询，无新增/编辑/删除/导入/导出按钮 |  | [ ] |  |
| 3.9.2 | 切换为中文环境 → 英文环境 → 刷新页面 | 表头、按钮、弹框标题、验证提示语全部为英文 |  | [ ] |  |
| 3.9.3 | 中文下打开新增弹框 → 切换至英文 | 弹框标题、表单 label 立即切换为英文（无需关闭弹框） |  | [ ] |  |
| 3.9.4 | 英文环境下切换回中文 | 所有文案恢复中文 |  | [ ] |  |
| 3.9.5 | 英文下执行新增/编辑/导入功能，成功/失败提示 | 提示语为英文，含义正确 |  | [ ] |  |

### 3.10 异常与边界

| 用例编号 | 操作步骤 | 预期结果 | 实际结果 | 通过 | 问题记录 |
| --- | --- | --- | --- | --- | --- |
| 3.10.1 | 后端 `/list` 接口返回 500 错误 | 列表显示空状态或错误提示用 Message 弹窗展示，页面不白屏 |  | [ ] |  |
| 3.10.2 | 后端返回字段缺失（如某行缺少 `device_category`） | 缺失字段列显示为空，不抛 JS 异常 |  | [ ] |  |
| 3.10.3 | 备注字段输入 5000 字符并保存 | 提交成功，列表备注列可滚动展示（建议使用省略号截断） |  | [ ] |  |
| 3.10.4 | 新增/编辑弹框打开后按 ESC 键 | 弹框关闭，表单状态被重置 |  | [ ] |  |
| 3.10.5 | 列表横向宽度超过浏览器视口 | 操作列固定在右侧，表格支持横向滚动 |  | [ ] |  |
| 3.10.6 | DevTools Console 全程监控 | 无 `Vue warn`、无未捕获 Promise 异常、无 i18n key 缺失警告 |  | [ ] |  |
| 3.10.7 | 快速连续点击「新增」→ 「确定」 | 提交按钮 loading 状态阻止重复提交 |  | [ ] |  |
| 3.10.8 | 设备类别 API 请求失败时展开搜索下拉 | 下拉框为空，页面不崩溃；重试正常 |  | [ ] |  |

---

## 四、测试结果汇总

| 用例总数 | 通过 | 失败 | 阻塞 | 通过率 |
| --- | --- | --- | --- | --- |
|  |  |  |  |  |

---

## 五、问题记录区

| 编号 | 用例编号 | 复现步骤 | 实际结果 | 严重程度 | 处理人 | 状态 | 备注 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 |  |  |  |  |  |  |  |
| 2 |  |  |  |  |  |  |  |
| 3 |  |  |  |  |  |  |  |
| 4 |  |  |  |  |  |  |  |
| 5 |  |  |  |  |  |  |  |

---

## 六、测试结论

| 项目 | 结论 |
| --- | --- |
| 功能完整性 | ☐ 满足 ☐ 部分缺失 ☐ 不满足 |
| 性能表现 | ☐ 良好 ☐ 一般 ☐ 差 |
| 权限控制 | ☐ 正确 ☐ 存在漏洞 |
| 国际化 | ☐ 完整 ☐ 部分缺失 ☐ 缺失 |
| 导入导出 | ☐ 正常 ☐ 部分异常 ☐ 不可用 |
| 是否可发布 | ☐ 是 ☐ 否（请说明阻塞问题） |

测试人员签字：__________________  日期：__________

---
*本测试流程文档为【异常不良管理】功能迁移版本专用，请独立归档保存。*
