Browse Source

perf:优化发货单类型为不定向订单的大量物品清单加载逻辑

xieyong 22 hours ago
parent
commit
54d5a59c77

+ 25 - 2
src/components/addDoc/main.vue

@@ -115,6 +115,12 @@
         tableList: [],
         type: 'add',
         cacheKeyUrl: 'eom-addDoc-main',
+        // 懒渲染模式(表格行内大量挂载本组件):created 阶段不请求列配置。
+        // 否则每挂载一个实例就会打一次 getByTableId,表格里挂 N 行就是 N 次请求洪水,
+        // 会把浏览器同源连接池打满(实测发货单 50 行 → 150 次请求,单请求耗时从 0.4s 堆到 20s)。
+        // 改为真正 open() 弹框时才取一次。
+        // 非懒渲染场景保持原行为(created 即取列配置)。
+        tabMixinsInit: !this.lazyRender,
         columns: [
           {
             label: '编码',
@@ -185,18 +191,35 @@
         ]
       };
     },
-    created() {},
+    created() {
+      // 列配置加载的 promise 守卫(非响应式,避免把 Promise 塞进 data)
+      this.tabColumnsPromise = null;
+    },
 
     methods: {
-      open(fileId, type) {
+      async open(fileId, type) {
         //查看详情:view 新增:add
         this.showEditFlag = true;
         this.fileId = fileId || [];
         if (type) {
           this.type = type;
         }
+        // 懒渲染模式:created 阶段没取列配置,这里真正打开时补取一次
+        if (this.lazyRender) {
+          await this.ensureTabColumns();
+        }
         this.init();
       },
+      // 懒渲染模式下按需加载列配置:同一实例只请求一次,并发调用共享同一个 promise
+      async ensureTabColumns() {
+        if (!this.lazyRender) return;
+        if (!this.tabColumnsPromise) {
+          this.tabColumnsPromise = this.getTabColumns().catch((e) => {
+            console.warn('[addDoc] 获取列配置失败:', e);
+          });
+        }
+        await this.tabColumnsPromise;
+      },
       openFileList(type) {
         if (this.disabled) return;
         this.fileShow = true;

+ 2 - 1
src/views/saleManage/saleOrder/invoice/components/addInvoiceDialog.vue

@@ -768,7 +768,8 @@
             this.$refs.inventoryTableref &&
               this.$refs.inventoryTableref.putTableValue(
                 data.productList,
-                true
+                true,
+                'edit'
               );
             this.$refs.stowageTableRef &&
               this.$refs.stowageTableRef.putTableValue(data.carList);

File diff suppressed because it is too large
+ 846 - 401
src/views/saleManage/saleOrder/invoice/components/inventoryTable.vue


+ 10 - 2
src/views/saleManage/saleOrder/invoice/components/product-listNew.vue

@@ -363,9 +363,17 @@ import tabMixins from '@/mixins/tableColumnsMixin';
         if (!this.selection.length) {
           return this.$message.warning('请至少选择一条数据');
         }
-        this.$emit('changeParent', this.selection);
-
+        const selection = this.selection;
+        // 先关弹框,再等浏览器把关闭动画画出来,最后才做回显计算,
+        // 避免回显和弹框关闭动画抢主线程(与销售订单的选品弹窗保持一致)
         this.visible = false;
+        this.$nextTick(() => {
+          requestAnimationFrame(() => {
+            requestAnimationFrame(() => {
+              this.$emit('changeParent', selection);
+            });
+          });
+        });
       }
     }
   };

Some files were not shown because too many files changed in this diff