From 33889fd272af7d58870ebff56959184a3798ce31 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 02 九月 2026 16:25:50 +0800
Subject: [PATCH] feat: 领料台账添加库存余量列展示

---
 src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
index 739facb..ca25853 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
@@ -80,6 +80,13 @@
                              @change="val => handleRequiredQtyChange(row, val)" />
           </template>
         </el-table-column>
+        <el-table-column label="搴撳瓨浣欓噺"
+                         min-width="90">
+          <template #default="{ row }">
+            <span v-if="row.stockQty === null">-</span>
+            <span v-else>{{ stripTrailingZeros(row.stockQty) }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="宸查鏁伴噺"
                          min-width="90">
           <template #default="{ row }">
@@ -145,6 +152,7 @@
   import { ElMessage } from "element-plus";
   import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
   import { findProductProcessRouteItemList } from "@/api/productionManagement/productProcessRoute.js";
+  import { getStockInventoryByModelId } from "@/api/inventoryManagement/stockInventory.js";
   import {
     listMaterialPickingDetail,
     listMaterialPickingBom,
@@ -222,6 +230,7 @@
       returnedQty,
       remainingQty,
       pickQty: 0,
+      stockQty: null,
       batchNo: [],
       batchNoList,
     };
@@ -349,6 +358,9 @@
           })
         );
       });
+      // 鍏堟煡鍑哄簱瀛樹綑閲忓啀鍏ヨ〃锛屼繚璇侀娆℃墦寮�鍗冲睍绀猴紙rows 灏氭湭杞负鍝嶅簲寮忎唬鐞嗭紝
+      // 鍏ヨ〃鍚庡啀鏀瑰師濮嬪璞′笉浼氳Е鍙戣鍥炬洿鏂帮級
+      await loadStockQtyForRows(rows);
       materialTableData.value = rows;
     } finally {
       materialTableLoading.value = false;
@@ -367,6 +379,40 @@
   const handleClose = () => {
     materialTableData.value = [];
     currentMaterialSelectRowIndex.value = -1;
+  };
+
+  // 鎸夊瀷鍙锋眹鎬绘墍鏈夋壒娆$殑鍘熸枡鍙敤搴撳瓨浣欓噺
+  const loadStockQtyForRows = async rows => {
+    const modelIds = [
+      ...new Set(rows.map(row => row.materialModelId).filter(Boolean)),
+    ];
+    const stockMap = new Map();
+    await Promise.all(
+      modelIds.map(async modelId => {
+        try {
+          const res = await getStockInventoryByModelId(modelId);
+          const list = Array.isArray(res?.data)
+            ? res.data
+            : res?.data?.records || res?.data?.rows || [];
+          const total = list.reduce(
+            (sum, item) => sum + toNumber(item?.qualitity ?? item?.quantity),
+            0
+          );
+          stockMap.set(modelId, roundQuantity(total));
+        } catch (e) {
+          stockMap.set(modelId, 0);
+        }
+      })
+    );
+    rows.forEach(row => {
+      if (!row.materialModelId) {
+        row.stockQty = null;
+        return;
+      }
+      row.stockQty = stockMap.has(row.materialModelId)
+        ? stockMap.get(row.materialModelId)
+        : 0;
+    });
   };
 
   const handleAddMaterialRow = () => {
@@ -416,6 +462,7 @@
     row.batchNo = [];
     currentMaterialSelectRowIndex.value = -1;
     materialProductDialogVisible.value = false;
+    loadStockQtyForRows([row]);
   };
 
   const validateMaterialRows = () => {

--
Gitblit v1.9.3