# Web-Admin 确认定价弹窗批量设置调价系数 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 在「选中供应商报价并设置最终售价」弹窗内,支持勾选商品并一键将调价系数统一设为同一数值(含两位小数),同步重算最终售价。 **Architecture:** 仅改 `inquiry-quotation/index.vue`:表格增加 `selection`(仅在售可选,全选=当前 `confirmPricingDisplayItems`);标题区增加批量条(已选数 + `el-input-number` + 批量应用);应用时写入系数并复用 `handleConfirmPricingCoefficientChange`。无后端变更。 **Tech Stack:** Vue3 + TypeScript + Element Plus(`web-admin`) ## Global Constraints - Spec: `docs/superpowers/specs/2026-08-10-web-admin-confirm-pricing-batch-coefficient-design.md` - 调整方式:统一设为同一数值(非增减) - 小数:`precision=2`(如 5.11) - 全选范围:仅当前可见行(Tab + 分类 + 搜索) - 仅 `inSale` 行可选、可被批量写入 - 「不在售」Tab:批量条禁用 - 批量应用按钮:`btn-ghost`(中性描边),不与页脚主按钮抢主色 - 打开弹窗重置:勾选清空、批量输入 `null` - 不改 `submitConfirmPricing` / API - `web-admin` 无组件单测脚手架:以手动验收清单为准(见 Task 4) - 不主动 commit(除非用户要求) ## File map | 文件 | 职责 | |------|------| | `web-admin/src/views/system/inquiry-quotation/index.vue` | 确认定价弹窗模板、状态、处理函数、局部样式 | | `docs/web-admin-ui-spec-fresh-mint.md` | (可选)变更留痕一句 | --- ### Task 1: 状态、selectable、批量应用与打开重置 **Files:** - Modify: `web-admin/src/views/system/inquiry-quotation/index.vue`(script:`confirmPricingDialogVisible` 状态区;`handleConfirmPricingCoefficientChange` 附近;打开确认定价弹窗函数内) **Interfaces:** - Consumes: 现有 `handleConfirmPricingCoefficientChange(row)`、`confirmPricingSaleTab`、打开弹窗成功路径中的 `confirmPricingDialogVisible = true` - Produces: - `confirmPricingTableRef` - `confirmPricingSelectedRows: Ref` - `confirmPricingBatchCoefficient: Ref` - `confirmPricingBatchDisabled: ComputedRef` - `confirmPricingRowSelectable(row): boolean` - `onConfirmPricingSelectionChange(rows): void` - `applyConfirmPricingBatchCoefficient(): void` - [x] **Step 1:** 在 `confirmPricingDialogVisible` 等状态旁新增: ```ts const confirmPricingTableRef = ref(null) const confirmPricingSelectedRows = ref([]) const confirmPricingBatchCoefficient = ref(null) const confirmPricingBatchDisabled = computed( () => confirmPricingSaleTab.value !== 'inSale' ) const confirmPricingRowSelectable = (row: any) => Boolean(row?.inSale) const onConfirmPricingSelectionChange = (rows: any[]) => { confirmPricingSelectedRows.value = Array.isArray(rows) ? rows : [] } const applyConfirmPricingBatchCoefficient = () => { if (confirmPricingBatchDisabled.value) { ElMessage.warning('请切换到「在售」后再批量设置调价系数') return } const selected = (confirmPricingSelectedRows.value || []).filter((x) => x?.inSale) if (!selected.length) { ElMessage.warning('请先勾选商品') return } const coeff = Number(confirmPricingBatchCoefficient.value) if (!Number.isFinite(coeff)) { ElMessage.warning('请输入有效的调价系数') return } const safeCoeff = Number(coeff.toFixed(2)) for (const row of selected) { row.pricingCoefficient = safeCoeff handleConfirmPricingCoefficientChange(row) } ElMessage.success(`已对 ${selected.length} 个商品设置调价系数`) } ``` 注意:`applyConfirmPricingBatchCoefficient` 必须定义在 `handleConfirmPricingCoefficientChange` **之后**,或确保函数声明顺序不触发 TDZ(若用 `const` 箭头函数,放在被调用方之后)。 - [x] **Step 2:** 在打开确认定价弹窗、赋值 `confirmPricingItems` 并 `confirmPricingDialogVisible.value = true` 的成功路径中,增加重置: ```ts confirmPricingSelectedRows.value = [] confirmPricingBatchCoefficient.value = null confirmPricingDialogVisible.value = true nextTick(() => { confirmPricingCategoryTreeRef.value?.setCurrentKey(undefined) confirmPricingTableRef.value?.clearSelection?.() }) ``` (合并到现有 `nextTick` 即可,避免重复 `nextTick`。) --- ### Task 2: 标题区批量条 + 表格 selection 列 **Files:** - Modify: 同文件模板,确认定价弹窗内 `picker-right-title` 与 `el-table.confirm-pricing-table`(约 1516–1621 行) - [x] **Step 1:** 将标题区改为: ```vue
商品售价调整 共 {{ confirmPricingDisplayItems.length }} 个 已选 {{ confirmPricingSelectedRows.length }} 项 调价系数 批量应用
在售 不在售
``` - [x] **Step 2:** 表格增加 ref、selection-change、selection 列(在序号列前): ```vue ``` --- ### Task 3: 局部样式(标题区不挤爆) **Files:** - Modify: 同文件 `