From a6baad20258a61d9ce9a786029ca4cb63a7c992e Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期二, 21 四月 2026 17:31:33 +0800
Subject: [PATCH] 优化出入库功能,新增对未完全入库和出库商品的检查,更新相关API接口以支持审批人字段的统一命名

---
 src/pages/inventoryManagement/scanIn/scanIn.submit.ts |   18 ++++----
 src/pages/inventoryManagement/scanOut/index.vue       |   44 +++++++++++++++++++++-
 src/pages/inventoryManagement/scanIn/index.vue        |   13 +++++-
 3 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/src/pages/inventoryManagement/scanIn/index.vue b/src/pages/inventoryManagement/scanIn/index.vue
index 6502574..f68ebd5 100644
--- a/src/pages/inventoryManagement/scanIn/index.vue
+++ b/src/pages/inventoryManagement/scanIn/index.vue
@@ -303,6 +303,11 @@
     item.operateQuantity = String(Math.max(0, n));
   };
 
+  const hasEditableInboundItems = computed(() => {
+    if (!recordList.value?.length) return false;
+    return recordList.value.some(item => !isFullyStocked(item));
+  });
+
   const formatCell = (item, row, idx) => {
     if (row.key === "index") {
       const v = item.index;
@@ -426,6 +431,10 @@
       modal.msgError("缂哄皯璁㈠崟淇℃伅锛岃閲嶆柊鎵爜");
       return;
     }
+    if (!hasEditableInboundItems.value) {
+      modal.msgError("璇ヤ骇鍝佸凡缁忓叏閮ㄥ叆搴�");
+      return;
+    }
     const salesLedgerProductList = buildSalesLedgerProductList(recordList.value);
     if (!hasAnyPositiveStockedQty(salesLedgerProductList)) {
       modal.msgError("璇疯嚦灏戝~鍐欎竴琛屽ぇ浜� 0 鐨勫叆搴撴暟閲�");
@@ -438,10 +447,10 @@
       return;
     }
     const runApi = currentSubmitConfig.runApi;
-    const inboundApproveUserIds = stockApproverNodes.value.map(node => node.userId).join(",");
+    const approveUserIds = stockApproverNodes.value.map(node => node.userId).join(",");
     const payload = currentSubmitConfig.payloadBuilder(
       salesLedgerProductList,
-      inboundApproveUserIds
+      approveUserIds
     );
     try {
       submitLoading.value = true;
diff --git a/src/pages/inventoryManagement/scanIn/scanIn.submit.ts b/src/pages/inventoryManagement/scanIn/scanIn.submit.ts
index e27145f..8e997e0 100644
--- a/src/pages/inventoryManagement/scanIn/scanIn.submit.ts
+++ b/src/pages/inventoryManagement/scanIn/scanIn.submit.ts
@@ -16,41 +16,41 @@
 
 type SubmitConfig = {
   runApi: (data: any) => Promise<any>;
-  payloadBuilder: (list: AnyRow[], inboundApproveUserIds: string) => any;
+  payloadBuilder: (list: AnyRow[], approveUserIds: string) => any;
 };
 
 export function createSubmitConfig(scanLedgerIdRef: AnyRef<string | number | null>) {
   const cfg: Record<string, SubmitConfig> = {
     [`${CONTRACT_KIND.sales}-${QUALITY_TYPE.qualified}`]: {
       runApi: scanInboundSales,
-      payloadBuilder: (list: AnyRow[], inboundApproveUserIds: string) => ({
+      payloadBuilder: (list: AnyRow[], approveUserIds: string) => ({
         salesLedgerId: scanLedgerIdRef.value,
         salesLedgerProductList: list,
-        inboundApproveUserIds,
+        approveUserIds,
       }),
     },
     [`${CONTRACT_KIND.sales}-${QUALITY_TYPE.unqualified}`]: {
       runApi: scanInboundSalesUnqualified,
-      payloadBuilder: (list: AnyRow[], inboundApproveUserIds: string) => ({
+      payloadBuilder: (list: AnyRow[], approveUserIds: string) => ({
         salesLedgerId: scanLedgerIdRef.value,
         salesLedgerProductList: list,
-        inboundApproveUserIds,
+        approveUserIds,
       }),
     },
     [`${CONTRACT_KIND.purchase}-${QUALITY_TYPE.qualified}`]: {
       runApi: scanInboundPurchase,
-      payloadBuilder: (list: AnyRow[], inboundApproveUserIds: string) => ({
+      payloadBuilder: (list: AnyRow[], approveUserIds: string) => ({
         purchaseLedgerId: scanLedgerIdRef.value,
         salesLedgerProductList: list,
-        inboundApproveUserIds,
+        approveUserIds,
       }),
     },
     [`${CONTRACT_KIND.purchase}-${QUALITY_TYPE.unqualified}`]: {
       runApi: scanInboundPurchaseUnqualified,
-      payloadBuilder: (list: AnyRow[], inboundApproveUserIds: string) => ({
+      payloadBuilder: (list: AnyRow[], approveUserIds: string) => ({
         purchaseLedgerId: scanLedgerIdRef.value,
         salesLedgerProductList: list,
-        inboundApproveUserIds,
+        approveUserIds,
       }),
     },
   };
diff --git a/src/pages/inventoryManagement/scanOut/index.vue b/src/pages/inventoryManagement/scanOut/index.vue
index e5ef746..8359451 100644
--- a/src/pages/inventoryManagement/scanOut/index.vue
+++ b/src/pages/inventoryManagement/scanOut/index.vue
@@ -188,8 +188,7 @@
 
         </view>
 
-        <view
-
+        <view v-if="!isFullyOutbound(item)"
               class="stocked-qty-block">
 
           <view class="kv-row stocked-qty-row">
@@ -512,6 +511,43 @@
 
   };
 
+  const parseUnqualifiedInboundQty = item => {
+    return (
+      parseOptionalNumber(
+        item?.unqualifiedStockedQuantity ??
+          item?.unQualifiedStockedQuantity ??
+          item?.unqualifiedStockedQty ??
+          item?.unqualifiedInboundQuantity
+      ) ?? 0
+    );
+  };
+
+  const parseUnqualifiedOutboundQty = item => {
+    return (
+      parseOptionalNumber(
+        item?.unqualifiedShippedQuantity ??
+          item?.unQualifiedShippedQuantity ??
+          item?.unqualifiedShippedQty ??
+          item?.unqualifiedOutboundQuantity
+      ) ?? 0
+    );
+  };
+
+  const isFullyOutbound = item => {
+    if (type.value === QUALITY_TYPE.unqualified) {
+      return parseUnqualifiedInboundQty(item) - parseUnqualifiedOutboundQty(item) <= 0;
+    }
+    const remaining = parseOptionalNumber(item?.remainingShippedQuantity);
+    if (remaining !== null) return remaining <= 0;
+    const fallback = parseOptionalNumber(defaultStockedQuantityFromRow(item, "outbound"));
+    return fallback !== null ? fallback <= 0 : false;
+  };
+
+  const hasEditableOutboundItems = computed(() => {
+    if (!recordList.value?.length) return false;
+    return recordList.value.some(item => !isFullyOutbound(item));
+  });
+
 
 
   const formatCell = (item, row, idx) => {
@@ -634,6 +670,10 @@
       return;
 
     }
+    if (!hasEditableOutboundItems.value) {
+      modal.msgError("璇ヤ骇鍝佸凡缁忓叏閮ㄥ嚭搴�");
+      return;
+    }
 
     const salesLedgerProductList = buildSalesLedgerProductList(recordList.value);
 

--
Gitblit v1.9.3