浏览代码

docs: 询价单详情已选商品独立 Tab 设计规格

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 2 月之前
父节点
当前提交
c48b18e9da
共有 1 个文件被更改,包括 155 次插入 和 0 次删除
  1. 155 0
      docs/superpowers/specs/2026-08-05-web-admin-inquiry-detail-selected-products-tab-design.md

+ 155 - 0
docs/superpowers/specs/2026-08-05-web-admin-inquiry-detail-selected-products-tab-design.md

@@ -0,0 +1,155 @@
+# Web-Admin 询价单详情「已选商品」独立 Tab 设计
+
+> 日期:2026-08-05  
+> 页面:`web-admin` → `#/inquiry/manage`(询价报价管理)  
+> 已确认口径:方案 **1**(Hero 固定 + 两 Tab)+ 已选 Tab 用 **表格** + **仅改详情弹窗**
+
+## 1. 背景与问题
+
+### 1.1 现状
+
+- 「询价单详情」弹窗(`web-admin/src/views/system/inquiry-quotation/index.vue`)在基础信息下方展示「已选商品」标签云(`picker-selected` + `el-tag`)。
+- 询价商品较多时,标签云纵向占位大,把下方分类树 / 商品列表挤到更低位置,首屏可读性差。
+- 标签云与下方「商品列表」数据同源(`viewInquiryProductsFlat`),信息有重叠。
+
+### 1.2 目标
+
+- 默认打开详情时,首屏以 **基础信息 + 分类浏览** 为主,不被已选清单撑高。
+- 「已选商品」仍可完整查看,且以 **表格** 形式便于扫读与搜索。
+- 不改后端接口;不改新增/编辑询价单选品体验。
+
+### 1.3 非目标
+
+- 不改造「新增/编辑询价单」弹窗内的已选商品标签区。
+- 不新增 API、不改表结构。
+- 不做分页(本期沿用全量 `viewInquiryProductsFlat`;数据量与现网询价单规模一致)。
+- 不改变概览区卡片/列表切换、分类筛选、双击看商品详情等既有行为。
+
+---
+
+## 2. 已确认决策
+
+| 项 | 选择 |
+|----|------|
+| Tab 结构 | **A**:① 概览(基础信息 + 分类树/商品列表)② 已选商品(表格) |
+| 已选展示 | **B**:表格(对齐概览 list 模式列) |
+| 改动范围 | **A**:仅「询价单详情」弹窗 |
+| 布局方案 | **方案 1**:Hero 固定在 Tabs 上方;默认 Tab = 概览 |
+| 搜索 | 概览搜索与已选 Tab 搜索 **互相独立** |
+
+---
+
+## 3. 方案对比(回顾)
+
+| 方案 | 说明 | 结论 |
+|------|------|------|
+| **1 Hero + 两 Tab** | Hero 固定;概览去掉标签云;已选独立表格 Tab | **采用** |
+| 2 Collapse 折叠标签云 | 改动小,展开后仍占空间 | 不采用 |
+| 3 概览「共 N 个」跳转已选 Tab | 多一层交互,本期不必 | 不采用 |
+
+---
+
+## 4. 界面与行为设计
+
+### 4.1 布局
+
+```
+[询价单详情 Dialog]
+  Hero(标题 / 状态 / 创建时间)          ← 始终可见
+  el-tabs(默认 overview)
+    ├─ 概览
+    │    ├─ 基础信息(标题 / 创建时间 / 备注)
+    │    └─ embedded picker:搜索 + 分类树 + 卡片/列表
+    └─ 已选商品
+         ├─ 工具栏:共 N 个 + 名称搜索
+         └─ el-table(固定高度约 400)
+  Footer:关闭
+```
+
+### 4.2 概览 Tab
+
+- 保留现有 Hero、基础信息、`picker-search-row`、分类树、右侧卡片/列表、双击打开 `ProductViewDialog`。
+- **移除** `picker-selected` 标签云区块(仅详情弹窗)。
+- 右侧标题仍可显示「共 N 个」(N = 本单商品总数),语义不变。
+
+### 4.3 已选商品 Tab
+
+- 数据源:`viewInquiryProductsFlat`(打开详情时已加载,无需二次请求)。
+- 工具栏:
+  - 文案:无已生效关键词时显示「共 N 个」;有关键词时显示「共 M / N 个」(M=过滤后数量,N=本单总数)。
+  - 搜索:输入框 +「搜索」按钮;支持回车;按商品名称包含匹配(与概览搜索规则一致:trim 后名称 includes)。
+- 表格列(与概览 list 模式对齐):
+
+  | 列 | 说明 |
+  |----|------|
+  | 序号 | index + 1 |
+  | 图片 | `imageUrl` / 无图占位 |
+  | 商品名称 | `name`,overflow tooltip |
+  | 分类 | `formatCategoryName(...)` |
+  | 计量 | `formatMeasureCell` |
+  | 单位 | `unitName` |
+  | 规格 | `formatSpecCell` |
+  | 商品描述 | `description`,overflow tooltip |
+
+- 空态:`el-empty`「暂无商品」(过滤为空时同用 empty)。
+- 双击行:调用现有 `openPickerProductView(row)`。
+- 不提供卡片/列表切换(本 Tab 固定表格)。
+
+### 4.4 打开 / 关闭
+
+`openViewInquiry` 时额外重置:
+
+- `viewInquiryDetailTab = 'overview'`
+- 已选 Tab 关键词(输入值与已应用值)清空
+
+关闭弹窗(`destroy-on-close`)后状态随下次打开重建即可。
+
+---
+
+## 5. 实现要点(前端)
+
+### 5.1 文件
+
+- 仅改:`web-admin/src/views/system/inquiry-quotation/index.vue`
+
+### 5.2 新增状态(建议命名)
+
+| 变量 | 类型 | 默认 | 用途 |
+|------|------|------|------|
+| `viewInquiryDetailTab` | `'overview' \| 'selected'` | `'overview'` | 当前 Tab |
+| `viewSelectedTabKeyword` | `string` | `''` | 已选 Tab 输入框 |
+| `viewSelectedTabAppliedKeyword` | `string` | `''` | 已选 Tab 已生效关键词 |
+
+### 5.3 计算属性
+
+- `viewSelectedTabProducts`:对 `viewInquiryProductsFlat` 按 `viewSelectedTabAppliedKeyword` 过滤名称。
+
+### 5.4 样式
+
+- 沿用现有 `inquiry-quotation-dialog` / Fresh Mint 样式。
+- Tabs 仅做必要间距(如 `margin-top`),不引入新视觉体系。
+- 已选表格可复用 `picker-product-table` / `picker-table-thumb` 等现有 class。
+
+### 5.5 明确不改
+
+- 新增/编辑询价单弹窗中的 `picker-selected` 标签区。
+- `fetchInquiryDetail` 及后端任何接口。
+- 报价明细、确认定价等其他弹窗。
+
+---
+
+## 6. 验收标准
+
+1. 打开商品较多的询价单详情,默认停在「概览」,首屏看不到大段已选标签云。
+2. 切换「已选商品」可见完整表格;列信息与概览列表模式一致。
+3. 已选 Tab 内搜索只过滤本 Tab,不影响概览分类/搜索状态;反之亦然。
+4. 双击已选表格行可打开商品详情。
+5. 再次打开详情时回到「概览」,两侧搜索关键词已清空。
+6. 新增/编辑询价单选品交互与改前一致。
+
+---
+
+## 7. 风险与备注
+
+- 极大量商品时全量表格仍可能偏重;本期不引入分页,与现有详情全量加载策略一致。若后续有性能问题,再单独评估虚拟列表或分页。
+- UI 文案保持简体中文(与现网 `web-admin` 一致):Tab 名「概览」「已选商品」。