From 7f58edd8ff6fdadbe7b1d15cf86ffe7b47dc4fe3 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期日, 20 九月 2026 11:17:50 +0800
Subject: [PATCH] fix: 领料台账添加序号;批号展出可用库存;可单个进行领料

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

diff --git a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
index cda3dd2..d066899 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
@@ -19,6 +19,10 @@
         <el-table-column align="center"
                          type="selection"
                          width="55" />
+        <el-table-column align="center"
+                         type="index"
+                         label="搴忓彿"
+                         width="60" />
         <el-table-column label="宸ュ簭鍚嶇О"
                          min-width="100">
           <template #default="{ row }">
@@ -63,11 +67,13 @@
                        multiple
                        collapse-tags
                        collapse-tags-indicator
+                       clearable
                        placeholder="璇烽�夋嫨鎵瑰彿"
-                       style="width: 100%;">
+                       style="width: 100%;"
+                       @change="val => handleBatchNoChange(row, val)">
               <el-option v-for="item in row.batchNoList"
                          :key="item"
-                         :label="item"
+                         :label="getBatchOptionLabel(row, item)"
                          :value="item" />
             </el-select>
           </template>
@@ -246,8 +252,13 @@
       stockQty: null,
       batchNo: [],
       batchNoList,
+      batchQtyMap: {},
     };
   };
+
+  // 鎵瑰彿閫夐」灞曠ず涓衡�滄壒鍙凤紙搴撳瓨鏁伴噺锛夆��
+  const getBatchOptionLabel = (row, batchNo) =>
+    `${batchNo}锛�${stripTrailingZeros(row.batchQtyMap?.[batchNo] ?? 0)}锛塦;
 
   const getProcessOptions = async () => {
     if (!props.orderRow?.id) return;
@@ -374,14 +385,7 @@
       // 鍏堟煡鍑哄簱瀛樹綑閲忓啀鍏ヨ〃锛屼繚璇侀娆℃墦寮�鍗冲睍绀猴紙rows 灏氭湭杞负鍝嶅簲寮忎唬鐞嗭紝
       // 鍏ヨ〃鍚庡啀鏀瑰師濮嬪璞′笉浼氳Е鍙戣鍥炬洿鏂帮級
       await loadStockQtyForRows(rows);
-      // 鎵撳紑棰嗘枡鍙拌处榛樿锛氳嚜鍔ㄩ�変腑绗竴涓彲鐢ㄦ壒鍙凤紝棰嗙敤鏁伴噺=闇�姹傛暟閲�
-      rows.forEach(row => {
-        const batchNoList = Array.isArray(row.batchNoList) ? row.batchNoList : [];
-        if (batchNoList.length > 0) {
-          row.batchNo = [batchNoList[0]];
-          row.pickQty = toNumber(row.demandedQuantity);
-        }
-      });
+      // 鎵撳紑棰嗘枡鍙拌处涓嶉粯璁ら�変腑鎵瑰彿锛氬彧鏈夋墜鍔ㄩ�夋嫨浜嗘壒鍙风殑琛屾墠浼氶鏂�
       materialTableData.value = rows;
     } finally {
       materialTableLoading.value = false;
@@ -403,12 +407,13 @@
     currentMaterialSelectRowIndex.value = -1;
   };
 
-  // 鎸夊瀷鍙锋眹鎬绘墍鏈夋壒娆$殑鍘熸枡鍙敤搴撳瓨浣欓噺
+  // 鎸夊瀷鍙锋眹鎬绘墍鏈夋壒娆$殑鍘熸枡鍙敤搴撳瓨浣欓噺锛屽苟璁板綍姣忎釜鎵瑰彿瀵瑰簲鐨勫簱瀛樻暟閲�
   const loadStockQtyForRows = async rows => {
     const modelIds = [
       ...new Set(rows.map(row => row.materialModelId).filter(Boolean)),
     ];
     const stockMap = new Map();
+    const batchQtyMap = new Map();
     await Promise.all(
       modelIds.map(async modelId => {
         try {
@@ -416,24 +421,34 @@
           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
-          );
+          const perBatch = {};
+          const total = list.reduce((sum, item) => {
+            const qty = toNumber(item?.qualitity ?? item?.quantity);
+            if (item?.batchNo) {
+              perBatch[item.batchNo] = roundQuantity(
+                toNumber(perBatch[item.batchNo]) + qty
+              );
+            }
+            return sum + qty;
+          }, 0);
           stockMap.set(modelId, roundQuantity(total));
+          batchQtyMap.set(modelId, perBatch);
         } catch (e) {
           stockMap.set(modelId, 0);
+          batchQtyMap.set(modelId, {});
         }
       })
     );
     rows.forEach(row => {
       if (!row.materialModelId) {
         row.stockQty = null;
+        row.batchQtyMap = {};
         return;
       }
       row.stockQty = stockMap.has(row.materialModelId)
         ? stockMap.get(row.materialModelId)
         : 0;
+      row.batchQtyMap = batchQtyMap.get(row.materialModelId) || {};
     });
   };
 
@@ -479,6 +494,17 @@
     row.technologyOperationId = process?.technologyOperationId;
   };
 
+  // 閫夋嫨鎵瑰彿鍗宠〃绀烘湰琛屾湰娆¢鏂欙細鑷姩甯﹀嚭鍓╀綑闇�棰嗘暟閲忥紱娓呯┖鎵瑰彿琛ㄧず鏈涓嶉鏂�
+  const handleBatchNoChange = (row, batchNo) => {
+    if (!Array.isArray(batchNo) || batchNo.length === 0) {
+      row.pickQty = 0;
+      return;
+    }
+    if (toNumber(row.pickQty) <= 0) {
+      row.pickQty = roundQuantity(row.remainingQty);
+    }
+  };
+
   const handleRequiredQtyChange = (row, val) => {
     const required = roundQuantity(val);
     row.demandedQuantity = required;
@@ -509,6 +535,7 @@
     row.unit = product.unit || product.measureUnit || "";
     row.batchNoList = Array.isArray(product.batchNoList) ? product.batchNoList : [];
     row.batchNo = [];
+    row.pickQty = 0;
     currentMaterialSelectRowIndex.value = -1;
     materialProductDialogVisible.value = false;
     loadStockQtyForRows([row]);

--
Gitblit v1.9.3