|
|
@@ -0,0 +1,160 @@
|
|
|
+# Web-Admin 确认定价弹窗「批量设置调价系数」设计
|
|
|
+
|
|
|
+> 日期:2026-08-10
|
|
|
+> 页面:`web-admin` → `#/inquiry/manage`(询价报价管理)
|
|
|
+> 弹窗:`选中供应商报价并设置最终售价`(`confirmPricingDialogVisible`)
|
|
|
+> 已确认口径:统一设为同一数值 + 支持小数 + 勾选全部/部分(全选=当前可见行)
|
|
|
+> 改动文件:`web-admin/src/views/system/inquiry-quotation/index.vue`(为主;如需可同步 `docs/web-admin-ui-spec-fresh-mint.md` 留痕)
|
|
|
+
|
|
|
+## 1. 背景与问题
|
|
|
+
|
|
|
+### 1.1 现状
|
|
|
+
|
|
|
+- 确认定价弹窗右侧商品表支持逐行修改「调价系数(%)」,变更后按
|
|
|
+ `最终售价 = 供应商报价 × (1 + 系数/100)` 重算(`handleConfirmPricingCoefficientChange`)。
|
|
|
+- 商品较多时只能逐行改,效率低。
|
|
|
+
|
|
|
+### 1.2 目标
|
|
|
+
|
|
|
+- 支持将勾选商品的调价系数**统一设为同一数值**(含小数,如 `5` / `5.1` / `5.11`)。
|
|
|
+- 支持勾选全部(当前可见行)或勾选部分商品。
|
|
|
+- 批量设置后同步重算最终售价;单行仍可继续微调。
|
|
|
+- 不改后端接口与提交结构。
|
|
|
+
|
|
|
+### 1.3 非目标
|
|
|
+
|
|
|
+- 不支持「在现有系数上增减」模式。
|
|
|
+- 不新增 API、不改表结构。
|
|
|
+- 不改「确认选中并生效」提交逻辑(仍提交全部在售商品的 `finalPriceItems`)。
|
|
|
+- 不引入跨分类/跨搜索的勾选记忆(换筛选后勾选不保留)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 已确认决策
|
|
|
+
|
|
|
+| 项 | 选择 |
|
|
|
+|----|------|
|
|
|
+| 调整方式 | **A**:统一设为同一数值 |
|
|
|
+| 小数精度 | 与单行一致:`precision=2`(如 5.11) |
|
|
|
+| 全选范围 | **A**:仅当前列表可见项(当前 Tab + 分类筛选 + 搜索结果) |
|
|
|
+| 交互形态 | **方案 1**:表格多选列 + 标题区批量条 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 方案对比(回顾)
|
|
|
+
|
|
|
+| 方案 | 说明 | 结论 |
|
|
|
+|------|------|------|
|
|
|
+| **1 多选 + 标题栏批量条** | 已选 N + 系数输入 + 批量应用 | **采用** |
|
|
|
+| 2 表头 Popover | 勾选与入口分离 | 不采用 |
|
|
|
+| 3 二次确认小弹窗 | 步骤偏重 | 不采用 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 界面与行为设计
|
|
|
+
|
|
|
+### 4.1 布局
|
|
|
+
|
|
|
+在右侧标题行 `picker-right-title` 内增加批量条:左侧为标题与数量,紧随其后为批量控件;右侧仍为「在售|不在售」Tab。
|
|
|
+
|
|
|
+```
|
|
|
+[商品售价调整] 共 N 个 已选 M 项 调价系数 [____] [批量应用] [在售 | 不在售]
|
|
|
+```
|
|
|
+
|
|
|
+样式对齐 Fresh Mint:批量应用使用中性描边按钮(`btn-ghost`);不与页脚主按钮「确认选中并生效」抢主色。
|
|
|
+
|
|
|
+### 4.2 表格勾选
|
|
|
+
|
|
|
+- 表格最左侧增加 `type="selection"`(置于序号列前)。
|
|
|
+- `row-key="productId"` 保持不变。
|
|
|
+- **可选条件**:仅 `inSale === true` 的行可选(`selectable` 回调返回 `row.inSale`)。
|
|
|
+- **表头全选 / 取消全选**:Element Plus 默认行为即作用于当前 `data`(`confirmPricingDisplayItems`),满足「只选当前可见项」。
|
|
|
+- 切换 Tab / 分类 / 搜索后:表格 data 变化,勾选状态按 Element Plus 默认清空(不额外做跨筛选记忆)。
|
|
|
+
|
|
|
+### 4.3 批量应用逻辑
|
|
|
+
|
|
|
+输入:`confirmPricingBatchCoefficient`(`number | null`,`el-input-number`,`precision=2`,`controls-position="right"`)。
|
|
|
+
|
|
|
+点击「批量应用」:
|
|
|
+
|
|
|
+1. 若当前无勾选行 → `ElMessage.warning('请先勾选商品')`,中止。
|
|
|
+2. 若系数不是有限数字 → `ElMessage.warning('请输入有效的调价系数')`,中止。
|
|
|
+3. 对勾选行中 `inSale` 为真的每一行:
|
|
|
+ - `row.pricingCoefficient = Number(coeff.toFixed(2))`
|
|
|
+ - 调用与单行相同的重算:`handleConfirmPricingCoefficientChange(row)`
|
|
|
+4. 成功提示:`已对 N 个商品设置调价系数`(N 为实际写入行数)。
|
|
|
+
|
|
|
+### 4.4 「不在售」Tab
|
|
|
+
|
|
|
+- 批量条禁用(输入与按钮 `disabled`),或点击应用时提示当前无可调整商品。
|
|
|
+- 表行不可勾选(`selectable` 已排除)。
|
|
|
+
|
|
|
+### 4.5 与单行编辑共存
|
|
|
+
|
|
|
+- 批量后仍可改单行系数或最终售价(最终售价变更仍反推系数,逻辑不变)。
|
|
|
+- 不在售行的系数/售价输入保持禁用。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 数据与状态
|
|
|
+
|
|
|
+| 状态 | 类型 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `confirmPricingTableRef` | table ref | 读取 selection |
|
|
|
+| `confirmPricingSelectedRows` | `ref<Row[]>` | `@selection-change` 同步 |
|
|
|
+| `confirmPricingBatchCoefficient` | `ref<number \| null>` | 批量输入;打开弹窗时重置为 `null` 或常用默认(推荐 `null`,避免误应用) |
|
|
|
+
|
|
|
+打开弹窗(`openConfirmPricing...` 成功路径)时:
|
|
|
+
|
|
|
+- 清空 `confirmPricingSelectedRows`
|
|
|
+- 重置 `confirmPricingBatchCoefficient = null`
|
|
|
+- `nextTick` 后 `clearSelection()`(若 ref 可用)
|
|
|
+
|
|
|
+不新增后端字段;提交仍使用现有:
|
|
|
+
|
|
|
+```ts
|
|
|
+finalPriceItems: { productId, price, pricingCoefficient }[]
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 错误处理与边界
|
|
|
+
|
|
|
+| 场景 | 行为 |
|
|
|
+|------|------|
|
|
|
+| 未勾选 | warning,不改数据 |
|
|
|
+| 系数非数字 / null | warning,不改数据 |
|
|
|
+| 勾选后切到「不在售」 | selection 随 data 清空;批量条禁用 |
|
|
|
+| 供应商报价为 0 | 仍写入系数;最终售价按现有公式得 0(提交时原有「最终售价必须 > 0」校验仍生效) |
|
|
|
+| 仅勾选后全部变为不可见 | 以当前 selection 为准;若为空则按未勾选处理 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 测试要点
|
|
|
+
|
|
|
+1. 在售 Tab:全选当前可见行 → 输入 `5.11` → 批量应用 → 可见行系数均为 5.11,最终售价按公式更新。
|
|
|
+2. 仅勾选部分行 → 仅这些行变化,未勾选行不变。
|
|
|
+3. 分类筛选 / 搜索后全选 → 只影响当前可见行,不影响被筛掉的商品。
|
|
|
+4. 不在售 Tab:无法勾选、批量条不可用。
|
|
|
+5. 批量后改单行系数/最终售价仍正常。
|
|
|
+6. 「确认选中并生效」提交 payload 含更新后的 `pricingCoefficient` 与 `price`。
|
|
|
+7. 关闭再打开弹窗:勾选与批量输入已重置。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. 实现范围清单
|
|
|
+
|
|
|
+- [ ] `confirm-pricing` 表格增加 selection 列与 `selectable`
|
|
|
+- [ ] 标题区批量条 UI(已选数、input-number、批量应用)
|
|
|
+- [ ] selection-change / 批量应用 / 打开弹窗重置
|
|
|
+- [ ] 「不在售」时禁用批量条
|
|
|
+- [ ] (可选)在 `docs/web-admin-ui-spec-fresh-mint.md` 变更记录中留一句询价确认定价批量系数说明
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. 验收标准
|
|
|
+
|
|
|
+- 用户可在确认定价弹窗内通过勾选 + 统一数值,批量设置调价系数并看到最终售价同步更新。
|
|
|
+- 全选仅覆盖当前可见列表。
|
|
|
+- 支持两位小数。
|
|
|
+- 无后端变更;现有生效提交流程不受影响。
|