Commit b8b4c69c authored by liguangyu06's avatar liguangyu06
Browse files

新增产品管理全链路自动化资产,并修复详情层/树页/路径串页等稳定问题。

parent 297e887d
# 基础管理-产品管理-物料变更单明细查询 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-026.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/platform/zrchange`
**元素扫描**:`data/scan/prodm-material-chg-detail-elements.json`(105 项)
**定位器**:`locators/spd/prodm-material-chg-detail.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 物料变更单明细查询
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_MCD_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/platform/zrchange`(菜单或直链),筛选(可展开)、导出、物料变更明细列表与分页;左侧菜单与顶栏 Tab 高亮为物料变更单明细查询,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/platform/zrchange`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_MCD_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-026
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_MCD_006**(高)|全量可见条件组合查询|验证要点:只填当前结果里有值的条件;结果同时满足已填条件|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_007**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_008**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- **TP_PRODM_MCD_009**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-026
#### 集成验证点
- **TP_PRODM_MCD_010**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-026
---
### 查询条件展开收起
#### 功能验证点
- **TP_PRODM_MCD_011**(中)|展开后更多条件可见|验证要点:额外字段进入可视区且可填写、可参与查询;按钮变为「收起」|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_012**(中)|收起后额外条件隐藏且已填值保留|验证要点:折叠行隐藏;已填值不丢失;再展开后值仍在。产品未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_013**(低)|展开后无额外字段|验证要点:若产品无第二行筛选,展开为空或禁用,页面不报错|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- **TP_PRODM_MCD_014**(低)|展开态查询失败|验证要点:展开后查询失败有提示,不误展示其它页缓存列表|关联需求:UI-SPEC-SPD-PRODM-026
#### 集成验证点
- **TP_PRODM_MCD_015**(中)|展开字段与扫描一致|验证要点:展开后可见字段与 `data/scan` 记录一致,不以邻页筛选字段代替|关联需求:UI-SPEC-SPD-PRODM-026
---
### 列表
#### 功能验证点
- **TP_PRODM_MCD_021**(高)|列表核心列完整|验证要点:主表展示 变更单号、物料、变更字段、时间等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_022**(中)|各可排序列升序降序|验证要点:每个带排序器的列均可升序、再降序;指示器(▲/▼ 或 aria-sort)与方向一致;列表仍有数据|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_023**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_MCD_024**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_025**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_026**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_027**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_028**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- **TP_PRODM_MCD_029**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-026
#### 集成验证点
- **TP_PRODM_MCD_030**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-026
---
### 行内操作
#### 功能验证点
- **TP_PRODM_MCD_016**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-026
- **TP_PRODM_MCD_017**(高)|行内「查看」可达|验证要点:首行有数据时点「查看」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_018**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- **TP_PRODM_MCD_019**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-026
#### 集成验证点
- **TP_PRODM_MCD_020**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-026
---
### 导出
#### 功能验证点
- **TP_PRODM_MCD_031**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_032**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_MCD_033**(中)|本页独有列与能力|验证要点:物料变更明细只读;勿与「变更单明细查询」产品侧混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-026
#### 边界验证点
- **TP_PRODM_MCD_034**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/platform/zrchange` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-026
#### 异常验证点
- **TP_PRODM_MCD_035**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-026
#### 集成验证点
- **TP_PRODM_MCD_036**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-026
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选展开、列表分页、导出。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **36** 条原子测试点;扫描元素约 105 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_MCD` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;页面无列设置齿轮(自检);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-结算点设置 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-012.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/platform/settle/rules`
**元素扫描**:`data/scan/prodm-settle-elements.json`(206 项)
**定位器**:`locators/spd/prodm-settle.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 结算点设置
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_STL_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/platform/settle/rules`(菜单或直链),左侧树(若有)+ 筛选+高级筛选、新增、列表与详情/日志;左侧菜单与顶栏 Tab 高亮为结算点设置,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/platform/settle/rules`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_STL_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-012
---
### 左侧规则目录树
#### 功能验证点
- **TP_PRODM_STL_005**(高)|树默认有选中或可展开节点|验证要点:进入后左侧规则目录树可见,选中或展开后右侧数据范围与节点一致|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_006**(高)|树搜索过滤|验证要点:在树顶搜索框输入编号/名称关键字,节点列表收敛为匹配项|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_007**(高)|切换树节点刷新右侧|验证要点:点选另一节点后,右侧列表/表单数据范围切换,不残留上一节点数据|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_008**(低)|搜索无匹配|验证要点:无匹配节点时空态或提示,右侧不展示过期数据|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- **TP_PRODM_STL_009**(中)|树加载失败|验证要点:失败有提示,不把其它节点数据展示为当前节点成功态|关联需求:UI-SPEC-SPD-PRODM-012
#### 集成验证点
- **TP_PRODM_STL_010**(中)|树节点与院区主数据一致|验证要点:节点名称/编码与科室登记等主数据一致(允许权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-012
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_STL_011**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_012**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_013**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- **TP_PRODM_STL_014**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-012
#### 集成验证点
- **TP_PRODM_STL_015**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-012
---
### 高级筛选抽屉
#### 功能验证点
- **TP_PRODM_STL_016**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_017**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_018**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_PRODM_STL_019**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-PRODM-012
---
### 列表
#### 功能验证点
- **TP_PRODM_STL_026**(高)|列表核心列完整|验证要点:主表展示 结算点规则、院区/产品范围等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_027**(中)|各可排序列升序降序|验证要点:每个带排序器的列均可升序、再降序;指示器(▲/▼ 或 aria-sort)与方向一致;列表仍有数据|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_028**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_029**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_030**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_STL_031**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_032**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_033**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_034**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_035**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- **TP_PRODM_STL_036**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-012
#### 集成验证点
- **TP_PRODM_STL_037**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-012
---
### 行内操作
#### 功能验证点
- **TP_PRODM_STL_020**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_021**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
- **TP_PRODM_STL_022**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_023**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- **TP_PRODM_STL_024**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-012
#### 集成验证点
- **TP_PRODM_STL_025**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-012
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_STL_038**(中)|本页独有列与能力|验证要点:结算点规则;勿与请领出库渠道设置混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-012
#### 边界验证点
- **TP_PRODM_STL_039**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/platform/settle/rules` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-012
#### 异常验证点
- **TP_PRODM_STL_040**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-012
#### 集成验证点
- **TP_PRODM_STL_041**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-012
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选、列表分页、高级筛选、日志弹窗。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **41** 条原子测试点;扫描元素约 206 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_STL` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 有 sorter:列表 H3 已写「各可排序列升序降序」;下游按 3.6 每列一条;建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-缺货目录明细 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-021.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/paltform/stockoutList`
**元素扫描**:`data/scan/prodm-stockout-detail-elements.json`(133 项)
**定位器**:`locators/spd/prodm-stockout-detail.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 缺货目录明细
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_STD_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/paltform/stockoutList`(菜单或直链),筛选(可展开)、导出、明细列表与替代产品弹窗;左侧菜单与顶栏 Tab 高亮为缺货目录明细,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/paltform/stockoutList`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_STD_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-021
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_STD_006**(高)|全量可见条件组合查询|验证要点:只填当前结果里有值的条件;结果同时满足已填条件|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_007**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_008**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_009**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_010**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-021
---
### 查询条件展开收起
#### 功能验证点
- **TP_PRODM_STD_011**(中)|展开后更多条件可见|验证要点:额外字段进入可视区且可填写、可参与查询;按钮变为「收起」|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_012**(中)|收起后额外条件隐藏且已填值保留|验证要点:折叠行隐藏;已填值不丢失;再展开后值仍在。产品未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_013**(低)|展开后无额外字段|验证要点:若产品无第二行筛选,展开为空或禁用,页面不报错|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_014**(低)|展开态查询失败|验证要点:展开后查询失败有提示,不误展示其它页缓存列表|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_015**(中)|展开字段与扫描一致|验证要点:展开后可见字段与 `data/scan` 记录一致,不以邻页筛选字段代替|关联需求:UI-SPEC-SPD-PRODM-021
---
### 列表
#### 功能验证点
- **TP_PRODM_STD_021**(高)|列表核心列完整|验证要点:主表展示 缺货明细、替代产品相关列(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_022**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_STD_023**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_024**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_025**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_026**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_027**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_028**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_029**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-021
---
### 行内操作
#### 功能验证点
- **TP_PRODM_STD_016**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_017**(高)|行内「查看」可达|验证要点:首行有数据时点「查看」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_018**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_019**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_020**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-021
---
### 导出
#### 功能验证点
- **TP_PRODM_STD_030**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_031**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 打印
#### 功能验证点
- **TP_PRODM_STD_032**(高)|按当前条件打印|验证要点:能拉起对话框/预览/toast;无 error|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- 无(已并入:无数据打印以现网为准)
#### 异常验证点
- 无(已并入:打印失败见写操作失败提示)
#### 集成验证点
- 无(已并入:批量打印见打印 H3)
---
### 替代产品
#### 功能验证点
- **TP_PRODM_STD_033**(高)|打开对应弹窗/抽屉|验证要点:触发「替代产品」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_034**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_035**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-021
- **TP_PRODM_STD_036**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_037**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_038**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-021
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_STD_039**(中)|本页独有列与能力|验证要点:缺货明细查询;勿与「缺货目录维护」混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-021
#### 边界验证点
- **TP_PRODM_STD_040**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/paltform/stockoutList` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-021
#### 异常验证点
- **TP_PRODM_STD_041**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-021
#### 集成验证点
- **TP_PRODM_STD_042**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-021
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选展开、列表分页、导出、替代产品弹窗。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **42** 条原子测试点;扫描元素约 133 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_STD` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);页面无列设置齿轮(自检);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-缺货目录维护 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-019.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/paltform/stockoutManagement`
**元素扫描**:`data/scan/prodm-stockout-elements.json`(162 项)
**定位器**:`locators/spd/prodm-stockout.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 缺货目录维护
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_STO_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/paltform/stockoutManagement`(菜单或直链),筛选、导出、缺货维护弹窗、列表与详情;左侧菜单与顶栏 Tab 高亮为缺货目录维护,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/paltform/stockoutManagement`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_STO_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-019
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_STO_006**(高)|全量可见条件组合查询|验证要点:只填当前结果里有值的条件;结果同时满足已填条件|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_007**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_008**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- **TP_PRODM_STO_009**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-019
#### 集成验证点
- **TP_PRODM_STO_010**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-019
---
### 列表
#### 功能验证点
- **TP_PRODM_STO_016**(高)|列表核心列完整|验证要点:主表展示 缺货产品、维护状态、替代品等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_017**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_STO_018**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_019**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_020**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_021**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_022**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- **TP_PRODM_STO_023**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-019
#### 集成验证点
- **TP_PRODM_STO_024**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-019
---
### 行内操作
#### 功能验证点
- **TP_PRODM_STO_011**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_012**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_013**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- **TP_PRODM_STO_014**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-019
#### 集成验证点
- **TP_PRODM_STO_015**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-019
---
### 导出
#### 功能验证点
- **TP_PRODM_STO_025**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_026**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 缺货信息维护
#### 功能验证点
- **TP_PRODM_STO_027**(高)|打开对应弹窗/抽屉|验证要点:触发「缺货信息维护」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_028**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_029**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-019
- **TP_PRODM_STO_030**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- **TP_PRODM_STO_031**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-019
#### 集成验证点
- **TP_PRODM_STO_032**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-019
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_STO_033**(中)|本页独有列与能力|验证要点:缺货目录维护写操作;勿与「缺货目录明细」只读明细混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-019
#### 边界验证点
- **TP_PRODM_STO_034**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/paltform/stockoutManagement` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-019
#### 异常验证点
- **TP_PRODM_STO_035**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-019
#### 集成验证点
- **TP_PRODM_STO_036**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-019
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选、列表分页、导出、缺货信息维护弹窗/详情。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **36** 条原子测试点;扫描元素约 162 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_STO` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);页面无列设置齿轮(自检);页面无宽表启发式,未写横向滚动(自检);有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-请领出库渠道设置 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-010.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/platform/apply/rules`
**元素扫描**:`data/scan/prodm-req-channel-elements.json`(165 项)
**定位器**:`locators/spd/prodm-req-channel.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 请领出库渠道设置
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_RCH_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/platform/apply/rules`(菜单或直链),左侧树(若有)+ 筛选+高级筛选、新增/导出、列表与详情/编辑/日志;左侧菜单与顶栏 Tab 高亮为请领出库渠道设置,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/platform/apply/rules`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_RCH_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-010
---
### 左侧规则目录树
#### 功能验证点
- **TP_PRODM_RCH_005**(高)|树默认有选中或可展开节点|验证要点:进入后左侧规则目录树可见,选中或展开后右侧数据范围与节点一致|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_006**(高)|树搜索过滤|验证要点:在树顶搜索框输入编号/名称关键字,节点列表收敛为匹配项|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_007**(高)|切换树节点刷新右侧|验证要点:点选另一节点后,右侧列表/表单数据范围切换,不残留上一节点数据|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_008**(低)|搜索无匹配|验证要点:无匹配节点时空态或提示,右侧不展示过期数据|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- **TP_PRODM_RCH_009**(中)|树加载失败|验证要点:失败有提示,不把其它节点数据展示为当前节点成功态|关联需求:UI-SPEC-SPD-PRODM-010
#### 集成验证点
- **TP_PRODM_RCH_010**(中)|树节点与院区主数据一致|验证要点:节点名称/编码与科室登记等主数据一致(允许权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-010
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_RCH_012**(高)|全量可见条件组合查询|验证要点:只填当前结果里有值的条件;结果同时满足已填条件|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_011**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_013**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_014**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- **TP_PRODM_RCH_015**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-010
#### 集成验证点
- **TP_PRODM_RCH_016**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-010
---
### 列表
#### 功能验证点
- **TP_PRODM_RCH_023**(高)|列表核心列完整|验证要点:主表展示 渠道规则、院区/库区、产品范围等(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_024**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_025**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_026**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_RCH_027**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_028**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_029**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_030**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_031**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- **TP_PRODM_RCH_032**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-010
#### 集成验证点
- **TP_PRODM_RCH_033**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-010
---
### 行内操作
#### 功能验证点
- **TP_PRODM_RCH_017**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_018**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-010
- **TP_PRODM_RCH_019**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_020**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- **TP_PRODM_RCH_021**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-010
#### 集成验证点
- **TP_PRODM_RCH_022**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-010
---
### 导出
#### 功能验证点
- **TP_PRODM_RCH_034**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_035**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_RCH_036**(中)|本页独有列与能力|验证要点:请领出库渠道规则;勿与结算点设置混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-010
#### 边界验证点
- **TP_PRODM_RCH_037**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/platform/apply/rules` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-010
#### 异常验证点
- **TP_PRODM_RCH_038**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-010
#### 集成验证点
- **TP_PRODM_RCH_039**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-010
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选、列表分页、导出、行内操作。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **39** 条原子测试点;扫描元素约 165 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_RCH` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-调价管理 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-013.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/platform/price`
**元素扫描**:`data/scan/prodm-price-adj-elements.json`(225 项)
**定位器**:`locators/spd/prodm-price-adj.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 调价管理
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_PAD_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/platform/price`(菜单或直链),筛选+高级筛选、新增/导入excel、调价单列表与再次调价/详情/打印/编辑;左侧菜单与顶栏 Tab 高亮为调价管理,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/platform/price`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_PAD_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-013
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_PAD_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_006**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_007**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- **TP_PRODM_PAD_008**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- **TP_PRODM_PAD_009**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-013
---
### 高级筛选抽屉
#### 功能验证点
- **TP_PRODM_PAD_010**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_011**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_012**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_PRODM_PAD_013**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-PRODM-013
---
### 列表
#### 功能验证点
- **TP_PRODM_PAD_021**(高)|列表核心列完整|验证要点:主表展示 单号、制单/计划/实际生效时间、备注、状态、销售商、供应商等|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_022**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_023**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_024**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_PAD_025**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_026**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_027**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_028**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_029**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- **TP_PRODM_PAD_030**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- **TP_PRODM_PAD_031**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-013
---
### 行内操作
#### 功能验证点
- **TP_PRODM_PAD_014**(高)|行内「再次调价」可达|验证要点:首行有数据时点「再次调价」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_015**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_016**(高)|行内「打印」可达|验证要点:首行有数据时点「打印」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_017**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_018**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- **TP_PRODM_PAD_019**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- **TP_PRODM_PAD_020**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-013
---
### 打印
#### 功能验证点
- **TP_PRODM_PAD_032**(高)|按当前条件打印|验证要点:能拉起对话框/预览/toast;无 error|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- 无(已并入:无数据打印以现网为准)
#### 异常验证点
- 无(已并入:打印失败见写操作失败提示)
#### 集成验证点
- 无(已并入:批量打印见打印 H3)
---
### Excel 导入
#### 功能验证点
- **TP_PRODM_PAD_033**(中)|Excel 导入入口可触发|验证要点:点「Excel导入」/「导入excel」可打开导入流程,无未捕获异常(不校验文件字段级)|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- 无(已并入:空文件/格式错误以现网提示为准)
#### 异常验证点
- **TP_PRODM_PAD_034**(中)|导入失败提示|验证要点:导入失败有明确错误信息,列表不误增|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- 无(已并入:导入后与列表刷新以现网为准)
---
### 新增
#### 功能验证点
- **TP_PRODM_PAD_035**(高)|打开对应弹窗/抽屉|验证要点:触发「新增」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_036**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_037**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-013
- **TP_PRODM_PAD_038**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- **TP_PRODM_PAD_039**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- **TP_PRODM_PAD_040**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-013
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_PAD_041**(中)|本页独有列与能力|验证要点:调价单管理;状态在列表列,非独立状态 Tab;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-013
#### 边界验证点
- **TP_PRODM_PAD_042**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/platform/price` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-013
#### 异常验证点
- **TP_PRODM_PAD_043**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-013
#### 集成验证点
- **TP_PRODM_PAD_044**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-013
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选、列表分页、新增/导入、详情与打印。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **44** 条原子测试点;扫描元素约 225 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_PAD` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-院区产品设置 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-007.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/paltform/area/calatog`
**元素扫描**:`data/scan/prodm-campus-elements.json`(180 项)
**定位器**:`locators/spd/prodm-campus.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 院区产品设置
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_CAM_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/paltform/area/calatog`(菜单或直链),左右分栏:左侧库区树、右侧筛选+高级筛选、导入/导出Excel/打印产品码/下发科室/批量调整、列表与详情/编辑/日志;左侧菜单与顶栏 Tab 高亮为院区产品设置,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/paltform/area/calatog`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_CAM_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-007
---
### 左侧请领下发库区树
#### 功能验证点
- **TP_PRODM_CAM_005**(高)|树默认有选中或可展开节点|验证要点:进入后左侧请领下发库区树可见,选中或展开后右侧数据范围与节点一致|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_006**(高)|树搜索过滤|验证要点:在树顶搜索框输入编号/名称关键字,节点列表收敛为匹配项|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_007**(高)|切换树节点刷新右侧|验证要点:点选另一节点后,右侧列表/表单数据范围切换,不残留上一节点数据|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_008**(低)|搜索无匹配|验证要点:无匹配节点时空态或提示,右侧不展示过期数据|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_009**(中)|树加载失败|验证要点:失败有提示,不把其它节点数据展示为当前节点成功态|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_010**(中)|树节点与院区主数据一致|验证要点:节点名称/编码与科室登记等主数据一致(允许权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-007
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_CAM_011**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_012**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_013**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_014**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_015**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-007
---
### 高级筛选抽屉
#### 功能验证点
- **TP_PRODM_CAM_016**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_017**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_018**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_PRODM_CAM_019**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-PRODM-007
---
### 列表
#### 功能验证点
- **TP_PRODM_CAM_026**(高)|列表核心列完整|验证要点:主表展示 规格型号、耗材类型、默认上架货位、单位、库存上下限、单元含量、状态等|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_027**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_028**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_029**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_CAM_030**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_031**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_032**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_033**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_034**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_035**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_036**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-007
---
### 行内操作
#### 功能验证点
- **TP_PRODM_CAM_020**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_021**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_022**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_023**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_024**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_025**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-007
---
### 导入医院产品
#### 功能验证点
- **TP_PRODM_CAM_037**(高)|打开对应弹窗/抽屉|验证要点:触发「导入医院产品」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_038**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_039**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_040**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_041**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_042**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-007
---
### 一键导入
#### 功能验证点
- **TP_PRODM_CAM_043**(高)|打开对应弹窗/抽屉|验证要点:触发「一键导入」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_044**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_045**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_046**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_047**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_048**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-007
---
### 批量调整
#### 功能验证点
- **TP_PRODM_CAM_049**(高)|打开对应弹窗/抽屉|验证要点:触发「批量调整」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_050**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_051**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-007
- **TP_PRODM_CAM_052**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_053**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_054**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-007
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_CAM_055**(中)|本页独有列与能力|验证要点:院区→库区产品设置;勿与「中心库库区产品设置」「科室库区产品设置」混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-007
#### 边界验证点
- **TP_PRODM_CAM_056**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/paltform/area/calatog` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-007
#### 异常验证点
- **TP_PRODM_CAM_057**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-007
#### 集成验证点
- **TP_PRODM_CAM_058**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-007
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、库区树、筛选、列表分页、导入导出打印、详情/日志弹窗。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **58** 条原子测试点;扫描元素约 180 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_CAM` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
# 基础管理-产品管理-院区单元包设置 — 测试点分析
**版本**:01
**定稿日期**:2026-11-04
**关联需求**:`knowledge-base/08-UI专项规范库/UI-SPEC-SPD-PRODM-008.md`
**页面 URL**:`http://spdtest.cmic.com.cn:8080/spd/basic/goods/paltform/area/unit`
**元素扫描**:`data/scan/prodm-unit-pkg-elements.json`(87 项)
**定位器**:`locators/spd/prodm-unit-pkg.locator.yaml`
**本次生成范围**:`testpoint/scope/基础管理-产品管理-UI测试点范围.md`
---
## 基础设置 · 产品管理 · 院区单元包设置
### 页面访问与导航
#### 功能验证点
- **TP_PRODM_UPK_001**(高)|页面主区加载完成|验证要点:携带有效登录态进入 `/spd/basic/goods/paltform/area/unit`(菜单或直链),筛选+高级筛选、新增/导出/导入、列表与单元包详情;左侧菜单与顶栏 Tab 高亮为院区单元包设置,不误入同组其它产品管理页|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_002**(中)|同组产品管理菜单可切换|验证要点:在 scope 所列产品管理 26 个子菜单中切换 2~3 个后 URL 与内容对应,再返回本页状态正确|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_003**(低)|已登录直接打开 URL|验证要点:携带有效登录态打开 `/spd/basic/goods/paltform/area/unit`,筛选区与列表(或左右分栏)可见,无报错遮罩,地址仍为该路径|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- 无(未登录/会话过期/无菜单权限引用用户管理 `TP_USER_USR_005`~`007`;本模块自动化不单独写「菜单进入」「未登录访问拦截」用例,见 ui-test-point-rules 3.5)
#### 集成验证点
- **TP_PRODM_UPK_004**(中)|顶栏院区与筛选默认一致|验证要点:顶栏当前院区与页面院区/库区树默认范围不矛盾(允许按权限裁剪)|关联需求:UI-SPEC-SPD-PRODM-008
---
### 快捷筛选查询
#### 功能验证点
- **TP_PRODM_UPK_005**(中)|快捷区重置恢复默认|验证要点:已填字段(及维度勾选)恢复默认;列表是否刷新按产品规则,未定则标待评审|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_006**(中)|超长文本关键字|验证要点:名称/编号类字段输入较长关键字,查询被接受或截断,页面不崩溃|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_007**(低)|仅空格关键字|验证要点:按空查询或提示,不报错|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- **TP_PRODM_UPK_008**(中)|查询接口失败|验证要点:失败有错误提示,不白屏|关联需求:UI-SPEC-SPD-PRODM-008
#### 集成验证点
- **TP_PRODM_UPK_009**(中)|筛选结果与分页总数一致|验证要点:查询后「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-008
---
### 高级筛选抽屉
#### 功能验证点
- **TP_PRODM_UPK_010**(高)|点击高级筛选打开抽屉|验证要点:标题为「高级筛选」;关键字段可交互|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_011**(中)|抽屉内重置恢复默认|验证要点:抽屉字段恢复默认,快捷区不被清空|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_012**(高)|全量查询条件组合查询|验证要点:快捷区 +(有则)维度勾选 + 抽屉全填样本非空字段;抽样首行同时满足全部已填条件|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- 无(已并入:高级筛选字段边界见快捷区同类规则)
#### 异常验证点
- 无(已并入:高级筛选接口失败归入查询接口失败)
#### 集成验证点
- **TP_PRODM_UPK_013**(中)|高级筛选带入|验证要点:快捷区同名字段带入抽屉且不手改,与快捷区一致(可选,见 rules 3.3)|关联需求:UI-SPEC-SPD-PRODM-008
---
### 列表
#### 功能验证点
- **TP_PRODM_UPK_020**(高)|列表核心列完整|验证要点:主表展示 单元包名称/编码、院区、产品含量相关列(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_021**(低)|列设置隐藏后再恢复|验证要点:打开列设置 → 取消勾选非核心列 → 表头隐藏且勾选同步 → 再勾选后表头恢复|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_022**(中)|无匹配空列表|验证要点:不存在的关键字查询后表头仍在,0 行或空态;有汇总时为 0 或「-」|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_023**(中)|横向滚动与列对齐|验证要点:远侧列可进入视口;表头列数=数据列数;对齐无重叠。列名以本页为准|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- 无(已并入:列表加载失败见查询接口失败)
#### 集成验证点
- 无(已并入:行内操作见行内操作 H3 或本页无行操作)
---
### 分页
#### 功能验证点
- **TP_PRODM_UPK_024**(高)|有数据时总条数|验证要点:「共 N 条」与本次查询匹配条数一致|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_025**(高)|切换至第 2 页|验证要点:页码高亮且首行更换;不足 2 页则该点不适用|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_026**(中)|切换每页条数|验证要点:默认档位(常见 50)→「20 条/页」;共 N 条不变;当前页行数=min(N,20) 且与切换前不同(见 3.7)|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_027**(中)|首页上一页不可用|验证要点:第 1 页时「上一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_028**(中)|末页下一页不可用|验证要点:最后一页时「下一页」禁用或无效|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- **TP_PRODM_UPK_029**(低)|跳至非数字页码|验证要点:非法输入不跳转异常页|关联需求:UI-SPEC-SPD-PRODM-008
#### 集成验证点
- **TP_PRODM_UPK_030**(中)|翻页不丢失筛选|验证要点:带筛选翻页后条件保持,新页仍满足原筛选|关联需求:UI-SPEC-SPD-PRODM-008
---
### 行内操作
#### 功能验证点
- **TP_PRODM_UPK_014**(高)|行内「详情」可达|验证要点:首行有数据时点「详情」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_015**(高)|行内「编辑」可达|验证要点:首行有数据时点「编辑」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_016**(高)|行内「日志」可达|验证要点:首行有数据时点「日志」有反馈或进入预期层(只读冒烟,不写外围回写)|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_017**(低)|末行或无数据|验证要点:无数据时空态,行内按钮不可用或不可见(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- **TP_PRODM_UPK_018**(中)|操作失败提示|验证要点:接口失败时有提示,列表行状态不误改为成功|关联需求:UI-SPEC-SPD-PRODM-008
#### 集成验证点
- **TP_PRODM_UPK_019**(低)|一对多备注|验证要点:下游用例可按每个行内操作各拆一条;本页已按操作拆功能点|关联需求:UI-SPEC-SPD-PRODM-008
---
### 导出
#### 功能验证点
- **TP_PRODM_UPK_031**(高)|当前查询条件下导出|验证要点:先查询再导出;无报错。默认不校验文件内容|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_032**(低)|无数据时导出|验证要点:空列表导出不报错或有明确提示|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- 无(已并入:导出失败见写操作失败提示)
#### 集成验证点
- 无(已并入:导入模板与导出关系见写操作点)
---
### 新增
#### 功能验证点
- **TP_PRODM_UPK_033**(高)|打开对应弹窗/抽屉|验证要点:触发「新增」后弹窗/抽屉可见,标题与关键字段可交互;取消不落库(范围内才写保存)|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_034**(中)|取消不落库|验证要点:填写后取消或关闭,列表不新增/不修改对应记录|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_035**(中)|必填为空拦截|验证要点:必填项为空时确定被拦截并提示,不落库|关联需求:UI-SPEC-SPD-PRODM-008
- **TP_PRODM_UPK_036**(低)|重复打开|验证要点:连续两次打开不叠加多层遮罩|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- **TP_PRODM_UPK_037**(中)|保存失败|验证要点:接口失败时弹窗不自动关闭且列表保持原状|关联需求:UI-SPEC-SPD-PRODM-008
#### 集成验证点
- **TP_PRODM_UPK_038**(低)|弹窗字段与列表列一致|验证要点:弹窗内关键字段与列表展示字段命名一致|关联需求:UI-SPEC-SPD-PRODM-008
---
### 与同组产品管理页差异
#### 功能验证点
- **TP_PRODM_UPK_039**(中)|本页独有列与能力|验证要点:院区单元包配置;勿与「院区产品设置」库区产品列表混淆;与同组它页切换后列集/工具栏差异可辨识|关联需求:UI-SPEC-SPD-PRODM-008
#### 边界验证点
- **TP_PRODM_UPK_040**(低)|直链不误展示它页列|验证要点:仅打开本页 URL `/spd/basic/goods/paltform/area/unit` 时不应出现它页独有工具栏(如错页 Tab)|关联需求:UI-SPEC-SPD-PRODM-008
#### 异常验证点
- **TP_PRODM_UPK_041**(中)|菜单高亮与 URL 一致|验证要点:左侧高亮菜单名、顶栏 Tab 与地址栏路径同属本页,非兄弟页 URL|关联需求:UI-SPEC-SPD-PRODM-008
#### 集成验证点
- **TP_PRODM_UPK_042**(低)|跨页数据不串行|验证要点:从本页切至它页再返回,本页筛选/列表恢复为本页数据域,不残留它页查询条件(以现网为准)|关联需求:UI-SPEC-SPD-PRODM-008
---
## 质量自检摘要
| 项 | 结论 |
|----|------|
| 范围 | 在范围内:导航、筛选、列表分页、导出、单元包详情。排除:断网/弱网、导出文件内容、弹窗全字段落库、登录/改密通用流程(见 `testpoint/scope/基础管理-产品管理-UI测试点范围.md`)。未声称 100% 全覆盖。 |
| 范围外未覆盖 | 全局左侧菜单与顶栏导航噪声、导出/打印文件字节内容、弹窗/抽屉全字段组合与真实落库、断网/弱网 |
| 覆盖 | 已写功能域见正文 H3;共 **42** 条原子测试点;扫描元素约 87 项 |
| 分类 | 功能 / 边界 / 异常 / 集成四类均已按功能点拆分 |
| 去重 | 登录态过期、无菜单权限、改密引用 `TP_USER_USR_006`/`007`,本页不展开。编号前缀 `TP_PRODM_UPK` |
| 待评审项 | 写操作冒烟不提交脏数据;筛选收起后字段是否保留;部分详情层标题可能受顶栏 Tab 干扰需现网复核;页面无列头 sorter(自检);有列设置:列表 H3 已写「列设置隐藏后再恢复」;宽表已写「横向滚动与列对齐」;有每页条数下拉:已写「切换每页条数」 |
| 功能点拆分 | 未使用「筛选与查询 / 列表与分页」;快捷与高级筛选分开;有展开则单开查询条件展开收起;列表→分页→导出;写操作 H3 用业务名 |
| 报表能力 | 整页渲染,非统计报表 iframe 第四节清单 |
| 列排序下游 | 页面无列头 sorter(自检);建议 `audit-sort-columns-live` 维护 `data/spd-admin-sort-columns.json` |
| 分页每页条数 | 有每页条数下拉:已写「切换每页条数」 |
| 下游 | 可转 testcases/MD、CSV;扫描 `npm run discover:scan-prodm`;overlay `npm run discover:scan-prodm-overlays`;测试点 `npm run generate:testpoints-prodm` |
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-院区产品设置-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-campus:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('院区产品设置 · 左侧请领下发库区树', () => {
test('PRODM-CAM-001 树默认有选中或可展开节点', { tag: '@smoke' }, async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.expectTreeDefaultScope();
});
test('PRODM-CAM-002 切换树节点刷新右侧', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
const switched = await prodmCampusPage.switchOtherTreeNode();
expect(switched, '应能切换树节点').toBeTruthy();
});
});
test.describe('院区产品设置 · 快捷筛选查询', () => {
test('PRODM-CAM-003 快捷区重置恢复默认', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.clickResetQuick();
await prodmCampusPage.expectOnPage();
});
});
test.describe('院区产品设置 · 高级筛选抽屉', () => {
test('PRODM-CAM-004 全量查询条件组合查询', async ({ prodmCampusPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
test('PRODM-CAM-005 点击高级筛选打开抽屉', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.openAdvancedFilterDrawer();
});
});
test.describe('院区产品设置 · 列表', () => {
test('PRODM-CAM-006 列表核心列完整', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.assertConfiguredHeaders();
});
test('PRODM-CAM-010 列设置隐藏后再恢复', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.clickQuery();
await prodmCampusPage.executeColumnSettingsToggleRestoreTest();
});
test('PRODM-CAM-011 横向滚动与列对齐', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.expectHorizontalScrollAlignment();
});
test('PRODM-CAM-012 无匹配空态(mock反例)', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.searchByMockKeyword();
const snap = await prodmCampusPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('院区产品设置 · 行内操作', () => {
test('PRODM-CAM-007 行内「详情」可达(只读冒烟)', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.rowActionSmoke('详情');
});
test('PRODM-CAM-008 行内「编辑」可达(只读冒烟)', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.rowActionSmoke('编辑');
});
test('PRODM-CAM-009 行内「日志」可达(只读冒烟)', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.rowActionSmoke('日志');
});
});
test.describe('院区产品设置 · 分页', () => {
test('PRODM-CAM-013 有数据时总条数', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.assertTotalWhenHasData();
});
test('PRODM-CAM-014 切换至第 2 页', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.goToPage2ForProdm();
});
test('PRODM-CAM-015 切换20条每页页面正常且列表同步', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
const { total, rowsBefore, rowsAfter } = await prodmCampusPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmCampusPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('院区产品设置 · 导入医院产品', () => {
test('PRODM-CAM-016 打开「导入医院产品」对应弹窗/抽屉', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.openToolbarOverlay('导入医院产品');
await prodmCampusPage.closeOverlay();
});
test('PRODM-CAM-017 「导入医院产品」取消不落库', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.cancelToolbarWithoutCommit('导入医院产品');
});
test('PRODM-CAM-018 「导入医院产品」必填为空拦截', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.assertRequiredInterceptFor('导入医院产品');
});
});
test.describe('院区产品设置 · 一键导入', () => {
test('PRODM-CAM-019 打开「一键导入」对应弹窗/抽屉', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.openToolbarOverlay('一键导入');
await prodmCampusPage.closeOverlay();
});
test('PRODM-CAM-020 「一键导入」取消不落库', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.cancelToolbarWithoutCommit('一键导入');
});
test('PRODM-CAM-021 「一键导入」必填为空拦截', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.assertRequiredInterceptFor('一键导入');
});
});
test.describe('院区产品设置 · 批量调整', () => {
test('PRODM-CAM-022 打开「批量调整」对应弹窗/抽屉', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.openToolbarOverlay('批量调整');
await prodmCampusPage.closeOverlay();
});
test('PRODM-CAM-023 「批量调整」取消不落库', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.cancelToolbarWithoutCommit('批量调整');
});
test('PRODM-CAM-024 「批量调整」必填为空拦截', async ({ prodmCampusPage }) => {
await prodmCampusPage.open();
await prodmCampusPage.assertRequiredInterceptFor('批量调整');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-中心库上下限建议(AI)-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-center-limit-ai:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('中心库上下限建议(AI) · 快捷筛选查询', () => {
test('PRODM-CLA-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.clickResetQuick();
await prodmCenterLimitAiPage.expectOnPage();
});
test('PRODM-CLA-002 全量可见条件组合查询', async ({ prodmCenterLimitAiPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('中心库上下限建议(AI) · 查询条件展开收起', () => {
test('PRODM-CLA-003 展开后更多条件可见', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.toggleFilterExpand();
});
});
test.describe('中心库上下限建议(AI) · 列表', () => {
test('PRODM-CLA-004 列表核心列完整', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.assertConfiguredHeaders();
});
test('PRODM-CLA-008 无匹配空态(mock反例)', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.searchByMockKeyword();
const snap = await prodmCenterLimitAiPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('中心库上下限建议(AI) · 行内操作', () => {
test('PRODM-CLA-005 行内「详情」可达(只读冒烟)', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.rowActionSmoke('详情');
});
test('PRODM-CLA-006 行内「编辑」可达(只读冒烟)', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.rowActionSmoke('编辑');
});
test('PRODM-CLA-007 行内「调整」可达(只读冒烟)', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.rowActionSmoke('调整');
});
});
test.describe('中心库上下限建议(AI) · 分页', () => {
test('PRODM-CLA-009 有数据时总条数', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.assertTotalWhenHasData();
});
test('PRODM-CLA-010 切换至第 2 页', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.goToPage2ForProdm();
});
test('PRODM-CLA-011 切换20条每页页面正常且列表同步', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
const { total, rowsBefore, rowsAfter } = await prodmCenterLimitAiPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmCenterLimitAiPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('中心库上下限建议(AI) · 导出', () => {
test('PRODM-CLA-012 当前查询条件下导出', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.clickExportIfVisible();
});
});
test.describe('中心库上下限建议(AI) · 打印', () => {
test('PRODM-CLA-013 按当前条件打印', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.clickPrintIfVisible();
});
});
test.describe('中心库上下限建议(AI) · 全部调整', () => {
test('PRODM-CLA-014 打开「全部调整」对应弹窗/抽屉', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.openToolbarOverlay('全部调整');
await prodmCenterLimitAiPage.closeOverlay();
});
test('PRODM-CLA-015 「全部调整」取消不落库', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.cancelToolbarWithoutCommit('全部调整');
});
test('PRODM-CLA-016 「全部调整」必填为空拦截', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.assertRequiredInterceptFor('全部调整');
});
});
test.describe('中心库上下限建议(AI) · 批量调整', () => {
test('PRODM-CLA-017 打开「批量调整」对应弹窗/抽屉', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.openToolbarOverlay('批量调整');
await prodmCenterLimitAiPage.closeOverlay();
});
test('PRODM-CLA-018 「批量调整」取消不落库', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.cancelToolbarWithoutCommit('批量调整');
});
test('PRODM-CLA-019 「批量调整」必填为空拦截', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.assertRequiredInterceptFor('批量调整');
});
});
test.describe('中心库上下限建议(AI) · 采纳', () => {
test('PRODM-CLA-020 打开「采纳」对应弹窗/抽屉', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.openToolbarOverlay('采纳');
await prodmCenterLimitAiPage.closeOverlay();
});
test('PRODM-CLA-021 「采纳」取消不落库', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.cancelToolbarWithoutCommit('采纳');
});
test('PRODM-CLA-022 「采纳」必填为空拦截', async ({ prodmCenterLimitAiPage }) => {
await prodmCenterLimitAiPage.open();
await prodmCenterLimitAiPage.assertRequiredInterceptFor('采纳');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-中心库上下限建议-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-center-limit:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('中心库上下限建议 · 快捷筛选查询', () => {
test('PRODM-CLM-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.clickResetQuick();
await prodmCenterLimitPage.expectOnPage();
});
test('PRODM-CLM-002 全量可见条件组合查询', async ({ prodmCenterLimitPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('中心库上下限建议 · 查询条件展开收起', () => {
test('PRODM-CLM-003 展开后更多条件可见', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.toggleFilterExpand();
});
});
test.describe('中心库上下限建议 · 列表', () => {
test('PRODM-CLM-004 列表核心列完整', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.assertConfiguredHeaders();
});
test('PRODM-CLM-008 无匹配空态(mock反例)', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.searchByMockKeyword();
const snap = await prodmCenterLimitPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('中心库上下限建议 · 行内操作', () => {
test('PRODM-CLM-005 行内「详情」可达(只读冒烟)', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.rowActionSmoke('详情');
});
test('PRODM-CLM-006 行内「编辑」可达(只读冒烟)', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.rowActionSmoke('编辑');
});
test('PRODM-CLM-007 行内「调整」可达(只读冒烟)', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.rowActionSmoke('调整');
});
});
test.describe('中心库上下限建议 · 分页', () => {
test('PRODM-CLM-009 有数据时总条数', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.assertTotalWhenHasData();
});
test('PRODM-CLM-010 切换至第 2 页', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.goToPage2ForProdm();
});
test('PRODM-CLM-011 切换20条每页页面正常且列表同步', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
const { total, rowsBefore, rowsAfter } = await prodmCenterLimitPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmCenterLimitPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('中心库上下限建议 · 导出', () => {
test('PRODM-CLM-012 当前查询条件下导出', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.clickExportIfVisible();
});
});
test.describe('中心库上下限建议 · 打印', () => {
test('PRODM-CLM-013 按当前条件打印', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.clickPrintIfVisible();
});
});
test.describe('中心库上下限建议 · 全部调整', () => {
test('PRODM-CLM-014 打开「全部调整」对应弹窗/抽屉', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.openToolbarOverlay('全部调整');
await prodmCenterLimitPage.closeOverlay();
});
test('PRODM-CLM-015 「全部调整」取消不落库', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.cancelToolbarWithoutCommit('全部调整');
});
test('PRODM-CLM-016 「全部调整」必填为空拦截', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.assertRequiredInterceptFor('全部调整');
});
});
test.describe('中心库上下限建议 · 批量调整', () => {
test('PRODM-CLM-017 打开「批量调整」对应弹窗/抽屉', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.openToolbarOverlay('批量调整');
await prodmCenterLimitPage.closeOverlay();
});
test('PRODM-CLM-018 「批量调整」取消不落库', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.cancelToolbarWithoutCommit('批量调整');
});
test('PRODM-CLM-019 「批量调整」必填为空拦截', async ({ prodmCenterLimitPage }) => {
await prodmCenterLimitPage.open();
await prodmCenterLimitPage.assertRequiredInterceptFor('批量调整');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-中心库库区产品设置-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-center-zone:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('中心库库区产品设置 · 快捷筛选查询', () => {
test('PRODM-CZO-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.clickResetQuick();
await prodmCenterZonePage.expectOnPage();
});
});
test.describe('中心库库区产品设置 · 高级筛选抽屉', () => {
test('PRODM-CZO-002 全量查询条件组合查询', async ({ prodmCenterZonePage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
test('PRODM-CZO-003 点击高级筛选打开抽屉', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.openAdvancedFilterDrawer();
});
});
test.describe('中心库库区产品设置 · 列表', () => {
test('PRODM-CZO-004 列表核心列完整', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.assertConfiguredHeaders();
});
test('PRODM-CZO-007 列设置隐藏后再恢复', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.clickQuery();
await prodmCenterZonePage.executeColumnSettingsToggleRestoreTest();
});
test('PRODM-CZO-008 横向滚动与列对齐', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.expectHorizontalScrollAlignment();
});
test('PRODM-CZO-009 无匹配空态(mock反例)', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.searchByMockKeyword();
const snap = await prodmCenterZonePage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('中心库库区产品设置 · 行内操作', () => {
test('PRODM-CZO-005 行内「详情」可达(只读冒烟)', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.rowActionSmoke('详情');
});
test('PRODM-CZO-006 行内「编辑」可达(只读冒烟)', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.rowActionSmoke('编辑');
});
});
test.describe('中心库库区产品设置 · 分页', () => {
test('PRODM-CZO-010 有数据时总条数', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.assertTotalWhenHasData();
});
test('PRODM-CZO-011 切换至第 2 页', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.goToPage2ForProdm();
});
test('PRODM-CZO-012 切换20条每页页面正常且列表同步', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
const { total, rowsBefore, rowsAfter } = await prodmCenterZonePage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmCenterZonePage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('中心库库区产品设置 · 导出', () => {
test('PRODM-CZO-013 当前查询条件下导出', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.clickExportIfVisible();
});
});
test.describe('中心库库区产品设置 · 添加中心库库区产品', () => {
test('PRODM-CZO-014 打开「添加中心库库区产品」对应弹窗/抽屉', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.openToolbarOverlay('添加中心库库区产品');
await prodmCenterZonePage.closeOverlay();
});
test('PRODM-CZO-015 「添加中心库库区产品」取消不落库', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.cancelToolbarWithoutCommit('添加中心库库区产品');
});
test('PRODM-CZO-016 「添加中心库库区产品」必填为空拦截', async ({ prodmCenterZonePage }) => {
await prodmCenterZonePage.open();
await prodmCenterZonePage.assertRequiredInterceptFor('添加中心库库区产品');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-变更单明细查询-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-change-detail:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('变更单明细查询 · 快捷筛选查询', () => {
test('PRODM-CHD-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.clickResetQuick();
await prodmChangeDetailPage.expectOnPage();
});
test('PRODM-CHD-002 全量可见条件组合查询', async ({ prodmChangeDetailPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('变更单明细查询 · 查询条件展开收起', () => {
test('PRODM-CHD-003 展开后更多条件可见', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.toggleFilterExpand();
});
});
test.describe('变更单明细查询 · 列表', () => {
test('PRODM-CHD-004 列表核心列完整', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.assertConfiguredHeaders();
});
test('PRODM-CHD-005 物料名称列升序降序切换', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.expectColumnSortAscDesc('物料名称');
});
test('PRODM-CHD-006 无匹配空态(mock反例)', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.searchByMockKeyword();
const snap = await prodmChangeDetailPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('变更单明细查询 · 分页', () => {
test('PRODM-CHD-007 有数据时总条数', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.assertTotalWhenHasData();
});
test('PRODM-CHD-008 切换至第 2 页', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.goToPage2ForProdm();
});
test('PRODM-CHD-009 切换20条每页页面正常且列表同步', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
const { total, rowsBefore, rowsAfter } = await prodmChangeDetailPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmChangeDetailPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('变更单明细查询 · 导出', () => {
test('PRODM-CHD-010 当前查询条件下导出', async ({ prodmChangeDetailPage }) => {
await prodmChangeDetailPage.open();
await prodmChangeDetailPage.clickExportIfVisible();
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品核对重新发起-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-check-reinit:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品核对重新发起 · 快捷筛选查询', () => {
test('PRODM-CHK-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.clickResetQuick();
await prodmCheckReinitPage.expectOnPage();
});
test('PRODM-CHK-002 全量可见条件组合查询', async ({ prodmCheckReinitPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('产品核对重新发起 · 查询条件展开收起', () => {
test('PRODM-CHK-003 展开后更多条件可见', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.toggleFilterExpand();
});
});
test.describe('产品核对重新发起 · 状态 Tab', () => {
test('PRODM-CHK-004 状态 Tab 与列表一致', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.clickStatusTabs();
});
});
test.describe('产品核对重新发起 · 列表', () => {
test('PRODM-CHK-005 列表核心列完整', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.assertConfiguredHeaders();
});
test('PRODM-CHK-006 行内「编辑」可达(只读冒烟)', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.rowActionSmoke('编辑');
});
test('PRODM-CHK-007 无匹配空态(mock反例)', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.searchByMockKeyword();
const snap = await prodmCheckReinitPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品核对重新发起 · 分页', () => {
test('PRODM-CHK-008 有数据时总条数', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.assertTotalWhenHasData();
});
test('PRODM-CHK-009 切换至第 2 页', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.goToPage2ForProdm();
});
test('PRODM-CHK-010 切换20条每页页面正常且列表同步', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
const { total, rowsBefore, rowsAfter } = await prodmCheckReinitPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmCheckReinitPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('产品核对重新发起 · 导出', () => {
test('PRODM-CHK-011 当前查询条件下导出', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.clickExportIfVisible();
});
});
test.describe('产品核对重新发起 · 重新发起审核', () => {
test('PRODM-CHK-012 打开「重新发起审核」对应弹窗/抽屉', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.openToolbarOverlay('重新发起审核');
await prodmCheckReinitPage.closeOverlay();
});
test('PRODM-CHK-013 「重新发起审核」取消不落库', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.cancelToolbarWithoutCommit('重新发起审核');
});
test('PRODM-CHK-014 「重新发起审核」必填为空拦截', async ({ prodmCheckReinitPage }) => {
await prodmCheckReinitPage.open();
await prodmCheckReinitPage.assertRequiredInterceptFor('重新发起审核');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品DI变更-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-di-change:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品DI变更 · 快捷筛选查询', () => {
test('PRODM-DIC-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.clickResetQuick();
await prodmDiChangePage.expectOnPage();
});
test('PRODM-DIC-002 全量可见条件组合查询', async ({ prodmDiChangePage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('产品DI变更 · 查询条件展开收起', () => {
test('PRODM-DIC-003 展开后更多条件可见', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.toggleFilterExpand();
});
});
test.describe('产品DI变更 · 列表', () => {
test('PRODM-DIC-004 列表核心列完整', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.assertConfiguredHeaders();
});
test('PRODM-DIC-008 列设置隐藏后再恢复', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.clickQuery();
await prodmDiChangePage.executeColumnSettingsToggleRestoreTest();
});
test('PRODM-DIC-009 横向滚动与列对齐', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.expectHorizontalScrollAlignment();
});
test('PRODM-DIC-010 无匹配空态(mock反例)', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.searchByMockKeyword();
const snap = await prodmDiChangePage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品DI变更 · 行内操作', () => {
test('PRODM-DIC-005 行内「详情」可达(只读冒烟)', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.rowActionSmoke('详情');
});
test('PRODM-DIC-006 行内「编辑」可达(只读冒烟)', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.rowActionSmoke('编辑');
});
test('PRODM-DIC-007 行内「日志」可达(只读冒烟)', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.rowActionSmoke('日志');
});
});
test.describe('产品DI变更 · 分页', () => {
test('PRODM-DIC-011 有数据时总条数', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.assertTotalWhenHasData();
});
test('PRODM-DIC-012 切换至第 2 页', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
await prodmDiChangePage.goToPage2ForProdm();
});
test('PRODM-DIC-013 切换20条每页页面正常且列表同步', async ({ prodmDiChangePage }) => {
await prodmDiChangePage.open();
const { total, rowsBefore, rowsAfter } = await prodmDiChangePage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmDiChangePage.getTotalCount(), '总条数应不变').toBe(total);
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品DI查询-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-di-query:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品DI查询 · 快捷筛选查询', () => {
test('PRODM-DIQ-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.clickResetQuick();
await prodmDiQueryPage.expectOnPage();
});
test('PRODM-DIQ-002 全量可见条件组合查询', async ({ prodmDiQueryPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('产品DI查询 · 查询条件展开收起', () => {
test('PRODM-DIQ-003 展开后更多条件可见', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.toggleFilterExpand();
});
});
test.describe('产品DI查询 · 列表', () => {
test('PRODM-DIQ-004 列表核心列完整', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.assertConfiguredHeaders();
});
test('PRODM-DIQ-005 行内「详情」可达(只读冒烟)', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.rowActionSmoke('详情');
});
test('PRODM-DIQ-006 无匹配空态(mock反例)', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.searchByMockKeyword();
const snap = await prodmDiQueryPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品DI查询 · 分页', () => {
test('PRODM-DIQ-007 有数据时总条数', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.assertTotalWhenHasData();
});
test('PRODM-DIQ-008 切换至第 2 页', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.goToPage2ForProdm();
});
test('PRODM-DIQ-009 切换20条每页页面正常且列表同步', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
const { total, rowsBefore, rowsAfter } = await prodmDiQueryPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmDiQueryPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('产品DI查询 · 导出', () => {
test('PRODM-DIQ-010 当前查询条件下导出', async ({ prodmDiQueryPage }) => {
await prodmDiQueryPage.open();
await prodmDiQueryPage.clickExportIfVisible();
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品初审核对-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-first-audit:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品初审核对 · 快捷筛选查询', () => {
test('PRODM-FAU-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.clickResetQuick();
await prodmFirstAuditPage.expectOnPage();
});
test('PRODM-FAU-002 全量可见条件组合查询', async ({ prodmFirstAuditPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('产品初审核对 · 查询条件展开收起', () => {
test('PRODM-FAU-003 展开后更多条件可见', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.toggleFilterExpand();
});
});
test.describe('产品初审核对 · 列表', () => {
test('PRODM-FAU-004 列表核心列完整', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.assertConfiguredHeaders();
});
test('PRODM-FAU-008 无匹配空态(mock反例)', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.searchByMockKeyword();
const snap = await prodmFirstAuditPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品初审核对 · 行内操作', () => {
test('PRODM-FAU-005 行内「详情」可达(只读冒烟)', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.rowActionSmoke('详情');
});
test('PRODM-FAU-006 行内「审核」可达(只读冒烟)', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.rowActionSmoke('审核');
});
test('PRODM-FAU-007 行内「编辑」可达(只读冒烟)', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.rowActionSmoke('编辑');
});
});
test.describe('产品初审核对 · 分页', () => {
test('PRODM-FAU-009 有数据时总条数', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.assertTotalWhenHasData();
});
test('PRODM-FAU-010 切换至第 2 页', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.goToPage2ForProdm();
});
test('PRODM-FAU-011 切换20条每页页面正常且列表同步', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
const { total, rowsBefore, rowsAfter } = await prodmFirstAuditPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmFirstAuditPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('产品初审核对 · 导出', () => {
test('PRODM-FAU-012 当前查询条件下导出', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.clickExportIfVisible();
});
});
test.describe('产品初审核对 · 产品初审核对', () => {
test('PRODM-FAU-013 打开「产品初审核对」对应弹窗/抽屉', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.openToolbarOverlay('产品初审核对');
await prodmFirstAuditPage.closeOverlay();
});
test('PRODM-FAU-014 「产品初审核对」取消不落库', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.cancelToolbarWithoutCommit('产品初审核对');
});
test('PRODM-FAU-015 「产品初审核对」必填为空拦截', async ({ prodmFirstAuditPage }) => {
await prodmFirstAuditPage.open();
await prodmFirstAuditPage.assertRequiredInterceptFor('产品初审核对');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品信息变更-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-info-change:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品信息变更 · 快捷筛选查询', () => {
test('PRODM-ICH-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.clickResetQuick();
await prodmInfoChangePage.expectOnPage();
});
});
test.describe('产品信息变更 · 高级筛选抽屉', () => {
test('PRODM-ICH-002 全量查询条件组合查询', async ({ prodmInfoChangePage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
test('PRODM-ICH-003 点击高级筛选打开抽屉', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.openAdvancedFilterDrawer();
});
});
test.describe('产品信息变更 · 列表', () => {
test('PRODM-ICH-004 列表核心列完整', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.assertConfiguredHeaders();
});
test('PRODM-ICH-008 列设置隐藏后再恢复', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.clickQuery();
await prodmInfoChangePage.executeColumnSettingsToggleRestoreTest();
});
test('PRODM-ICH-009 横向滚动与列对齐', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.expectHorizontalScrollAlignment();
});
test('PRODM-ICH-010 无匹配空态(mock反例)', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.searchByMockKeyword();
const snap = await prodmInfoChangePage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品信息变更 · 行内操作', () => {
test('PRODM-ICH-005 行内「详情」可达(只读冒烟)', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.rowActionSmoke('详情');
});
test('PRODM-ICH-006 行内「编辑」可达(只读冒烟)', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.rowActionSmoke('编辑');
});
test('PRODM-ICH-007 行内「日志」可达(只读冒烟)', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.rowActionSmoke('日志');
});
});
test.describe('产品信息变更 · 分页', () => {
test('PRODM-ICH-011 有数据时总条数', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.assertTotalWhenHasData();
});
test('PRODM-ICH-012 切换至第 2 页', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.goToPage2ForProdm();
});
test('PRODM-ICH-013 切换20条每页页面正常且列表同步', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
const { total, rowsBefore, rowsAfter } = await prodmInfoChangePage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmInfoChangePage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('产品信息变更 · 打印', () => {
test('PRODM-ICH-014 按当前条件打印', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.clickPrintIfVisible();
});
});
test.describe('产品信息变更 · 新增', () => {
test('PRODM-ICH-015 打开「新增」对应弹窗/抽屉', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.openToolbarOverlay('新增');
await prodmInfoChangePage.closeOverlay();
});
test('PRODM-ICH-016 「新增」取消不落库', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.cancelToolbarWithoutCommit('新增');
});
test('PRODM-ICH-017 「新增」必填为空拦截', async ({ prodmInfoChangePage }) => {
await prodmInfoChangePage.open();
await prodmInfoChangePage.assertRequiredInterceptFor('新增');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-产品维护-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-maintain:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('产品维护 · 左侧耗材分类树', () => {
test('PRODM-MNT-001 树默认有选中或可展开节点', { tag: '@smoke' }, async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.expectTreeDefaultScope();
});
test('PRODM-MNT-002 切换树节点刷新右侧', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
const switched = await prodmMaintainPage.switchOtherTreeNode();
expect(switched, '应能切换树节点').toBeTruthy();
});
});
test.describe('产品维护 · 快捷筛选查询', () => {
test('PRODM-MNT-003 快捷区重置恢复默认', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.clickResetQuick();
await prodmMaintainPage.expectOnPage();
});
});
test.describe('产品维护 · 高级筛选抽屉', () => {
test('PRODM-MNT-004 全量查询条件组合查询', async ({ prodmMaintainPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
test('PRODM-MNT-005 点击高级筛选打开抽屉', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.openAdvancedFilterDrawer();
});
});
test.describe('产品维护 · 列表', () => {
test('PRODM-MNT-006 列表核心列完整', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.assertConfiguredHeaders();
});
test('PRODM-MNT-007 行内「详情」可达(只读冒烟)', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.rowActionSmoke('详情');
});
test('PRODM-MNT-008 列设置隐藏后再恢复', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.clickQuery();
await prodmMaintainPage.executeColumnSettingsToggleRestoreTest();
});
test('PRODM-MNT-009 横向滚动与列对齐', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.expectHorizontalScrollAlignment();
});
test('PRODM-MNT-010 无匹配空态(mock反例)', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.searchByMockKeyword();
const snap = await prodmMaintainPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('产品维护 · 分页', () => {
test('PRODM-MNT-011 有数据时总条数', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.assertTotalWhenHasData();
});
test('PRODM-MNT-012 切换至第 2 页', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.goToPage2ForProdm();
});
test('PRODM-MNT-013 切换20条每页页面正常且列表同步', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
const { total, rowsBefore, rowsAfter } = await prodmMaintainPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmMaintainPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('产品维护 · 导出', () => {
test('PRODM-MNT-014 当前查询条件下导出', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.clickExportIfVisible();
});
});
test.describe('产品维护 · 分类维护', () => {
test('PRODM-MNT-015 打开「分类维护」对应弹窗/抽屉', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.openToolbarOverlay('分类维护');
await prodmMaintainPage.closeOverlay();
});
test('PRODM-MNT-016 「分类维护」取消不落库', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.cancelToolbarWithoutCommit('分类维护');
});
test('PRODM-MNT-017 「分类维护」必填为空拦截', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.assertRequiredInterceptFor('分类维护');
});
});
test.describe('产品维护 · 添加', () => {
test('PRODM-MNT-018 打开「添加」对应弹窗/抽屉', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.openToolbarOverlay('添加');
await prodmMaintainPage.closeOverlay();
});
test('PRODM-MNT-019 「添加」取消不落库', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.cancelToolbarWithoutCommit('添加');
});
test('PRODM-MNT-020 「添加」必填为空拦截', async ({ prodmMaintainPage }) => {
await prodmMaintainPage.open();
await prodmMaintainPage.assertRequiredInterceptFor('添加');
});
});
});
import { expect, test } from '../../fixtures';
/**
* 全量用例:与 testcase/基础管理-产品管理-物料变更单明细查询-UI自动化测试用例-01.csv 严格一致
* 运行:npm run test:prodm-material-chg-detail:all
*/
test.describe('基础设置 · 产品管理', () => {
test.describe('物料变更单明细查询 · 快捷筛选查询', () => {
test('PRODM-MCD-001 快捷区重置恢复默认', { tag: '@smoke' }, async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.clickResetQuick();
await prodmMaterialChgDetailPage.expectOnPage();
});
test('PRODM-MCD-002 全量可见条件组合查询', async ({ prodmMaterialChgDetailPage }) => {
test.skip(
true,
'组合查询须按页面配置 quickFields/drawerFields 实现 searchWithQuickAndDrawerCombo(对齐 center-report-sheet STAT-IOD-004),禁止临时启发式填表',
);
});
});
test.describe('物料变更单明细查询 · 查询条件展开收起', () => {
test('PRODM-MCD-003 展开后更多条件可见', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.toggleFilterExpand();
});
});
test.describe('物料变更单明细查询 · 列表', () => {
test('PRODM-MCD-004 列表核心列完整', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.assertConfiguredHeaders();
});
test('PRODM-MCD-005 物料编号列升序降序切换', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.expectColumnSortAscDesc('物料编号');
});
test('PRODM-MCD-006 无匹配空态(mock反例)', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.searchByMockKeyword();
const snap = await prodmMaterialChgDetailPage.snapshotList();
expect(snap.rows === 0 || snap.emptyVisible, '无匹配应空态').toBeTruthy();
});
});
test.describe('物料变更单明细查询 · 分页', () => {
test('PRODM-MCD-007 有数据时总条数', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.assertTotalWhenHasData();
});
test('PRODM-MCD-008 切换至第 2 页', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.goToPage2ForProdm();
});
test('PRODM-MCD-009 切换20条每页页面正常且列表同步', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
const { total, rowsBefore, rowsAfter } = await prodmMaterialChgDetailPage.switchToPageSizeTwenty();
const expectedRows = Math.min(total, 20);
expect(rowsAfter, '当前页行数应与 20 条/页及总条数一致').toBe(expectedRows);
if (total > 20) {
expect(rowsAfter, '切换后可见行应随每页条数变化').not.toBe(rowsBefore);
}
expect(await prodmMaterialChgDetailPage.getTotalCount(), '总条数应不变').toBe(total);
});
});
test.describe('物料变更单明细查询 · 导出', () => {
test('PRODM-MCD-010 当前查询条件下导出', async ({ prodmMaterialChgDetailPage }) => {
await prodmMaterialChgDetailPage.open();
await prodmMaterialChgDetailPage.clickExportIfVisible();
});
});
});
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment