feat(production-master-data): add SPC采集配置功能
实现SPC数据采集配置页面,包含路由配置、API接口、多语言文案以及完整的增删改查功能,附带功能测试文档
This commit is contained in:
648
docs/功能测试-SPC采集配置.md
Normal file
648
docs/功能测试-SPC采集配置.md
Normal file
@@ -0,0 +1,648 @@
|
||||
# SPC采集配置功能测试流程文档
|
||||
|
||||
> **测试对象**:生产配置 → SPC采集模型 → SPC采集配置(Data Collection Configuration)
|
||||
> **迁移日期**:2026-06-02
|
||||
> **对应页面**:[`src/views/production-master-data/spc-configuration/data-collection-configuration/index.vue`](file:///c:/code/compony/mes-ui-d2/src/views/production-master-data/spc-configuration/data-collection-configuration/index.vue)
|
||||
> **API 文件**:[`src/api/production-master-data/data-collection-configuration.js`](file:///c:/code/compony/mes-ui-d2/src/api/production-master-data/data-collection-configuration.js)
|
||||
> **路由路径**:`/production_configuration/spc_configuration/binding_scada_node`(旧值暂留,后续批量替换)
|
||||
> **i18n 前缀**:`page.production_master_data.spc_configuration.data_collection_configuration`
|
||||
|
||||
---
|
||||
|
||||
## 一、测试环境配置
|
||||
|
||||
| 配置项 | 要求 |
|
||||
|--------|------|
|
||||
| 浏览器 | Chrome 最新版、Edge 最新版(兼容 IE 11+) |
|
||||
| 屏幕分辨率 | ≥ 1920×1080 |
|
||||
| Node.js | ≥ 16.x |
|
||||
| 包管理器 | pnpm ≥ 7.x |
|
||||
| 后端服务 | Webman 已启动,且 SPC采集配置相关 API 可正常访问(`production_configuration/spc_configuration/binding_scada_node/*`) |
|
||||
| 测试账号 | 具有「生产配置 → SPC采集模型 → SPC采集配置」菜单权限的管理员账号(含 create / edit / delete 权限) |
|
||||
| 测试数据 | 准备至少 5 条测试用 SPC采集配置(采集编码唯一),覆盖不同采集类型(实时、周期、触发)、不同状态(启用、禁用) |
|
||||
| SCADA节点依赖 | 系统中至少配置 1 个可用的 SCADA 节点,便于绑定 |
|
||||
| 语言切换 | 先测中文(简体中文),再切到英文验证 i18n 是否正常 |
|
||||
| 权限分配 | 系统管理 → 菜单管理中确认 SPC采集配置按钮权限(新增、编辑、删除)已正确配置 |
|
||||
|
||||
---
|
||||
|
||||
## 二、测试前置条件
|
||||
|
||||
1. 后端服务(Webman)已启动,`production_configuration/spc_configuration/binding_scada_node/` 模块的 API 可正常访问
|
||||
2. 前端项目已执行 `pnpm install` 且 `pnpm dev` 正常启动,可访问登录页
|
||||
3. 使用具有「生产配置 → SPC采集模型 → SPC采集配置」菜单权限的管理员账号登录
|
||||
4. 侧边栏菜单 **生产配置 → SPC采集模型** 下可见 **SPC采集配置** 子菜单
|
||||
5. 浏览器控制台无 Vue 警告或 i18n key 缺失报错
|
||||
6. 确认 `src/locales/zh-chs.json` 和 `src/locales/en.json` 中存在 `page.production_master_data.spc_configuration.data_collection_configuration` 配置
|
||||
7. 数据库中 SPC采集配置表为空或仅有少量测试数据,便于验证
|
||||
8. 系统中至少存在 1 个已配置的 SCADA 节点
|
||||
|
||||
---
|
||||
|
||||
## 三、功能测试用例
|
||||
|
||||
### 3.1 页面加载与数据展示
|
||||
|
||||
#### TC-SCC-001:菜单导航与页面加载
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 登录系统 2. 点击侧边栏菜单「生产配置 → SPC采集模型 → SPC采集配置」 |
|
||||
| **预期结果** | 页面正常加载,URL 显示 `/production_configuration/spc_configuration/binding_scada_node`;页面顶部显示搜索栏(采集编码、采集名称、SCADA节点、状态、查询、重置按钮);中部显示 SPC采集配置 列表表格;底部分页组件显示 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-002:列表表格列头与数据展示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 查看 SPC采集配置 列表的表头列与各行数据 |
|
||||
| **预期结果** | 表格列依次为:序号、采集编码、采集名称、SCADA节点、采集类型、采集间隔(秒)、状态(tag 标签展示)、备注、操作;操作列包含「编辑」「删除」两个按钮(带图标);当数据为空时显示空数据占位提示 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-003:状态列 Tag 展示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 查看列表中状态列的不同取值 |
|
||||
| **预期结果** | 启用状态显示绿色 tag(success 类型),禁用状态显示红色 tag(danger 类型) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-004:工具栏按钮显示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 查看表格上方的工具栏 |
|
||||
| **预期结果** | 显示蓝色「新增」按钮(含加号图标),右上角显示问号「帮助」按钮(点击跳转 `/help/data-collection-configuration`) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-005:表格自适应高度
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 加载页面后查看表格高度 2. 缩小/放大浏览器窗口 3. 折叠/展开侧边栏 |
|
||||
| **预期结果** | 表格高度自动填满 d2-container 剩余空间,窗口变化时无空白或滚动条异常 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.2 搜索功能
|
||||
|
||||
#### TC-SCC-006:按采集编码精确搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在「采集编码」输入框输入完整的采集编码(如 `SCC_001`) 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格仅显示编码匹配的数据行;分页总数更新为匹配条数;输入框右侧 X 按钮可清空内容 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-007:按采集编码模糊搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在「采集编码」输入框输入编码的片段(如 `SCC_`) 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格显示所有编码包含 `SCC_` 的数据行 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-008:按采集名称搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在「采集名称」输入框输入关键字(如「温度」) 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格仅显示名称包含关键字的 SPC采集配置 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-009:按 SCADA 节点搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在「SCADA节点」输入框输入节点关键字 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格仅显示 SCADA 节点字段匹配的数据行 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-010:按状态筛选
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在「状态」下拉中选择「启用」 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格仅显示状态为启用的数据行;下拉中可选择「启用」「禁用」或留空(全部) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-011:组合条件搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 同时输入「采集编码」「采集名称」「SCADA节点」「状态」搜索条件 2. 点击「查询」按钮 |
|
||||
| **预期结果** | 表格显示同时满足所有条件的数据行(AND 关系) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-012:回车键触发搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在搜索输入框中输入关键字 2. 按下键盘回车键 |
|
||||
| **预期结果** | 等同于点击「查询」按钮,表格按搜索条件刷新 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-013:重置搜索
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 输入搜索条件并点击「查询」 2. 点击「重置」按钮 |
|
||||
| **预期结果** | 搜索输入框和状态下拉清空,表格恢复显示全部 SPC采集配置 数据 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-014:搜索无结果
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 输入不存在的编码或名称 2. 点击「查询」 |
|
||||
| **预期结果** | 表格显示空数据占位提示,分页总数显示 0 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.3 分页功能
|
||||
|
||||
#### TC-SCC-015:分页默认显示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 加载页面后查看分页组件 |
|
||||
| **预期结果** | 分页默认显示第 1 页,每页 10 条记录,总条数显示当前数据库 SPC采集配置 总数 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-016:切换每页条数
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在分页组件的「每页显示」下拉中切换为 20、50、100 2. 观察表格变化 |
|
||||
| **预期结果** | 表格按新条数加载数据,分页组件正确显示总页数 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-017:翻页功能
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 准备至少 25 条测试数据 2. 点击「下一页」「上一页」「首页」「末页」按钮 3. 输入页码跳转 |
|
||||
| **预期结果** | 表格按页加载数据,翻页流畅无报错 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.4 新增 SPC采集配置
|
||||
|
||||
#### TC-SCC-018:打开新增弹框
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 点击表格上方「新增」按钮 |
|
||||
| **预期结果** | 弹出新增 SPC采集配置 对话框,标题显示"新增SPC采集配置",包含采集编码、采集名称、SCADA节点、采集类型、采集间隔(秒)、状态、备注共 7 个表单项;「确定」「取消」按钮位于底部;弹框宽度约 50% |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-019:新增表单必填校验 - 采集编码
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 不填写「采集编码」直接点击「确定」 |
|
||||
| **预期结果** | 「采集编码」输入框下方显示红色校验提示"请输入采集编码" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-020:新增表单必填校验 - 采集名称
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 不填写「采集名称」直接点击「确定」 |
|
||||
| **预期结果** | 「采集名称」输入框下方显示红色校验提示"请输入采集名称" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-021:新增表单必填校验 - SCADA 节点
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 不填写「SCADA节点」直接点击「确定」 |
|
||||
| **预期结果** | 「SCADA节点」输入框下方显示红色校验提示"请输入SCADA节点" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-022:新增表单必填校验 - 采集类型
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 不选择「采集类型」直接点击「确定」 |
|
||||
| **预期结果** | 「采集类型」下拉框下方显示红色校验提示"请选择采集类型" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-023:新增表单必填校验 - 状态
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 清空「状态」下拉框 3. 点击「确定」 |
|
||||
| **预期结果** | 「状态」下拉框下方显示红色校验提示"请选择状态" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-024:新增成功 - 实时采集类型
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 采集编码输入 `SCC_TEST_001` 3. 采集名称输入「温度实时采集」 4. SCADA节点输入 `SCADA_NODE_01` 5. 采集类型选择「实时」 6. 采集间隔输入 `1` 7. 状态选择「启用」 8. 备注输入「测试用」 9. 点击「确定」 |
|
||||
| **预期结果** | 弹框关闭,页面右上角显示绿色成功提示"操作成功";表格自动刷新并显示新增的 SPC采集配置 行 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-025:新增成功 - 周期采集类型
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 采集编码输入 `SCC_TEST_002` 3. 采集名称输入「压力周期采集」 4. SCADA节点输入 `SCADA_NODE_02` 5. 采集类型选择「周期」 6. 采集间隔输入 `60` 7. 状态选择「启用」 8. 备注留空 9. 点击「确定」 |
|
||||
| **预期结果** | 新增成功,备注字段允许为空,表格中可见新增行(采集类型显示为"周期",采集间隔 60) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-026:新增成功 - 触发采集类型
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 采集编码输入 `SCC_TEST_003` 3. 采集名称输入「流量触发采集」 4. SCADA节点输入 `SCADA_NODE_03` 5. 采集类型选择「触发」 6. 状态选择「禁用」 7. 点击「确定」 |
|
||||
| **预期结果** | 新增成功,表格中状态列 tag 显示为红色(禁用) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-027:新增 - 编码长度校验
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 在采集编码输入框输入超过 100 个字符 3. 失焦后观察 |
|
||||
| **预期结果** | 输入框下方显示校验提示"长度在 1 到 100 个字符" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-028:新增 - 编码重复
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 输入已存在的 SPC采集配置 编码 3. 点击「确定」 |
|
||||
| **预期结果** | 提示后端返回的"编码已存在"等错误信息,新增失败,弹框不关闭 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-029:取消新增
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 填写部分内容 3. 点击「取消」按钮 |
|
||||
| **预期结果** | 弹框关闭,表格数据无变化,无任何提示 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-030:新增 - 备注多行输入
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 在备注框中输入多行文字(超过 2 行) 3. 观察文本框是否自动扩展 |
|
||||
| **预期结果** | 备注为 textarea 类型,输入多行内容后自动扩展(最少 2 行,最多 6 行) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.5 编辑 SPC采集配置
|
||||
|
||||
#### TC-SCC-031:打开编辑弹框
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 点击某一 SPC采集配置 行操作列的「编辑」按钮 |
|
||||
| **预期结果** | 弹出编辑 SPC采集配置 对话框,标题显示"编辑SPC采集配置",采集编码、采集名称、SCADA节点、采集类型、采集间隔(秒)、状态、备注共 7 个字段正确回填该行的数据 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-032:编辑成功 - 修改名称
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框(选择名称为"温度实时采集"的行) 2. 修改采集名称为"温度实时采集-改" 3. 点击「确定」 |
|
||||
| **预期结果** | 弹框关闭,提示"操作成功",表格对应行的名称列更新为新值 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-033:编辑成功 - 修改状态
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框(选择状态为启用的行) 2. 修改状态为「禁用」 3. 点击「确定」 |
|
||||
| **预期结果** | 弹框关闭,提示"操作成功",表格对应行的状态 tag 由绿色变为红色 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-034:编辑成功 - 修改采集间隔
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框 2. 修改采集间隔为 `120` 3. 点击「确定」 |
|
||||
| **预期结果** | 弹框关闭,提示"操作成功",表格对应行的采集间隔列更新为 `120` |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-035:编辑后清空必填项 - 采集名称
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框 2. 清空「采集名称」输入框 3. 点击「确定」 |
|
||||
| **预期结果** | 「采集名称」下方显示红色校验提示,无法提交 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-036:编辑后清空必填项 - SCADA 节点
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框 2. 清空「SCADA节点」输入框 3. 点击「确定」 |
|
||||
| **预期结果** | 「SCADA节点」下方显示红色校验提示,无法提交 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-037:取消编辑
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开编辑弹框 2. 修改部分字段 3. 点击「取消」按钮 |
|
||||
| **预期结果** | 弹框关闭,表格数据无变化,无任何提示 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.6 删除 SPC采集配置
|
||||
|
||||
#### TC-SCC-038:删除确认弹框
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 点击某一 SPC采集配置 行操作列的「删除」按钮 |
|
||||
| **预期结果** | 弹出确认对话框,标题显示"提示",内容为"确定要删除该SPC采集配置吗?",按钮为"确定""取消" |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-039:取消删除
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 点击「删除」按钮 2. 在确认弹框中点击「取消」 |
|
||||
| **预期结果** | 确认弹框关闭,表格数据无变化,无任何提示 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-040:删除成功
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 点击「删除」按钮 2. 在确认弹框中点击「确定」 |
|
||||
| **预期结果** | 确认弹框关闭,提示"操作成功",表格对应行被移除;分页组件总数减 1;如删除的是当前页最后一行则自动跳到上一页 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-041:删除最后一行后页码修正
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 确保当前页只有 1 条数据 2. 删除该行 |
|
||||
| **预期结果** | 删除成功后自动跳转到上一页(如当前已是第 1 页则停留在第 1 页),不会出现空页或无数据错误 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.7 国际化(i18n)
|
||||
|
||||
#### TC-SCC-042:中文显示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 系统语言切换为简体中文,查看 SPC采集配置 页面 |
|
||||
| **预期结果** | 所有列头、表单 label、按钮、提示、状态枚举均显示中文(采集编码、采集名称、SCADA节点、采集类型、采集间隔(秒)、状态、备注、新增、编辑、删除、确定、取消、提示、操作成功、实时、周期、触发、启用、禁用 等) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-043:英文显示
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 系统语言切换为英文,查看 SPC采集配置 页面 |
|
||||
| **预期结果** | 所有列头、表单 label、按钮、提示、状态枚举均显示英文(Collection Code、Collection Name、SCADA Node、Collection Type、Interval (s)、Status、Remark、Add、Edit、Delete、Confirm、Cancel、Tip、Operation succeeded、Real-time、Periodic、Trigger、Enable、Disable 等) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-044:弹框 i18n 自动响应
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 在中文状态下打开新增弹框 2. 不关闭弹框,将语言切换为英文 3. 观察弹框标题、按钮文字、表单 label 是否自动翻译为英文 |
|
||||
| **预期结果** | 弹框中的所有文案(包括 title、label、placeholder、按钮文字、校验提示)跟随语言切换自动更新为对应英文,无需关闭重开 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-045:缺失 key 校验
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 打开浏览器开发者工具,切换页面、打开弹框、切换语言 |
|
||||
| **预期结果** | 控制台无 i18n key 缺失警告(如 `[vue-i18n] Value of key 'xxx' is not a string`) |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.8 权限控制
|
||||
|
||||
#### TC-SCC-046:无 create 权限时隐藏新增按钮
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 使用没有 `create` 权限的账号登录,访问 SPC采集配置 页面 |
|
||||
| **预期结果** | 工具栏不显示「新增」按钮 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-047:无 edit 权限时隐藏编辑按钮
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 使用没有 `edit` 权限的账号登录,访问 SPC采集配置 页面 |
|
||||
| **预期结果** | 行内操作列不显示「编辑」按钮 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-048:无 delete 权限时隐藏删除按钮
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 使用没有 `delete` 权限的账号登录,访问 SPC采集配置 页面 |
|
||||
| **预期结果** | 行内操作列不显示「删除」按钮 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
### 3.9 错误处理
|
||||
|
||||
#### TC-SCC-049:网络异常 - 列表加载失败
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 关闭后端服务或断开网络 2. 刷新 SPC采集配置 页面 |
|
||||
| **预期结果** | 表格 loading 状态结束,显示空数据占位;页面顶部弹出红色错误提示(来自全局拦截器);表格不卡死 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
#### TC-SCC-050:网络异常 - 提交失败
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **测试步骤** | 1. 打开新增弹框 2. 填写完整数据 3. 在点击「确定」之前断开网络 4. 点击「确定」 |
|
||||
| **预期结果** | 弹框不关闭,loading 状态结束;弹出红色错误提示;用户可修改后重试 |
|
||||
| **实际结果** | |
|
||||
| **测试状态** | ⬜ 通过 / ⬜ 未通过 |
|
||||
| **问题描述** | |
|
||||
|
||||
---
|
||||
|
||||
## 四、测试结果汇总
|
||||
|
||||
| 用例编号 | 测试项 | 结果 | 问题摘要 |
|
||||
|:--------:|--------|:----:|---------|
|
||||
| TC-SCC-001 | 菜单导航与页面加载 | ⬜ | |
|
||||
| TC-SCC-002 | 列表表格列头与数据展示 | ⬜ | |
|
||||
| TC-SCC-003 | 状态列 Tag 展示 | ⬜ | |
|
||||
| TC-SCC-004 | 工具栏按钮显示 | ⬜ | |
|
||||
| TC-SCC-005 | 表格自适应高度 | ⬜ | |
|
||||
| TC-SCC-006 | 按采集编码精确搜索 | ⬜ | |
|
||||
| TC-SCC-007 | 按采集编码模糊搜索 | ⬜ | |
|
||||
| TC-SCC-008 | 按采集名称搜索 | ⬜ | |
|
||||
| TC-SCC-009 | 按 SCADA 节点搜索 | ⬜ | |
|
||||
| TC-SCC-010 | 按状态筛选 | ⬜ | |
|
||||
| TC-SCC-011 | 组合条件搜索 | ⬜ | |
|
||||
| TC-SCC-012 | 回车键触发搜索 | ⬜ | |
|
||||
| TC-SCC-013 | 重置搜索 | ⬜ | |
|
||||
| TC-SCC-014 | 搜索无结果 | ⬜ | |
|
||||
| TC-SCC-015 | 分页默认显示 | ⬜ | |
|
||||
| TC-SCC-016 | 切换每页条数 | ⬜ | |
|
||||
| TC-SCC-017 | 翻页功能 | ⬜ | |
|
||||
| TC-SCC-018 | 打开新增弹框 | ⬜ | |
|
||||
| TC-SCC-019 | 新增表单必填校验 - 采集编码 | ⬜ | |
|
||||
| TC-SCC-020 | 新增表单必填校验 - 采集名称 | ⬜ | |
|
||||
| TC-SCC-021 | 新增表单必填校验 - SCADA 节点 | ⬜ | |
|
||||
| TC-SCC-022 | 新增表单必填校验 - 采集类型 | ⬜ | |
|
||||
| TC-SCC-023 | 新增表单必填校验 - 状态 | ⬜ | |
|
||||
| TC-SCC-024 | 新增成功 - 实时采集类型 | ⬜ | |
|
||||
| TC-SCC-025 | 新增成功 - 周期采集类型 | ⬜ | |
|
||||
| TC-SCC-026 | 新增成功 - 触发采集类型 | ⬜ | |
|
||||
| TC-SCC-027 | 新增 - 编码长度校验 | ⬜ | |
|
||||
| TC-SCC-028 | 新增 - 编码重复 | ⬜ | |
|
||||
| TC-SCC-029 | 取消新增 | ⬜ | |
|
||||
| TC-SCC-030 | 新增 - 备注多行输入 | ⬜ | |
|
||||
| TC-SCC-031 | 打开编辑弹框 | ⬜ | |
|
||||
| TC-SCC-032 | 编辑成功 - 修改名称 | ⬜ | |
|
||||
| TC-SCC-033 | 编辑成功 - 修改状态 | ⬜ | |
|
||||
| TC-SCC-034 | 编辑成功 - 修改采集间隔 | ⬜ | |
|
||||
| TC-SCC-035 | 编辑后清空必填项 - 采集名称 | ⬜ | |
|
||||
| TC-SCC-036 | 编辑后清空必填项 - SCADA 节点 | ⬜ | |
|
||||
| TC-SCC-037 | 取消编辑 | ⬜ | |
|
||||
| TC-SCC-038 | 删除确认弹框 | ⬜ | |
|
||||
| TC-SCC-039 | 取消删除 | ⬜ | |
|
||||
| TC-SCC-040 | 删除成功 | ⬜ | |
|
||||
| TC-SCC-041 | 删除最后一行后页码修正 | ⬜ | |
|
||||
| TC-SCC-042 | 中文显示 | ⬜ | |
|
||||
| TC-SCC-043 | 英文显示 | ⬜ | |
|
||||
| TC-SCC-044 | 弹框 i18n 自动响应 | ⬜ | |
|
||||
| TC-SCC-045 | 缺失 key 校验 | ⬜ | |
|
||||
| TC-SCC-046 | 无 create 权限时隐藏新增按钮 | ⬜ | |
|
||||
| TC-SCC-047 | 无 edit 权限时隐藏编辑按钮 | ⬜ | |
|
||||
| TC-SCC-048 | 无 delete 权限时隐藏删除按钮 | ⬜ | |
|
||||
| TC-SCC-049 | 网络异常 - 列表加载失败 | ⬜ | |
|
||||
| TC-SCC-050 | 网络异常 - 提交失败 | ⬜ | |
|
||||
|
||||
---
|
||||
|
||||
## 五、问题记录
|
||||
|
||||
| 序号 | 用例编号 | 问题描述 | 复现步骤 | 严重程度 | 截图 | 处理状态 | 责任人 |
|
||||
|:----:|:--------:|---------|---------|:--------:|:----:|:--------:|--------|
|
||||
| 1 | | | | | | | |
|
||||
| 2 | | | | | | | |
|
||||
| 3 | | | | | | | |
|
||||
|
||||
---
|
||||
|
||||
## 六、测试结论
|
||||
|
||||
| 项目 | 描述 |
|
||||
|------|------|
|
||||
| 测试用例总数 | 50 |
|
||||
| 通过用例数 | |
|
||||
| 未通过用例数 | |
|
||||
| 通过率 | |
|
||||
| 是否达到上线标准 | ⬜ 是 / ⬜ 否 |
|
||||
| 备注 | |
|
||||
|
||||
**测试人员**:________________
|
||||
|
||||
**测试日期**:________________
|
||||
|
||||
**审核人员**:________________
|
||||
|
||||
**审核日期**:________________
|
||||
@@ -0,0 +1,43 @@
|
||||
import { request } from '@/api/_service'
|
||||
|
||||
const BASE = 'production_configuration/spc_configuration/binding_scada_node/'
|
||||
|
||||
function apiParams (method, data = {}) {
|
||||
return {
|
||||
method: `production_master_data_spc_configuration_data_collection_configuration_${method}`,
|
||||
platform: 'background',
|
||||
...data
|
||||
}
|
||||
}
|
||||
|
||||
export function getDataCollectionConfigList (data) {
|
||||
return request({
|
||||
url: BASE + 'list',
|
||||
method: 'get',
|
||||
params: apiParams('list', data)
|
||||
})
|
||||
}
|
||||
|
||||
export function createDataCollectionConfig (data) {
|
||||
return request({
|
||||
url: BASE + 'create',
|
||||
method: 'post',
|
||||
data: apiParams('create', data)
|
||||
})
|
||||
}
|
||||
|
||||
export function editDataCollectionConfig (data) {
|
||||
return request({
|
||||
url: BASE + 'edit',
|
||||
method: 'put',
|
||||
data: apiParams('edit', data)
|
||||
})
|
||||
}
|
||||
|
||||
export function deleteDataCollectionConfig (data) {
|
||||
return request({
|
||||
url: BASE + 'delete',
|
||||
method: 'delete',
|
||||
data: apiParams('delete', data)
|
||||
})
|
||||
}
|
||||
@@ -302,6 +302,47 @@
|
||||
"help": "Error/NG management is used to maintain equipment error types and product NG types"
|
||||
}
|
||||
},
|
||||
"spc_configuration": {
|
||||
"data_collection_configuration": {
|
||||
"search": "Search",
|
||||
"reset": "Reset",
|
||||
"enter_code": "Please enter collection code",
|
||||
"enter_name": "Please enter collection name",
|
||||
"enter_scada_node": "Please enter SCADA node",
|
||||
"enter_remark": "Please enter remark",
|
||||
"enter_interval": "Please enter collection interval (seconds)",
|
||||
"select_collect_type": "Please select collection type",
|
||||
"select_status": "Please select status",
|
||||
"operation_success": "Operation succeeded",
|
||||
"sort": "No.",
|
||||
"code": "Collection Code",
|
||||
"name": "Collection Name",
|
||||
"scada_node": "SCADA Node",
|
||||
"collect_type": "Collection Type",
|
||||
"interval": "Interval (s)",
|
||||
"status": "Status",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable",
|
||||
"real_time": "Real-time",
|
||||
"periodic": "Periodic",
|
||||
"trigger": "Trigger",
|
||||
"remark": "Remark",
|
||||
"remark_length": "Length should be 1 to 100 characters",
|
||||
"operation": "Actions",
|
||||
"add": "Add",
|
||||
"edit": "Edit",
|
||||
"delete": "Delete",
|
||||
"add_title": "Add SPC Collection Configuration",
|
||||
"edit_title": "Edit SPC Collection Configuration",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"tip": "Tip",
|
||||
"confirm_delete": "Are you sure to delete this SPC collection configuration?",
|
||||
"validation_fail": "Validation failed",
|
||||
"please_enter": "Please enter {name}",
|
||||
"help": "Configure SPC data collection parameters and bind SCADA nodes"
|
||||
}
|
||||
},
|
||||
"product_management": {
|
||||
"product_list": {
|
||||
"search": "Search",
|
||||
|
||||
@@ -302,6 +302,47 @@
|
||||
"help": "异常不良管理用于维护设备的异常种类和产品的不良种类信息"
|
||||
}
|
||||
},
|
||||
"spc_configuration": {
|
||||
"data_collection_configuration": {
|
||||
"search": "查询",
|
||||
"reset": "重置",
|
||||
"enter_code": "请输入采集编码",
|
||||
"enter_name": "请输入采集名称",
|
||||
"enter_scada_node": "请输入SCADA节点",
|
||||
"enter_remark": "请输入备注",
|
||||
"enter_interval": "请输入采集间隔(秒)",
|
||||
"select_collect_type": "请选择采集类型",
|
||||
"select_status": "请选择状态",
|
||||
"operation_success": "操作成功",
|
||||
"sort": "序号",
|
||||
"code": "采集编码",
|
||||
"name": "采集名称",
|
||||
"scada_node": "SCADA节点",
|
||||
"collect_type": "采集类型",
|
||||
"interval": "采集间隔(秒)",
|
||||
"status": "状态",
|
||||
"enable": "启用",
|
||||
"disable": "禁用",
|
||||
"real_time": "实时",
|
||||
"periodic": "周期",
|
||||
"trigger": "触发",
|
||||
"remark": "备注",
|
||||
"remark_length": "长度在 1 到 100 个字符",
|
||||
"operation": "操作",
|
||||
"add": "新 增",
|
||||
"edit": "编 辑",
|
||||
"delete": "删 除",
|
||||
"add_title": "新增SPC采集配置",
|
||||
"edit_title": "编辑SPC采集配置",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"tip": "提示",
|
||||
"confirm_delete": "确定要删除该SPC采集配置吗?",
|
||||
"validation_fail": "校验失败",
|
||||
"please_enter": "请输入{name}",
|
||||
"help": "配置SPC数据采集参数,绑定SCADA节点"
|
||||
}
|
||||
},
|
||||
"product_management": {
|
||||
"product_list": {
|
||||
"search": "查询",
|
||||
|
||||
@@ -67,6 +67,12 @@ export default {
|
||||
name: `${pre}product_model-product_ng_info`,
|
||||
meta: { ...meta, cache: true, title: '异常不良管理' },
|
||||
component: _import('production-master-data/product-model/product-ng-info')
|
||||
},
|
||||
{
|
||||
path: 'spc_configuration/binding_scada_node',
|
||||
name: `${pre}spc_configuration-data_collection_configuration`,
|
||||
meta: { ...meta, cache: true, title: 'SPC采集配置' },
|
||||
component: _import('production-master-data/spc-configuration/data-collection-configuration')
|
||||
}
|
||||
])('production_configuration-')
|
||||
}
|
||||
|
||||
@@ -0,0 +1,404 @@
|
||||
<template>
|
||||
<d2-container>
|
||||
<template #header>
|
||||
<div class="search-bar">
|
||||
<el-form :inline="true" size="mini">
|
||||
<el-form-item :label="$t(key('code'))">
|
||||
<el-input
|
||||
v-model="search.code"
|
||||
:placeholder="$t(key('enter_code'))"
|
||||
clearable
|
||||
style="width:200px"
|
||||
@keyup.enter.native="onSearch"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t(key('name'))">
|
||||
<el-input
|
||||
v-model="search.name"
|
||||
:placeholder="$t(key('enter_name'))"
|
||||
clearable
|
||||
style="width:200px"
|
||||
@keyup.enter.native="onSearch"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t(key('scada_node'))">
|
||||
<el-input
|
||||
v-model="search.scada_node"
|
||||
:placeholder="$t(key('enter_scada_node'))"
|
||||
clearable
|
||||
style="width:200px"
|
||||
@keyup.enter.native="onSearch"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t(key('status'))">
|
||||
<el-select
|
||||
v-model="search.status"
|
||||
:placeholder="$t(key('select_status'))"
|
||||
clearable
|
||||
style="width:140px"
|
||||
>
|
||||
<el-option :value="1" :label="$t(key('enable'))" />
|
||||
<el-option :value="0" :label="$t(key('disable'))" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" @click="onSearch">
|
||||
{{ $t(key('search')) }}
|
||||
</el-button>
|
||||
<el-button icon="el-icon-refresh" @click="onReset">
|
||||
{{ $t(key('reset')) }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<page-table
|
||||
ref="pageTable"
|
||||
:columns="columns"
|
||||
:data="tableData"
|
||||
:loading="loading"
|
||||
:toolbar-buttons="toolbarButtons"
|
||||
:row-buttons="rowButtons"
|
||||
:pagination="pagination"
|
||||
help-url="/help/data-collection-configuration"
|
||||
:help-text="$t(ckey('help'))"
|
||||
auto-height
|
||||
@page-change="onPageChange"
|
||||
@selection-change="onSelect"
|
||||
/>
|
||||
|
||||
<page-dialog-form
|
||||
ref="dialogForm"
|
||||
:visible.sync="dialogVisible"
|
||||
:title="dialogTitle"
|
||||
:width="'50%'"
|
||||
:form-cols="formCols"
|
||||
:form-data="formData"
|
||||
:rules="rules"
|
||||
:label-width="'120px'"
|
||||
:submitting="submitting"
|
||||
:confirm-text="key('confirm')"
|
||||
:cancel-text="key('cancel')"
|
||||
@submit="onDialogSubmit"
|
||||
@close="onDialogClose"
|
||||
/>
|
||||
</d2-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { useTableColumns } from '@/composables/useTableColumns'
|
||||
import { useTableButtons } from '@/composables/useTableButtons'
|
||||
import { i18nMixin } from '@/composables/useI18n'
|
||||
import { confirmMixin } from '@/composables/useConfirmHandle'
|
||||
import {
|
||||
getDataCollectionConfigList,
|
||||
createDataCollectionConfig,
|
||||
editDataCollectionConfig,
|
||||
deleteDataCollectionConfig
|
||||
} from '@/api/production-master-data/data-collection-configuration'
|
||||
import PageTable from '@/components/page-table'
|
||||
import PageDialogForm from '@/components/page-dialog-form'
|
||||
|
||||
export default {
|
||||
name: 'production-master-data-data-collection-configuration',
|
||||
components: { PageTable, PageDialogForm },
|
||||
mixins: [
|
||||
i18nMixin('page.production_master_data.spc_configuration.data_collection_configuration'),
|
||||
confirmMixin
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
loading: false,
|
||||
submitting: false,
|
||||
tableData: [],
|
||||
selectedRows: [],
|
||||
dialogVisible: false,
|
||||
dialogTitle: '',
|
||||
editId: '',
|
||||
handleType: 'create',
|
||||
search: { code: '', name: '', scada_node: '', status: '' },
|
||||
pagination: { current: 1, size: 10, total: 0 },
|
||||
formData: {
|
||||
code: '',
|
||||
name: '',
|
||||
scada_node: '',
|
||||
collect_type: '',
|
||||
interval: 1,
|
||||
status: 1,
|
||||
remark: ''
|
||||
},
|
||||
rules: {
|
||||
code: [
|
||||
{ required: true, message: this.key('enter_code'), trigger: 'blur' },
|
||||
{ min: 1, max: 100, message: this.key('remark_length'), trigger: 'blur' }
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: this.key('enter_name'), trigger: 'blur' },
|
||||
{ min: 1, max: 100, message: this.key('remark_length'), trigger: 'blur' }
|
||||
],
|
||||
scada_node: [
|
||||
{ required: true, message: this.key('enter_scada_node'), trigger: 'blur' }
|
||||
],
|
||||
collect_type: [
|
||||
{ required: true, message: this.key('select_collect_type'), trigger: 'change' }
|
||||
],
|
||||
interval: [
|
||||
{ required: true, message: this.key('enter_interval'), trigger: 'blur' }
|
||||
],
|
||||
status: [
|
||||
{ required: true, message: this.key('select_status'), trigger: 'change' }
|
||||
]
|
||||
},
|
||||
columns: [],
|
||||
toolbarButtons: [],
|
||||
rowButtons: [],
|
||||
formCols: [
|
||||
[
|
||||
{
|
||||
type: 'input',
|
||||
prop: 'code',
|
||||
label: this.key('code'),
|
||||
placeholder: this.key('enter_code'),
|
||||
clearable: true,
|
||||
style: { width: '90%' }
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'input',
|
||||
prop: 'name',
|
||||
label: this.key('name'),
|
||||
placeholder: this.key('enter_name'),
|
||||
clearable: true,
|
||||
style: { width: '90%' }
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'input',
|
||||
prop: 'scada_node',
|
||||
label: this.key('scada_node'),
|
||||
placeholder: this.key('enter_scada_node'),
|
||||
clearable: true,
|
||||
style: { width: '90%' }
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'select',
|
||||
prop: 'collect_type',
|
||||
label: this.key('collect_type'),
|
||||
placeholder: this.key('select_collect_type'),
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
style: { width: '90%' },
|
||||
options: [
|
||||
{ label: this.key('real_time'), value: 'real_time' },
|
||||
{ label: this.key('periodic'), value: 'periodic' },
|
||||
{ label: this.key('trigger'), value: 'trigger' }
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'input',
|
||||
prop: 'interval',
|
||||
inputType: 'number',
|
||||
label: this.key('interval'),
|
||||
placeholder: this.key('enter_interval'),
|
||||
clearable: true,
|
||||
style: { width: '90%' }
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'select',
|
||||
prop: 'status',
|
||||
label: this.key('status'),
|
||||
placeholder: this.key('select_status'),
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
style: { width: '90%' },
|
||||
options: [
|
||||
{ label: this.key('enable'), value: 1 },
|
||||
{ label: this.key('disable'), value: 0 }
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
type: 'input',
|
||||
prop: 'remark',
|
||||
inputType: 'textarea',
|
||||
autosize: { minRows: 2, maxRows: 6 },
|
||||
label: this.key('remark'),
|
||||
placeholder: this.key('enter_remark'),
|
||||
clearable: true,
|
||||
style: { width: '90%' }
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
created () {
|
||||
this.columns = useTableColumns([
|
||||
{ prop: 'sort', label: this.key('sort'), width: 80 },
|
||||
{ prop: 'code', label: this.key('code'), minWidth: 120 },
|
||||
{ prop: 'name', label: this.key('name'), minWidth: 140 },
|
||||
{ prop: 'scada_node', label: this.key('scada_node'), minWidth: 140 },
|
||||
{ prop: 'collect_type_name', label: this.key('collect_type'), minWidth: 120 },
|
||||
{ prop: 'interval', label: this.key('interval'), width: 100 },
|
||||
{ prop: 'status_name', label: this.key('status'), width: 100, slot: true },
|
||||
{ prop: 'remark', label: this.key('remark'), minWidth: 120 },
|
||||
{ prop: '_actions', label: this.key('operation'), width: 160, fixed: 'right' }
|
||||
])
|
||||
const btns = useTableButtons({
|
||||
toolbar: [
|
||||
{
|
||||
key: 'add',
|
||||
label: this.key('add'),
|
||||
icon: 'el-icon-plus',
|
||||
type: 'primary',
|
||||
auth: '/production_configuration/spc_configuration/binding_scada_node/create',
|
||||
onClick: this.openAdd
|
||||
}
|
||||
],
|
||||
row: [
|
||||
{
|
||||
key: 'edit',
|
||||
label: this.key('edit'),
|
||||
icon: 'el-icon-edit',
|
||||
auth: '/production_configuration/spc_configuration/binding_scada_node/edit',
|
||||
onClick: this.openEdit
|
||||
},
|
||||
{
|
||||
key: 'delete',
|
||||
label: this.key('delete'),
|
||||
icon: 'el-icon-delete',
|
||||
color: 'danger',
|
||||
auth: '/production_configuration/spc_configuration/binding_scada_node/delete',
|
||||
onClick: this.handleDelete
|
||||
}
|
||||
]
|
||||
}, this.$permission)
|
||||
this.toolbarButtons = btns.toolbarButtons
|
||||
this.rowButtons = btns.rowButtons
|
||||
this.fetchData()
|
||||
},
|
||||
methods: {
|
||||
async fetchData () {
|
||||
this.loading = true
|
||||
try {
|
||||
const res = await getDataCollectionConfigList({
|
||||
...this.search,
|
||||
page_no: this.pagination.current,
|
||||
page_size: this.pagination.size
|
||||
})
|
||||
const list = Array.isArray(res) ? res : (res.data || [])
|
||||
const total = Array.isArray(res) ? res.length : (res.count || 0)
|
||||
this.tableData = list
|
||||
this.pagination.total = total
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
onSearch () {
|
||||
this.pagination.current = 1
|
||||
this.fetchData()
|
||||
},
|
||||
onReset () {
|
||||
this.search = { code: '', name: '', scada_node: '', status: '' }
|
||||
this.pagination.current = 1
|
||||
this.fetchData()
|
||||
},
|
||||
onPageChange (page) {
|
||||
this.pagination.current = page.current
|
||||
this.pagination.size = page.size
|
||||
this.fetchData()
|
||||
},
|
||||
onSelect (rows) {
|
||||
this.selectedRows = rows
|
||||
},
|
||||
resetForm () {
|
||||
this.formData = {
|
||||
code: '',
|
||||
name: '',
|
||||
scada_node: '',
|
||||
collect_type: '',
|
||||
interval: 1,
|
||||
status: 1,
|
||||
remark: ''
|
||||
}
|
||||
this.editId = ''
|
||||
},
|
||||
openAdd () {
|
||||
this.handleType = 'create'
|
||||
this.dialogTitle = this.key('add_title')
|
||||
this.$nextTick(() => {
|
||||
this.$refs.dialogForm && this.$refs.dialogForm.reset()
|
||||
this.resetForm()
|
||||
this.dialogVisible = true
|
||||
})
|
||||
},
|
||||
openEdit (row) {
|
||||
this.handleType = 'edit'
|
||||
this.dialogTitle = this.key('edit_title')
|
||||
this.editId = row.id
|
||||
this.formData = {
|
||||
code: row.code,
|
||||
name: row.name,
|
||||
scada_node: row.scada_node || '',
|
||||
collect_type: row.collect_type || '',
|
||||
interval: row.interval || 1,
|
||||
status: typeof row.status === 'number' ? row.status : 1,
|
||||
remark: row.remark || ''
|
||||
}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
async onDialogSubmit () {
|
||||
this.submitting = true
|
||||
try {
|
||||
if (this.handleType === 'create') {
|
||||
await createDataCollectionConfig(this.formData)
|
||||
} else {
|
||||
await editDataCollectionConfig({ ...this.formData, id: this.editId })
|
||||
}
|
||||
this.$message.success(this.$t(this.key('operation_success')))
|
||||
this.dialogVisible = false
|
||||
this.fetchData()
|
||||
} finally {
|
||||
this.submitting = false
|
||||
}
|
||||
},
|
||||
onDialogClose () {
|
||||
this.resetForm()
|
||||
},
|
||||
async handleDelete (row) {
|
||||
const cancelled = await this.$confirmAction(
|
||||
{
|
||||
message: this.key('confirm_delete'),
|
||||
title: this.key('tip')
|
||||
},
|
||||
() => deleteDataCollectionConfig({ id: [row.id] })
|
||||
)
|
||||
if (cancelled) return
|
||||
this.$message.success(this.$t(this.key('operation_success')))
|
||||
this.pagination.current = Math.min(
|
||||
this.pagination.current,
|
||||
Math.ceil((this.pagination.total - 1) / this.pagination.size) || 1
|
||||
)
|
||||
this.fetchData()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.search-bar {
|
||||
padding: 10px 0;
|
||||
}
|
||||
/deep/ .el-form-item--mini.el-form-item {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user