2026-08-10-web-admin-confirm-pricing-batch-coefficient-design.md 6.4 KB

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 可用)

不新增后端字段;提交仍使用现有:

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. 验收标准

  • 用户可在确认定价弹窗内通过勾选 + 统一数值,批量设置调价系数并看到最终售价同步更新。
  • 全选仅覆盖当前可见列表。
  • 支持两位小数。
  • 无后端变更;现有生效提交流程不受影响。