From e2972be372af5c368891afea0512264aec263e7a Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 02 七月 2026 14:42:08 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' of http://114.132.189.42:9002/r/product-inventory-management into dev_NEW_pro

---
 src/views/financialManagement/receivable/receipt.vue       |   71 +++++++++++++++++++++++++++++++++--
 src/views/financialManagement/receivable/outputInvoice.vue |   12 +++---
 src/views/salesManagement/returnOrder/index.vue            |   22 +++++++++++
 3 files changed, 94 insertions(+), 11 deletions(-)

diff --git a/src/views/financialManagement/receivable/outputInvoice.vue b/src/views/financialManagement/receivable/outputInvoice.vue
index e5c8bf8..effb0af 100644
--- a/src/views/financialManagement/receivable/outputInvoice.vue
+++ b/src/views/financialManagement/receivable/outputInvoice.vue
@@ -93,7 +93,7 @@
       @confirm="submitForm"
       @cancel="closeDialog"
     >
-      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
+      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
         <el-row v-if="isView" :gutter="20">
           <el-col :span="12">
             <el-form-item label="鐘舵��">
@@ -178,7 +178,7 @@
           </el-col>
         </el-row>
         <el-row :gutter="20">
-          <el-col :span="8">
+          <el-col :span="10">
             <el-form-item label="閲戦(涓嶅惈绋�)" prop="amount">
               <el-input-number
                 v-model="form.amount"
@@ -190,14 +190,14 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="7">
             <el-form-item label="绋庨">
-              <el-input v-model="form.taxAmount" disabled />
+              <el-input v-model="form.taxAmount" style="width: 100%;" disabled />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="7">
             <el-form-item label="浠风◣鍚堣">
-              <el-input v-model="form.totalAmount" disabled />
+              <el-input v-model="form.totalAmount" style="width: 100%;" disabled />
             </el-form-item>
           </el-col>
         </el-row>
diff --git a/src/views/financialManagement/receivable/receipt.vue b/src/views/financialManagement/receivable/receipt.vue
index 467a368..29194e7 100644
--- a/src/views/financialManagement/receivable/receipt.vue
+++ b/src/views/financialManagement/receivable/receipt.vue
@@ -171,10 +171,10 @@
                           prop="amount">
               <el-input-number v-model="form.amount"
                                :min="0"
+                               :max="collectionAmountInputMax"
                                :precision="2"
                                style="width: 100%;"
-                               :disabled="isView"
-                               placeholder="鏍规嵁鍏宠仈鍗曟嵁鑷姩姹囨�伙紝鍙慨鏀�" />
+                               :disabled="isView" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -368,6 +368,7 @@
   const isEdit = ref(false);
   const isView = ref(false);
   const currentId = ref(null);
+  const originalReceiptAmount = ref(0);
   const submitLoading = ref(false);
 
   const customerList = ref([]);
@@ -406,6 +407,46 @@
     },
   });
 
+  const maxCollectionAmount = computed(() => {
+    const selected = form.stockOutRecordIds || [];
+    const editAmount = isEdit.value ? Number(originalReceiptAmount.value) || 0 : 0;
+    if (!selected.length) return isEdit.value ? editAmount : undefined;
+    const selectedValueSet = new Set(selected.map(id => String(id)));
+    const selectedOptions = outboundBatchOptions.value.filter(
+      opt => opt.amountLimitAvailable && selectedValueSet.has(String(opt.value))
+    );
+    if (selectedOptions.length !== selectedValueSet.size) {
+      return isEdit.value ? Number(editAmount.toFixed(2)) : undefined;
+    }
+    const sum = selectedOptions.reduce(
+      (acc, opt) => acc + (Number(opt.outboundAmount) || 0),
+      0
+    );
+    return Number((sum + editAmount).toFixed(2));
+  });
+
+  const collectionAmountInputMax = computed(
+    () => maxCollectionAmount.value ?? Number.MAX_SAFE_INTEGER
+  );
+
+  const validateCollectionAmount = (rule, value, callback) => {
+    if (value === undefined || value === null || value === "") {
+      callback();
+      return;
+    }
+    const amount = Number(value);
+    if (Number.isNaN(amount)) {
+      callback(new Error("璇疯緭鍏ユ敹娆鹃噾棰�"));
+      return;
+    }
+    const max = maxCollectionAmount.value;
+    if (max !== undefined && amount - max > 0.000001) {
+      callback(new Error(`鏀舵閲戦涓嶈兘瓒呰繃${max.toFixed(2)}`));
+      return;
+    }
+    callback();
+  };
+
   const rules = {
     customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
     stockOutRecordIds: [
@@ -420,7 +461,10 @@
     receiptDate: [
       { required: true, message: "璇烽�夋嫨鏀舵鏃ユ湡", trigger: "change" },
     ],
-    amount: [{ required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" }],
+    amount: [
+      { required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" },
+      { validator: validateCollectionAmount, trigger: ["blur", "change"] },
+    ],
     receiptMethod: [
       { required: true, message: "璇烽�夋嫨鏀舵鏂瑰紡", trigger: "change" },
     ],
@@ -480,7 +524,12 @@
     return list.map((item, index) => {
       if (typeof item === "string" || typeof item === "number") {
         const text = String(item);
-        return { label: text, value: text, outboundAmount: 0 };
+        return {
+          label: text,
+          value: text,
+          outboundAmount: 0,
+          amountLimitAvailable: false,
+        };
       }
       const label =
         item.outboundBatches ??
@@ -490,10 +539,15 @@
         item.label ??
         `鍑哄簱鍗�${index + 1}`;
       const value = item.id ?? item.stockOutRecordId ?? label;
+      const outboundAmount = Number(item.outboundAmount) || 0;
+      const amountReceived = Number(item.amountReceived) || 0;
+      const availableAmount = outboundAmount - amountReceived;
       return {
         label: String(label),
         value,
-        outboundAmount: (Number(item.outboundAmount)-Number(item.amountReceived)) || 0,
+        outboundAmount:
+          availableAmount > 0 ? Number(availableAmount.toFixed(2)) : 0,
+        amountLimitAvailable: true,
       };
     });
   };
@@ -541,6 +595,7 @@
         label: String(id),
         value: id,
         outboundAmount: 0,
+        amountLimitAvailable: false,
       });
     });
   };
@@ -643,6 +698,7 @@
     outboundSelectVisible.value = false;
     syncCollectionAmount();
     formRef.value?.validateField("stockOutRecordIds");
+    formRef.value?.validateField("amount");
   };
 
   const handleOutboundDialogClosed = () => {
@@ -713,6 +769,7 @@
     outboundSelectVisible.value = false;
     isView.value = false;
     isEdit.value = false;
+    originalReceiptAmount.value = 0;
   };
 
   const handleExport = () => {
@@ -772,6 +829,7 @@
     isEdit.value = false;
     isView.value = false;
     dialogTitle.value = "鏂板鏀舵";
+    originalReceiptAmount.value = 0;
     Object.assign(form, {
       receiptCode: "",
       customerId: "",
@@ -794,13 +852,16 @@
     currentId.value = row.id;
     dialogTitle.value = "缂栬緫鏀舵";
     fillFormFromRow(row);
+    originalReceiptAmount.value = Number(form.amount || 0);
     dialogVisible.value = true;
+    loadOutboundBatches(form.customerId, true);
   };
 
   const view = row => {
     isView.value = true;
     isEdit.value = false;
     dialogTitle.value = "鏌ョ湅鏀舵";
+    originalReceiptAmount.value = 0;
     fillFormFromRow(row);
     dialogVisible.value = true;
   };
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index 0a8257b..e190901 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -38,6 +38,9 @@
         <template #status="{ row }">
           <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
         </template>
+        <template #stockInApprovalStatus="{ row }">
+          <el-tag :type="getStockInApprovalStatusType(row.stockInApprovalStatus)">{{ getStockInApprovalStatusText(row.stockInApprovalStatus) }}</el-tag>
+        </template>
       </PIMTable>
     </div>
     <form-dia ref="formDia" @close="handleQuery" />
@@ -114,6 +117,7 @@
 const defaultColumns = [
   { label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: 160 },
   { label: "鍗曟嵁鐘舵��", prop: "status", minWidth: 90, dataType: "slot", slot: "status" },
+  { label: "鍏ュ簱瀹℃壒鐘舵��", prop: "stockInApprovalStatus", minWidth: 120, dataType: "slot", slot: "stockInApprovalStatus" },
   { label: "鍒跺崟鏃堕棿", prop: "makeTime", minWidth: 170 },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: 220 },
   { label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
@@ -207,6 +211,24 @@
   return statusMap[status] || "鏈煡";
 };
 
+const getStockInApprovalStatusType = (status) => {
+  const statusMap = {
+    0: "",
+    1: "success",
+    2: "warning"
+  };
+  return statusMap[status] || "info";
+};
+
+const getStockInApprovalStatusText = (status) => {
+  const statusMap = {
+    0: "鏈鎵�",
+    1: "宸插鎵�",
+    2: "瀹℃壒涓�"
+  };
+  return statusMap[status] || "鏈煡";
+};
+
 onMounted(() => {
   getList();
 });

--
Gitblit v1.9.3