perf(stocktake): 去掉库位树的全展开渲染,并为推荐查询补索引

业务反馈切到抽盘面板与点【获取推荐】时卡顿。实测定位:

【真正的原因在前端】先跑 EXPLAIN ANALYZE 排除了后端 ——
推荐查询在当前数据量下仅耗时 1.3ms,全走 Seq Scan + Hash Join,
Buffers shared hit=161 全部命中缓存。所以卡顿来自 DOM:
el-tree 原先带 default-expand-all,会把全库 3371 个库位节点一次性铺进 DOM。

去掉 default-expand-all 后初始只渲染根节点。勾选状态与 getCheckedNodes
不受影响 —— el-tree 的 Node store 会预先构建全树,展开与否只影响 DOM。

【索引仍补上,但说明白】实测 pg_indexes:stock_* 三表的 warehouse_location
已有索引,但 trans_outbound / trans_borrow 只有主键,时间字段与
(source_table, stock_id) JOIN 键都缺;三张库存表的时间字段也缺。
新增迁移 add_active_location_indexes.sql 补 7 个索引。

诚实说明写在迁移头部:当前数据量下加索引后本查询**仍会走 Seq Scan**,
这是小表下的正确计划,索引是为 90 天/半年后的数据增长做前瞻,不是修当前的慢。

【loading 状态】treeLoading / recLoading 已在既有实现中就位并闭环在
try/finally 中,分别绑在 el-tree 的 v-loading 与【获取推荐】按钮的 :loading 上,
本轮复核确认,未做无谓改名。

实测: 索引后执行计划仍为 Seq Scan,Execution Time 0.769ms(预期内)
This commit is contained in:
yueli
2026-09-11 14:38:40 +08:00
parent 0b82609c55
commit d1694bf245
2 changed files with 57 additions and 1 deletions

View File

@ -134,6 +134,10 @@
<div class="scope-hint">
💡 提示勾选父级货架将自动涵盖其下属的所有末级库位及库存
</div>
<!-- 刻意不写 default-expand-all全库 3371 个库位节点一次性铺进
DOM 是切到本面板时卡顿的主因默认折叠后初始只渲染根节点
勾选状态与 getCheckedNodes 仍作用于完整数据el-tree Node
store 会预先构建全树展开与否只影响 DOM 渲染 -->
<el-tree
ref="locTreeRef"
v-loading="treeLoading"
@ -141,7 +145,6 @@
:data="locTreeData"
node-key="full_path"
show-checkbox
default-expand-all
:props="{ label: 'name', children: 'children' }"
@check="syncSelectedPaths"
/>