From cd0ca5e12922699cb2be51e99f8a7fc88eff5032 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 20 四月 2026 14:30:34 +0800
Subject: [PATCH] feat: 添加销售台账入库状态校验功能,确保未入库明细无法发货

---
 src/views/salesManagement/salesLedger/index.vue |  101 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 94 insertions(+), 7 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 61251e2..6a71d8a 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1815,7 +1815,11 @@
 
   const buildLedgerQrCompositeDataUrl = row =>
     new Promise((resolve, reject) => {
-      const payload = JSON.stringify({ id: row.id });
+      const payload = JSON.stringify({
+        id: row.id,
+        salesContractNo: (row.salesContractNo ?? "").trim(),
+        type: "XS",
+      });
       QRCode.toDataURL(payload, { width: 220, margin: 2 })
         .then(qrDataUrl => {
           const contract = (row.salesContractNo ?? "").trim() || "鈥�";
@@ -1885,7 +1889,7 @@
     if (!ledgerQrCompositeUrl.value) return;
     const a = document.createElement("a");
     a.href = ledgerQrCompositeUrl.value;
-    a.download = `閿�鍞攢鍞鍗曚簩缁寸爜-${ledgerQrDownloadBaseName.value}.png`;
+    a.download = `閿�鍞彴璐︿簩缁寸爜-${ledgerQrDownloadBaseName.value}.png`;
     a.click();
   };
 
@@ -2837,7 +2841,7 @@
       const res = await productList({ salesLedgerId: id, type: 1 });
       stockProductList.value = [];
       stockProductList.value =
-        res.data.filter(item => item.productStockStatus == 0) || [];
+        res.data.filter(item => item.productStockStatus == 0 || item.productStockStatus == 1) || [];
     } catch (e) {
       proxy?.$modal?.msgError?.("鑾峰彇浜у搧鍒楄〃澶辫触");
     } finally {
@@ -3776,6 +3780,13 @@
       } else {
         const res = await getProcessCard(selectedId);
         const processCardData = res?.data ?? {};
+        // 琛ラ綈浜岀淮鐮佹墍闇�鐨勫彴璐︽爣璇嗭紙鍚庣鏁版嵁鏈夋椂涓嶅甫 id锛�
+        if (processCardData && typeof processCardData === "object") {
+          processCardData.salesLedgerId = processCardData.salesLedgerId ?? selectedId;
+          processCardData.salesContractNo =
+            (processCardData.salesContractNo ?? "").trim() ||
+            String(selectedRow?.salesContractNo ?? "").trim();
+        }
         const routeNodes = processCardData?.routeNodes;
         const isProcessRouteEmpty =
           !Array.isArray(routeNodes) || routeNodes.length === 0;
@@ -3794,9 +3805,9 @@
           } catch {
             return;
           }
-          printFinishedProcessCard(processCardData);
+          await printFinishedProcessCard(processCardData);
         } else {
-          printFinishedProcessCard(processCardData);
+          await printFinishedProcessCard(processCardData);
         }
       }
     } catch (error) {
@@ -4213,6 +4224,40 @@
     return statusStr === "寰呭彂璐�" || statusStr === "瀹℃牳鎷掔粷";
   };
 
+  const getLedgerDisplayName = ledger =>
+    String(ledger?.salesContractNo || "").trim() ||
+    String(ledger?.projectName || "").trim() ||
+    `ID:${ledger?.id ?? "-"}`;
+
+  const validateLedgersStockedBeforeDelivery = async ledgers => {
+    const invalidLedgers = [];
+    for (const ledger of ledgers || []) {
+      const ledgerId = ledger?.id;
+      const ledgerName = getLedgerDisplayName(ledger);
+      if (!ledgerId) {
+        invalidLedgers.push(`${ledgerName}(缂哄皯鍙拌处ID)`);
+        continue;
+      }
+      let products = [];
+      try {
+        const res = await productList({ salesLedgerId: ledgerId, type: 1 });
+        products = Array.isArray(res?.data) ? res.data : [];
+      } catch (e) {
+        invalidLedgers.push(`${ledgerName}(鏄庣粏鍔犺浇澶辫触)`);
+        continue;
+      }
+      const unstockedProducts = products.filter(
+        item => Number(item?.productStockStatus) !== 2
+      );
+      if (unstockedProducts.length > 0) {
+        invalidLedgers.push(
+          `${ledgerName}(鏈叏閮ㄥ叆搴�${unstockedProducts.length}鏉�)`
+        );
+      }
+    }
+    return invalidLedgers;
+  };
+
   const handleBulkDelivery = async () => {
     if (selectedRows.value.length === 0) {
       proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
@@ -4221,7 +4266,7 @@
 
     // 鍙厑璁搞�愭湭鍙戣揣/瀹℃壒澶辫触銆戣繘鍏ュ彂璐ф祦绋�
     const statusItem = selectedRows.value[0].deliveryStatus;
-    const isTrue = true;
+    let isTrue = true;
     selectedRows.value.forEach(row => {
       if (row.deliveryStatus != 1 && row.deliveryStatus != 3) {
         proxy.$modal.msgWarning("浠呮湭鍙戣揣鎴栧鎵瑰け璐ョ殑鍙拌处鍙互鍙戣揣");
@@ -4235,6 +4280,29 @@
       }
     });
     if (!isTrue) {
+      return;
+    }
+
+    proxy.$modal.loading("姝e湪鏍¢獙鏄庣粏鍏ュ簱鐘舵�侊紝璇风◢鍊�...");
+    const invalidLedgers = await validateLedgersStockedBeforeDelivery(
+      selectedRows.value
+    );
+    proxy.$modal.closeLoading();
+    if (invalidLedgers.length > 0) {
+      try {
+        await ElMessageBox.alert(
+          `浠ヤ笅閿�鍞彴璐﹀瓨鍦ㄦ湭鍏ㄩ儴鍏ュ簱鐨勬槑缁嗭紝鏆備笉鍙彂璐э細\n${invalidLedgers.join(
+            "\n"
+          )}`,
+          "鎻愮ず",
+          {
+            type: "warning",
+            confirmButtonText: "鐭ラ亾浜�",
+          }
+        );
+      } catch {
+        /* 鍏抽棴寮圭獥 */
+      }
       return;
     }
 
@@ -4354,7 +4422,7 @@
   };
 
   // 鎵撳紑鍙戣揣寮规锛堝崟鏉★級
-  const openDeliveryForm = row => {
+  const openDeliveryForm = async row => {
     // 鍙厑璁搞�愭湭鍙戣揣/瀹℃壒澶辫触銆戝彂璐э紱宸插彂璐�/瀹℃壒涓笉鍏佽
     const status = Number(row.deliveryStatus);
     if (status !== 1 && status !== 3) {
@@ -4362,6 +4430,25 @@
       return;
     }
 
+    proxy.$modal.loading("姝e湪鏍¢獙鏄庣粏鍏ュ簱鐘舵�侊紝璇风◢鍊�...");
+    const invalidLedgers = await validateLedgersStockedBeforeDelivery([row]);
+    proxy.$modal.closeLoading();
+    if (invalidLedgers.length > 0) {
+      try {
+        await ElMessageBox.alert(
+          `褰撳墠閿�鍞彴璐﹀瓨鍦ㄦ湭鍏ㄩ儴鍏ュ簱鐨勬槑缁嗭紝鏆備笉鍙彂璐э細\n${invalidLedgers[0]}`,
+          "鎻愮ず",
+          {
+            type: "warning",
+            confirmButtonText: "鐭ラ亾浜�",
+          }
+        );
+      } catch {
+        /* 鍏抽棴寮圭獥 */
+      }
+      return;
+    }
+
     currentDeliveryRows.value = [row];
     deliveryForm.value = {
       type: "璐ц溅",

--
Gitblit v1.9.3