Files
JY1.0/docs/JY1.0-采购件入库查询卡顿修改方案.md

12 KiB
Raw Permalink Blame History

JY1.0 采购件入库查询卡顿修改方案

1. 背景说明

仓储管理模块页面 src/views/WarehouseManagement/PurchasePartsStorage/index.vue 在执行查询操作时,存在页面明显卡顿、浏览器长时间无响应、严重时看起来像页面崩溃的问题。

本方案用于整理当前排查结论、明确问题成因,并提出分阶段修改建议。本文档只给出修改方案,不直接改动代码。

2. 问题现象

当前页面包含采购件入库、自制件入库、外协到货等多个页签,其中采购件入库页签在选择供应商或合同后会自动执行查询。

现场表现主要包括:

  • 点击查询后页面长时间卡住。
  • 表格数据返回后界面渲染明显变慢。
  • 数据量较大时浏览器出现假死或无响应。
  • 用户主观感受为“查询就崩”。

3. 涉及文件

  • src/views/WarehouseManagement/PurchasePartsStorage/index.vue
  • src/main.js
  • src/utils/request.js

重点排查方法:

  • searchTable1()
  • searchTable3()
  • getSummaries()
  • getSummaries1()
  • handleSelectionChange()
  • recalcSelection()

4. 原因分析

4.1 采购件入库查询未分页,前端一次性加载全量数据

searchTable1() 中,查询请求通过 CreateData('11', ..., param) 发送,但未传入分页参数。

这会带来两个问题:

  • 后端可能直接返回该供应商或合同下的全部数据。
  • 前端需要一次性渲染整张大表,数据量较大时会明显拖慢页面。

相比之下,自制件入库的 searchTable3() 已传入 pageSize1pageCurrent1,说明当前页面内部本身就存在两种不同的数据加载策略,采购件入库部分的实现明显更重。

4.2 查询完成后自动逐行全选,进一步放大渲染压力

searchTable1() 中,查询成功后会遍历 tableData1,并对满足条件的行逐个执行:

  • this.$refs.table.toggleRowSelection(row, true)

虽然代码里使用了 _suppressSelectionChange 来避免自定义选中计算被重复触发,但 Element UI 表格内部仍需要为每一行更新选中状态、复选框状态和相关渲染结果。

当查询结果很多时,这段“逐行自动勾选”的逻辑会成为非常重的同步操作,容易造成主线程阻塞。

4.3 表格每行挂载多个重量级组件,导致大表渲染成本过高

采购件入库与自制件入库表格中,每行都包含较多交互组件,例如:

  • el-select
  • el-input-number
  • 选择列
  • 按钮列

其中 el-input-numberel-select 在大数据表格中本身就属于渲染和响应式开销较高的组件。若查询结果达到数百行甚至更多组件实例数、watcher 数量、DOM 节点数量都会迅速增大。

4.4 表格启用汇总行,汇总函数会对数据做多轮遍历

页面使用了:

  • show-summary
  • summary-method

getSummaries()getSummaries1() 中对多个列执行了多次 map + reduce 计算。

这意味着:

  • 查询后首次渲染要做汇总计算。
  • 表格数据变化、选中变化、输入变化后,汇总有机会被再次触发。
  • 当数据量大时,汇总计算会持续放大卡顿感。

4.5 查询动作与下拉联动查询存在叠加请求

例如自制件入库页签中,订单切换时会同时触发:

  • searchTable3()
  • getnumberSelection()

这类逻辑虽然不是采购件入库“卡死”的唯一主因,但会增加同一时间段内的请求数和页面状态更新次数,让用户更容易感知到页面迟滞。

4.6 当前超时配置较大,不容易快速暴露性能问题

src/utils/request.js 中 Axios timeout 设置为 1500000

这会导致:

  • 如果接口慢,页面会长时间停留在等待状态。
  • 如果前端渲染本身很重,用户更容易把“卡顿”感知为“页面崩溃”。

这不是根因,但会放大问题表现。

5. 结论判断

综合代码结构,当前“查询就卡页面崩溃”的高概率原因不是单一点故障,而是以下因素叠加:

  1. 采购件入库查询无分页。
  2. 查询完成后自动逐行勾选可入库数据。
  3. 大表格中每行挂载多个重量级输入组件。
  4. 汇总行对全量数据重复做统计计算。

其中,优先级最高、最值得首先处理的是前两项。

6. 修改目标

本次优化建议以“先止血,再优化体验”为原则,目标如下:

  • 将查询后的页面卡顿控制在可接受范围内。
  • 避免浏览器因大数据量渲染出现假死。
  • 保持现有业务流程基本不变。
  • 尽量复用项目现有分页、查询、表格处理模式。
  • 将改动范围控制在 PurchasePartsStorage 页面内部,避免影响其他模块。

7. 修改方案

7.1 方案一:为采购件入库查询增加分页

这是首要方案。

修改思路

  • 为采购件入库表格引入与自制件入库一致的分页机制。
  • searchTable1() 中调用 CreateData() 时补充分页参数。
  • 页面新增采购件入库对应的分页组件与分页状态。
  • 后端查询过程若已支持分页,则直接接入。
  • 后端若尚未支持分页,需要同步补充分页查询能力。

预期收益

  • 避免一次性返回几百或几千条数据。
  • 大幅降低首屏渲染压力。
  • 为后续汇总优化、选择优化提供基础。

风险点

  • 需要确认后端 仓储管理_采购入库合同明细_查询 是否支持分页返回 rows/total
  • 如果当前接口只返回普通数组,前后端都需要调整返回结构。

7.2 方案二:取消查询后自动全选所有可入库行

这是与分页并列的高优先级方案。

修改思路

  • 查询完成后不再自动执行 toggleRowSelection 遍历全表。
  • 保留手工勾选模式,由用户自主选择入库数据。
  • 如业务上确实需要批量选择,可增加单独按钮,例如“勾选当前页可入库项”。
  • 如仍需保留自动选择能力,建议限制为只处理当前页数据,而不是全量结果。

预期收益

  • 避免一次查询后产生大量同步 UI 更新。
  • 显著降低 Element 表格内部状态维护成本。
  • 使查询动作本身更纯粹,减少联动副作用。

风险点

  • 用户操作习惯会发生轻微变化。
  • 若一线人员依赖默认全选,需要补充一个显式批量勾选按钮作为替代。

7.3 方案三:降低表格每行组件数量

这是第二阶段优化方案。

修改思路

  • 默认以文本方式展示数值和货位。
  • 仅在用户点击某行或某单元格后切换为可编辑组件。
  • 或将数量、货位编辑能力迁移到弹窗/侧边表单中进行。

可选实现方式

  • 方式 A保留表格编辑但只对当前编辑行渲染 el-input-numberel-select
  • 方式 B表格只展示编辑统一在“设置货位/修改本次到货数”弹窗内完成。

预期收益

  • 大幅减少页面初次渲染和更新渲染的组件实例数。
  • 降低响应式系统负担。

风险点

  • 交互形式改变较大,需业务确认。
  • 改动量大于分页和取消自动全选。

7.4 方案四:优化汇总逻辑

这是辅助优化方案。

修改思路

  • 汇总只统计当前页数据,不统计全量数据。
  • 或在查询成功后一次性计算并缓存汇总结果,避免在渲染阶段多次 map + reduce
  • 对不必要展示汇总的列取消统计。

预期收益

  • 降低表格重渲染时的计算开销。
  • 对大页数据场景效果明显。

风险点

  • 需确认业务是否要求“全量合计”还是“当前页合计”。

7.5 方案五:收敛筛选联动查询,减少重复请求

这是体验优化方案。

修改思路

  • 将“切换筛选项即自动查询”改为“选择条件后点击查询按钮再执行”。
  • 对必须联动的下拉,仅查询下一级选项,不立即刷新大表。
  • 对输入型查询条件增加节流或按回车触发。

预期收益

  • 避免用户频繁切换条件时重复打接口和重复渲染。
  • 页面行为更可控。

风险点

  • 与当前“选择即查”的使用习惯不完全一致。

8. 推荐实施顺序

建议按以下顺序推进:

第一阶段:快速止血

目标是在不大改页面交互的前提下,尽快解决“查询卡死”。

建议执行:

  1. 采购件入库增加分页。
  2. 取消查询后自动全选。
  3. 采购件入库增加显式“勾选当前页可入库项”按钮,作为自动全选替代。

第二阶段:性能优化

目标是继续提升大数据场景下的流畅度。

建议执行:

  1. 优化汇总函数。
  2. 减少表格内 el-input-numberel-select 的常驻渲染数量。
  3. 调整筛选联动逻辑,减少重复请求。

第三阶段:体验收敛

目标是统一仓储大表页面的实现模式。

建议执行:

  1. 对采购件入库、自制件入库、外协到货的查询行为做统一规范。
  2. 明确哪些页签必须分页、哪些页签允许全量查。
  3. 统一表格汇总、批量勾选、行编辑的实现方式。

9. 建议的具体改动点

以下为建议修改点,不代表本次已经改动:

9.1 页面状态

PurchasePartsStorage/index.vue 中补充采购件入库分页状态,例如:

  • pageCurrentRK
  • pageSizeRK
  • totalRK

或直接复用现有命名体系,保持与页面其他分区一致。

9.2 查询方法

重点调整:

  • searchTable1()

建议:

  • 查询请求增加分页参数。
  • 查询结果改为接收分页结构。
  • 删除查询成功后的逐行 toggleRowSelection 自动勾选逻辑。

9.3 表格区域

采购件入库表格下方增加分页组件,行为对齐自制件入库分页实现。

9.4 批量选择逻辑

新增显式按钮:

  • “勾选当前页可入库”
  • “取消当前页勾选”

这样既能保留批量能力,也能避免查询完成后立即执行重计算。

9.5 汇总逻辑

重构:

  • getSummaries()
  • getSummaries1()

建议尽量减少重复遍历次数,并明确统计口径为“当前页合计”。

10. 验证方案

修改完成后建议按以下方式验证:

10.1 功能验证

  • 选择供应商后能正常查询采购件入库数据。
  • 切换合同后能正常刷新结果。
  • 分页切换后数据正确。
  • 手工勾选、批量勾选后入库功能正常。
  • 货位选择、数量输入、打印功能不受影响。

10.2 性能验证

  • 查询 50 条、100 条、300 条时页面响应是否明显改善。
  • 查询后页面是否仍出现长时间卡死。
  • 批量勾选当前页时是否可接受。
  • 输入数量、选择货位时是否仍然卡顿。

10.3 回归验证

  • 自制件入库页签行为不受影响。
  • 外协到货页签行为不受影响。
  • 入库单弹窗显示和合并逻辑不受影响。

11. 风险与注意事项

  • 若后端接口当前不支持分页,本次优化需要前后端联动处理。
  • 若业务习惯依赖“查询即默认勾选全部可入库项”,需要提前通知用户交互变更。
  • 若汇总口径从全量改为当前页,需业务确认是否接受。
  • 若后续计划继续扩展该页面,建议优先统一仓储大表的分页和编辑规范,避免重复出现同类问题。

12. 最终建议

推荐采用“先小改止血,再做结构优化”的策略:

  1. 先做采购件入库分页。
  2. 同时取消查询后的自动逐行全选。
  3. 再根据现场体验决定是否继续推进表格轻量化和汇总优化。

若只能先做一项,优先级最高的是:

  • searchTable1() 增加分页能力。

若可以同时做两项,最佳组合是:

  • 采购件入库分页。
  • 取消查询后自动勾选。

这两项组合最有希望直接解决当前“查询就卡页面崩溃”的核心问题。