From f383d3f8212e77a45bd6e99b0a4f8b7566f8339c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期日, 05 七月 2026 11:25:07 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' into dev_pro_山西长治

---
 src/api/procurementManagement/procurementLedger.js                                             |    8 
 src/components/ProcessParamListDialog.vue                                                      |   12 
 src/views/salesManagement/receiptPaymentLedger/index.vue                                       |   14 +
 src/views/salesManagement/returnOrder/components/detailDia.vue                                 |   20 +
 src/views/financialManagement/receivable/receipt.vue                                           |   71 +++++
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue |    2 
 src/views/salesManagement/returnOrder/index.vue                                                |   38 +++
 src/views/financialManagement/receivable/salesReturn.vue                                       |   24 ++
 src/views/procurementManagement/paymentLedger/index.vue                                        |   16 +
 src/api/financialManagement/invoiceApply.js                                                    |   11 
 src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js                 |   12 
 src/views/procurementManagement/procurementLedger/index.vue                                    |    6 
 src/views/salesManagement/returnOrder/components/formDia.vue                                   |  137 ++++++++--
 src/views/procurementManagement/purchaseReturnOrder/New.vue                                    |   97 +++++++-
 src/views/procurementManagement/purchaseReturnOrder/index.vue                                  |   60 +++-
 src/views/inventoryManagement/stockManagement/Record.vue                                       |    2 
 src/views/procurementManagement/purchaseReturnOrder/ProductList.vue                            |   13 
 src/views/financialManagement/receivable/outputInvoice.vue                                     |  131 ++++++++--
 src/views/financialManagement/payable/purchaseReturn.vue                                       |   24 ++
 19 files changed, 577 insertions(+), 121 deletions(-)

diff --git a/src/api/financialManagement/invoiceApply.js b/src/api/financialManagement/invoiceApply.js
index a567d1c..8806bbc 100644
--- a/src/api/financialManagement/invoiceApply.js
+++ b/src/api/financialManagement/invoiceApply.js
@@ -56,4 +56,13 @@
     url: `/accountInvoiceApplication/deleteAccountInvoiceApplication?${query}`,
     method: "delete",
   });
-}
\ No newline at end of file
+}
+
+/** 鏍规嵁瀹㈡埛id鏌ヨ寮�绁ㄧ敵璇峰彴璐� */
+export function getAccountInvoiceApplicationList(query) {
+  return request({
+    url: '/accountInvoiceApplication/getAccountInvoiceApplicationList',
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/procurementManagement/procurementLedger.js b/src/api/procurementManagement/procurementLedger.js
index 88f4ce0..c389582 100644
--- a/src/api/procurementManagement/procurementLedger.js
+++ b/src/api/procurementManagement/procurementLedger.js
@@ -9,6 +9,14 @@
     params: query,
   });
 }
+// 閲囪喘閫�璐у彲閫夐噰璐彴璐�
+export function purchaseReturnableList(query) {
+  return request({
+    url: "/purchase/ledger/returnableList",
+    method: "get",
+    params: query,
+  });
+}
 // 鏌ヨ鍚堝悓鍙�
 export function getSalesNo(query) {
   return request({
diff --git a/src/components/ProcessParamListDialog.vue b/src/components/ProcessParamListDialog.vue
index deee249..5af24bb 100644
--- a/src/components/ProcessParamListDialog.vue
+++ b/src/components/ProcessParamListDialog.vue
@@ -372,7 +372,14 @@
       size: paramPage.value.size,
     }).then(res => {
       if (res.code === 200) {
-        filteredParamList.value = res.data?.records || [];
+        const existingParamIds = new Set(
+          (props.paramList || [])
+            .map(item => Number(item.paramId || item.technologyOperationParamId))
+            .filter(id => Number.isFinite(id) && id > 0)
+        );
+        filteredParamList.value = (res.data?.records || []).filter(
+          item => !existingParamIds.has(Number(item.id))
+        );
         paramPage.value.total = res.data.total || 0;
       } else {
         ElMessage.error(res.msg || "鏌ヨ澶辫触");
@@ -402,7 +409,6 @@
       addProcessRouteItemParamOrder({
         productionOrderId: Number(props.orderId),
         productionOrderRoutingOperationId: props.process.id,
-        technologyRoutingOperationParamId: props.process.id,
         paramId: selectedParam.value.id,
         standardValue: selectedParam.value.standardValue || "",
         isRequired: selectedParam.value.isRequired || 0,
@@ -667,4 +673,4 @@
   .detail-text {
     font-weight: 500;
   }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/financialManagement/payable/purchaseReturn.vue b/src/views/financialManagement/payable/purchaseReturn.vue
index 4171df2..5c274ac 100644
--- a/src/views/financialManagement/payable/purchaseReturn.vue
+++ b/src/views/financialManagement/payable/purchaseReturn.vue
@@ -85,6 +85,30 @@
   { label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
   { label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
   { label: "鍏宠仈鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
+  {
+    label: "鍙戣揣绫诲瀷",
+    prop: "shippingType",
+    minWidth: "110",
+    formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+  },
+  {
+    label: "鍙戣揣杞︾墝鍙�",
+    prop: "truckPlateNo",
+    minWidth: "140",
+    formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+  },
+  {
+    label: "蹇�掑叕鍙�",
+    prop: "expressCompany",
+    minWidth: "140",
+    formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+  },
+  {
+    label: "蹇�掑崟鍙�",
+    prop: "expressNo",
+    minWidth: "150",
+    formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+  },
   { label: "閫�璐ф棩鏈�", prop: "preparedAt", minWidth: "170" },
   {
     label: "閫�娆炬�婚",
diff --git a/src/views/financialManagement/receivable/outputInvoice.vue b/src/views/financialManagement/receivable/outputInvoice.vue
index 22cc202..effb0af 100644
--- a/src/views/financialManagement/receivable/outputInvoice.vue
+++ b/src/views/financialManagement/receivable/outputInvoice.vue
@@ -37,7 +37,7 @@
       <div class="actions">
         <div></div>
         <div>
-          <!-- <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button> -->
+          <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button>
           <el-button type="success" @click="handleExport" icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
@@ -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="鐘舵��">
@@ -111,13 +111,25 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="瀹㈡埛" prop="customerId">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isView">
+              <el-select @change="checkCustomer" v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isView">
                 <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍏宠仈寮�绁ㄧ敵璇�" prop="accountInvoiceApplicationId">
+              <el-select v-model="form.accountInvoiceApplicationId"
+                        placeholder="璇峰厛閫夋嫨瀹㈡埛"
+                        readonly
+                         @change="selectionApply"
+                        :disabled="!form.customerId || isView"
+                        class="outbound-batch-select">
+                <el-option v-for="(item,index) in applyList" :key="index" :label="item.invoiceApplicationNo" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="寮�绁ㄦ棩鏈�" prop="invoiceDate">
               <el-date-picker
@@ -130,14 +142,15 @@
               />
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
               <el-select
-                v-model="form.invoiceType"
-                placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
-                style="width: 100%;"
-                :disabled="isView"
-                @change="handleInvoiceTypeChange"
+                  v-model="form.invoiceType"
+                  placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
+                  style="width: 100%;"
+                  :disabled="isView"
               >
                 <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="澧炲�肩◣涓撶敤鍙戠エ" />
                 <el-option label="澧炲�肩◣鏅�氬彂绁�" value="澧炲�肩◣鏅�氬彂绁�" />
@@ -145,8 +158,6 @@
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
               <el-select
@@ -154,7 +165,7 @@
                 placeholder="璇烽�夋嫨绋庣巼"
                 style="width: 100%;"
                 :disabled="isView"
-                @change="calculateTax"
+                @change="handleTaxRateChange"
               >
                 <el-option
                   v-for="dict in tax_rate"
@@ -167,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"
@@ -175,18 +186,18 @@
                 :precision="2"
                 style="width: 100%;"
                 :disabled="isView"
-                @change="calculateTax"
+                @change="handleTaxRateChange"
               />
             </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>
@@ -224,6 +235,7 @@
   cancelAccountSalesInvoice,
   deleteAccountSalesInvoice,
 } from "@/api/financialManagement/accountSalesInvoice.js";
+import {getAccountInvoiceApplicationList} from "@/api/financialManagement/invoiceApply.js";
 
 const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
@@ -271,6 +283,9 @@
 const fileDialogVisible = ref(false);
 const currentRecordId = ref(0);
 
+const applySelectVisible = ref(false);
+const applyList = ref([]);
+
 const openFileDialog = (row) => {
   if (!row.accountInvoiceApplicationId) {
     ElMessage.warning("鏈叧鑱斿紑绁ㄧ敵璇凤紝鏃犳硶鏌ョ湅闄勪欢");
@@ -313,17 +328,88 @@
   totalAmount: 0,
   content: "",
   remark: "",
+  deptId: undefined,
   accountInvoiceApplicationId: undefined,
   storageAttachmentId: undefined,
 });
 
 const rules = {
   invoiceNo: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿鐮�", trigger: "blur" }],
+  accountInvoiceApplicationId: [{ required: true, message: "璇烽�夋嫨寮�绁ㄧ敵璇�", trigger: "change" }],
   customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
   invoiceDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
   invoiceType: [{ required: true, message: "璇烽�夋嫨鍙戠エ绫诲瀷", trigger: "change" }],
   taxRate: [{ required: true, message: "璇烽�夋嫨绋庣巼", trigger: "change" }],
   amount: [{ required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur" }],
+};
+
+// 閫夋嫨瀹㈡埛
+const checkCustomer = (val) =>{
+  loadApplyList(val);
+}
+
+//鏌ヨ寮�绁ㄧ敵璇峰垪琛�
+const loadApplyList = (customerId) => {
+  if (!customerId) {
+    applyList.value = [];
+    return Promise.resolve();
+  }
+  return getAccountInvoiceApplicationList({ customerId })
+      .then(res => {
+        if (res.code === 200) {
+          const list = res.data?.records ?? res.data ?? [];
+          applyList.value = Array.isArray(list) ? list : [];
+        } else {
+          applyList.value = [];
+        }
+      })
+      .catch(() => {
+        applyList.value = [];
+      })
+};
+
+const selectionApply = (val)=>{
+  const applyObj = applyList.value.find(item=>item.id === val);
+  if(!applyObj){
+    ElMessage.warning("璇烽�夋嫨鍏宠仈鐨勫紑绁ㄧ敵璇�");
+    return;
+  }
+  form.remark = applyObj.remark;
+  form.content = applyObj.invoiceContent;
+  form.invoiceDate = applyObj.applyDate;
+  form.invoiceType = applyObj.invoiceType;
+  form.deptId = applyObj.deptId;
+  form.taxRate = applyObj.taxRate;
+  form.totalAmount = applyObj.invoiceAmount
+  handleTaxRateChange();
+}
+
+/** 浠风◣鍚堣鍙樻洿锛氭寜绋庣巼鍙嶇畻涓嶅惈绋庨噾棰濄�佺◣棰� */
+const calculateTaxFromInclusive = (inclusiveTotal) => {
+  const total = Number(inclusiveTotal ?? form.totalAmount ?? 0);
+  if (total <= 0) {
+    form.amount = 0;
+    form.taxAmount = 0;
+    form.totalAmount = 0;
+    return;
+  }
+  const rate = Number(form.taxRate) / 100;
+  form.totalAmount = Number(total.toFixed(2));
+  form.amount = Number((form.totalAmount / (1 + rate)).toFixed(2));
+  form.taxAmount = Number((form.totalAmount - form.amount).toFixed(2));
+};
+
+const calculateTaxFromExclusive = () => {
+  form.taxAmount = Number((form.amount * form.taxRate / 100).toFixed(2));
+  form.totalAmount = Number((form.amount + form.taxAmount).toFixed(2));
+};
+
+const handleTaxRateChange = () => {
+  if (form.totalAmount > 0) {
+    calculateTaxFromInclusive(form.totalAmount);
+  } else {
+    calculateTaxFromExclusive();
+  }
 };
 
 const getSummaries = ({ columns, data }) => {
@@ -350,15 +436,6 @@
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
   return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
-};
-
-const calculateTax = () => {
-  form.taxAmount = Number((form.amount * form.taxRate / 100).toFixed(2));
-  form.totalAmount = Number((form.amount + form.taxAmount).toFixed(2));
-};
-
-const handleInvoiceTypeChange = () => {
-  calculateTax();
 };
 
 const normalizeTableRow = (row) => ({
@@ -506,6 +583,8 @@
 
 const closeDialog = () => {
   dialogVisible.value = false;
+  applySelectVisible.value = false;
+  isView.value = false;
   isView.value = false;
 };
 
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/financialManagement/receivable/salesReturn.vue b/src/views/financialManagement/receivable/salesReturn.vue
index afe363c..85153bf 100644
--- a/src/views/financialManagement/receivable/salesReturn.vue
+++ b/src/views/financialManagement/receivable/salesReturn.vue
@@ -77,6 +77,30 @@
   { label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: "180" },
   { label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: "150" },
+  {
+    label: "鍙戣揣绫诲瀷",
+    prop: "shippingType",
+    minWidth: "110",
+    formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+  },
+  {
+    label: "鍙戣揣杞︾墝鍙�",
+    prop: "truckPlateNo",
+    minWidth: "140",
+    formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+  },
+  {
+    label: "蹇�掑叕鍙�",
+    prop: "expressCompany",
+    minWidth: "140",
+    formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+  },
+  {
+    label: "蹇�掑崟鍙�",
+    prop: "expressNo",
+    minWidth: "150",
+    formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+  },
   { label: "閫�璐ф棩鏈�", prop: "makeTime", minWidth: "170" },
   {
     label: "閫�娆炬�婚",
diff --git a/src/views/inventoryManagement/stockManagement/Record.vue b/src/views/inventoryManagement/stockManagement/Record.vue
index 934ae06..9ee214c 100644
--- a/src/views/inventoryManagement/stockManagement/Record.vue
+++ b/src/views/inventoryManagement/stockManagement/Record.vue
@@ -46,7 +46,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <div>
+      <div style="display: flex; gap: 10px; flex-wrap: nowrap;">
         <el-button type="primary"
                    @click="isShowNewModal = true">鏂板搴撳瓨</el-button>
         <el-button type="info"
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index 58b612b..d057f16 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -50,7 +50,7 @@
             <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
             <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
             <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDate || "--" }}</el-descriptions-item>
             <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
             <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
             <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 25b6ae5..737e2de 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -310,7 +310,10 @@
     else if (row.businessType === 5) {
       const purchaseContractNumber = row?.purchaseContractNumber;
       if (purchaseContractNumber) {
-        const res = await getPurchaseByCode({ purchaseContractNumber });
+        const res = await getPurchaseByCode({
+          purchaseContractNumber,
+          approvalInstanceId: row?.id,
+        });
         detailData.value = res || {};
       }
     }
@@ -355,7 +358,10 @@
     else if (row.businessType === 5) {
       const purchaseContractNumber = row?.purchaseContractNumber;
       if (purchaseContractNumber) {
-        const res = await getPurchaseByCode({ purchaseContractNumber });
+        const res = await getPurchaseByCode({
+          purchaseContractNumber,
+          approvalInstanceId: row?.id,
+        });
         detailData.value = res || {};
       }
     }
@@ -699,4 +705,4 @@
     openApprove,
     fetchApprovalList,
   };
-}
\ No newline at end of file
+}
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..7fba9cb 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -46,6 +46,10 @@
                              prop="paymentAmount"
                              show-overflow-tooltip
                              :formatter="formattedNumber" />
+            <el-table-column label="閫�璐ч噾棰�(鍏�)"
+                             prop="returnAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber" />
             <el-table-column label="搴斾粯閲戦(鍏�)"
                              prop="payableAmount"
                              show-overflow-tooltip>
@@ -153,6 +157,14 @@
       },
     },
     {
+      label: "閫�璐ч噾棰�(鍏�)",
+      prop: "returnAmount",
+      width: 200,
+      formatData: params => {
+        return params ? parseFloat(params).toFixed(2) : 0;
+      },
+    },
+    {
       label: "搴斾粯閲戦(鍏�)",
       dataType: "slot",
       width: 200,
@@ -170,7 +182,7 @@
   const summarizeMainTable = param => {
     return proxy.summarizeTable(
       param,
-      ["contractAmounts", "paymentAmount", "payableAmount"],
+      ["contractAmounts", "paymentAmount", "returnAmount", "payableAmount"],
       {
         ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
         futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -181,7 +193,7 @@
   const summarizeMainTable1 = param => {
     let summarizeTable = proxy.summarizeTable(
       param,
-      ["contractAmount", "invoiceAmount", "paymentAmount"],
+      ["contractAmount", "invoiceAmount", "paymentAmount", "returnAmount"],
       {
         ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
         futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index ed7e5d9..7e1576b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -121,6 +121,8 @@
               </el-table-column>
               <el-table-column label="鏁伴噺"
                                prop="quantity" />
+              <el-table-column label="閿�鍞彂璐ф暟閲�"
+                               prop="shippedQuantity" />
               <el-table-column label="鍙敤鏁伴噺"
                                prop="availableQuality" />
               <el-table-column label="閫�璐ф暟閲�"
@@ -219,7 +221,7 @@
             <el-button link
                        type="primary"
                        @click="openForm('edit', scope.row)"
-                       :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
+                       :disabled="scope.row.approvalStatus === 3">缂栬緫
             </el-button>
             <el-button link
                        type="primary"
@@ -1747,7 +1749,7 @@
       return;
     }
     const ids = selectedRows.value.map((item) => item.id);
-    
+
     ElMessageBox.confirm("纭鎵归噺鐢熸垚鏁版嵁锛�", "鎵归噺鐢熸垚", {
       confirmButtonText: "纭",
       cancelButtonText: "鍙栨秷",
diff --git a/src/views/procurementManagement/purchaseReturnOrder/New.vue b/src/views/procurementManagement/purchaseReturnOrder/New.vue
index 9474b11..186a552 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/New.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/New.vue
@@ -58,6 +58,63 @@
         </el-form-item>
 
         <el-form-item
+            label="鍙戣揣绫诲瀷"
+            prop="shippingType"
+            :rules="[
+                {
+                  required: true,
+                  message: '璇烽�夋嫨鍙戣揣绫诲瀷',
+                  trigger: 'change',
+                }
+              ]"
+        >
+          <el-select
+              v-model="formState.shippingType"
+              placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
+              style="width: 240px"
+              @change="handleShippingTypeChange"
+          >
+            <el-option label="璐ц溅" :value="1" />
+            <el-option label="蹇��" :value="2" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item
+            v-if="formState.shippingType === 1"
+            label="鍙戣揣杞︾墝鍙�"
+            prop="truckPlateNo"
+        >
+          <el-input
+              v-model="formState.truckPlateNo"
+              placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
+              style="width: 240px"
+          />
+        </el-form-item>
+
+        <template v-else-if="formState.shippingType === 2">
+          <el-form-item
+              label="蹇�掑叕鍙�"
+              prop="expressCompany"
+          >
+            <el-input
+                v-model="formState.expressCompany"
+                placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
+                style="width: 240px"
+            />
+          </el-form-item>
+          <el-form-item
+              label="蹇�掑崟鍙�"
+              prop="expressNo"
+          >
+            <el-input
+                v-model="formState.expressNo"
+                placeholder="璇疯緭鍏ュ揩閫掑崟鍙�"
+                style="width: 240px"
+            />
+          </el-form-item>
+        </template>
+
+        <el-form-item
             label="渚涘簲鍟嗗悕绉�"
             prop="supplierId"
             :rules="[
@@ -259,13 +316,16 @@
               <el-table-column label="鏁伴噺"
                                prop="stockInNum"
                                width="100" />
+              <el-table-column label="閿�鍞彂璐ф暟閲�"
+                               prop="saleOutQuantity"
+                               width="120" />
                                <el-table-column label="鍙��璐ф暟閲�"
                                prop="unQuantity"
                                width="130" />
               <el-table-column label="宸查��璐ф暟閲�"
                                width="130">
                 <template #default="scope">
-                  {{ calcAlreadyReturned(scope.row) }}
+                  {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
                 </template>
               </el-table-column>
               <el-table-column label="閫�璐ф暟閲�"
@@ -420,7 +480,7 @@
 <script setup>
 import {ref, computed, getCurrentInstance, watch, defineAsyncComponent} from "vue";
 import {createPurchaseReturnOrder} from "@/api/procurementManagement/purchase_return_order.js";
-import {getOptions, purchaseList} from "@/api/procurementManagement/procurementLedger.js";
+import {getOptions, purchaseReturnableList} from "@/api/procurementManagement/procurementLedger.js";
 import {userListNoPageByTenantId} from "@/api/system/user.js";
 const ProductList = defineAsyncComponent(() => import("@/views/procurementManagement/purchaseReturnOrder/ProductList.vue"));
 const props = defineProps({
@@ -455,6 +515,10 @@
   no: '',
   isDefaultNo: true,
   returnType: 0,
+  shippingType: undefined,
+  truckPlateNo: '',
+  expressCompany: '',
+  expressNo: '',
   incomeType: undefined,
   remark: '',
   supplierId: undefined,
@@ -501,6 +565,19 @@
 // 鏄惁灞曠ず浜у搧鍒楄〃鏁版嵁
 const isShowProductsModal = ref(false)
 
+const handleShippingTypeChange = (val) => {
+  if (val === 1) {
+    formState.value.expressCompany = '';
+    formState.value.expressNo = '';
+  } else if (val === 2) {
+    formState.value.truckPlateNo = '';
+  } else {
+    formState.value.truckPlateNo = '';
+    formState.value.expressCompany = '';
+    formState.value.expressNo = '';
+  }
+};
+
 const isShow = computed({
   get() {
     return props.visible;
@@ -528,14 +605,6 @@
 const toNumber = (val) => {
   const num = Number(val)
   return Number.isNaN(num) ? 0 : num
-}
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
-  const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
-  const un = Number(row?.unQuantity ?? 0)
-  if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
-  return Math.max(total - un, 0)
 }
 
 const getReturnTotal = (row) => {
@@ -581,6 +650,10 @@
 }
 
 const closeModal = () => {
+  formState.value.shippingType = undefined;
+  formState.value.truckPlateNo = '';
+  formState.value.expressCompany = '';
+  formState.value.expressNo = '';
   isShow.value = false;
 };
 
@@ -674,7 +747,7 @@
 const fetchPurchaseLedgerOptions = () => {
   purchaseLedgerOptions.value = []
   if (formState.value.supplierId) {
-    purchaseList({supplierId: formState.value.supplierId,approvalStatus:3}).then((res) => {
+    purchaseReturnableList({ supplierId: formState.value.supplierId }).then((res) => {
       purchaseLedgerOptions.value = res.rows;
     });
   }
@@ -805,4 +878,4 @@
 }
 
 
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
index 27fae4a..9b3e6f7 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
@@ -34,13 +34,16 @@
           <el-table-column label="鏁伴噺"
                            prop="stockInNum"
                            width="70" />
+          <el-table-column label="閿�鍞彂璐ф暟閲�"
+                           prop="saleOutQuantity"
+                           width="120" />
           <el-table-column label="鍙��璐ф暟閲�"
                            prop="unQuantity"
                            width="130" />
           <el-table-column label="宸查��璐ф暟閲�"
                            width="130">
             <template #default="scope">
-              {{ calcAlreadyReturned(scope.row) }}
+              {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
             </template>
           </el-table-column>
           <!-- <el-table-column label="搴撳瓨棰勮鏁伴噺"
@@ -118,14 +121,6 @@
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
-  const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
-  const un = Number(row?.unQuantity ?? 0)
-  if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
-  return Math.max(total - un, 0)
-}
 
 const handleChangeSelection = (val) => {
   selectedRows.value = val;
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index f8866e1..2b73253 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -45,8 +45,13 @@
             @click="handleDetail(row)"
             >璇︽儏</el-button
           >
-          <el-button link size="small" @click="handleDelete(row)"
-            >鍒犻櫎</el-button
+          <el-button
+            link
+            size="small"
+            :disabled="row.stockOutApproved"
+            :style="{ color: row.stockOutApproved ? '#c0c4cc' : undefined }"
+            @click="handleDelete(row)"
+            >{{ row.stockOutApproved }}</el-button
           >
         </template>
       </PIMTable>
@@ -89,6 +94,20 @@
           <el-descriptions-item label="閫�鏂欎汉">{{
             detailData.returnUserName || "--"
           }}</el-descriptions-item>
+          <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+            getShippingTypeLabel(detailData.shippingType)
+          }}</el-descriptions-item>
+          <el-descriptions-item v-if="String(detailData.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{
+            detailData.truckPlateNo || "--"
+          }}</el-descriptions-item>
+          <template v-else-if="String(detailData.shippingType) === '2'">
+            <el-descriptions-item label="蹇�掑叕鍙�">{{
+              detailData.expressCompany || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑崟鍙�">{{
+              detailData.expressNo || "--"
+            }}</el-descriptions-item>
+          </template>
           <el-descriptions-item label="鏁村崟鎶樻墸棰�">{{
             formatAmount(detailData.totalDiscountAmount)
           }}</el-descriptions-item>
@@ -142,13 +161,14 @@
           />
           <el-table-column label="鍗曚綅" prop="unit" width="80" />
           <el-table-column label="鏁伴噺" prop="stockInNum" width="80" />
+          <el-table-column label="閿�鍞彂璐ф暟閲�" prop="saleOutQuantity" width="110" />
           <el-table-column label="鍙��璐ф暟閲�"
                            prop="unQuantity"
                            width="100" />
           <el-table-column label="宸查��璐ф暟閲�"
                            width="100">
             <template #default="scope">
-              {{ calcAlreadyReturned(scope.row) }}
+              {{ formatAmount(scope.row.totalReturnNum || 0) }}
             </template>
           </el-table-column>
           <!-- <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" /> -->
@@ -289,6 +309,15 @@
     prop: "returnUserName",
     width: 110,
   },
+  {
+    label: "鍙戣揣绫诲瀷",
+    prop: "shippingType",
+    width: 100,
+    formatData: (val) => getShippingTypeLabel(val),
+  },
+  { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", width: 140 },
+  { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", width: 140 },
+  { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", width: 150 },
 
   {
     label: "鏁村崟鎶樻墸棰�",
@@ -341,6 +370,7 @@
       },
       {
         name: "鍒犻櫎",
+        disabled: (row) => !!row.stockOutApproved,
         clickFun: (row) => {
           handleDelete(row);
         },
@@ -422,7 +452,12 @@
   findPurchaseReturnOrderListPage({ ...searchForm.value, ...page })
     .then((res) => {
       tableLoading.value = false;
-      tableData.value = res.data.records;
+      tableData.value = (res.data.records || []).map((row) => ({
+        ...row,
+        truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+        expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+        expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+      }));
       page.total = res.data.total;
     })
     .catch(() => {
@@ -450,6 +485,14 @@
   );
 };
 
+const getShippingTypeLabel = (value) => {
+  const shippingTypeMap = {
+    1: "璐ц溅",
+    2: "蹇��",
+  };
+  return shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
+};
+
 const formatAmount = (value) => {
   if (value === null || value === undefined || value === "") {
     return "--";
@@ -461,14 +504,6 @@
   return num.toFixed(2);
 };
 
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
-  const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0);
-  const un = Number(row?.unQuantity ?? 0);
-  if (!Number.isFinite(total) || !Number.isFinite(un)) return 0;
-  return Math.max(total - un, 0);
-};
-
 onMounted(() => {
   getList();
 });
@@ -478,4 +513,3 @@
   margin-top: unset;
 }
 </style>
-
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..a87a160 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -46,6 +46,11 @@
                              show-overflow-tooltip
                              :formatter="formattedNumber"
                              width="200" />
+            <el-table-column label="閫�璐ч噾棰�(鍏�)"
+                             prop="returnAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
             <el-table-column label="搴旀敹閲戦(鍏�)"
                              prop="receiptableAmount"
                              show-overflow-tooltip
@@ -93,6 +98,11 @@
                              width="200" />
             <el-table-column label="鍥炴閲戦(鍏�)"
                              prop="receiptPaymentAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
+            <el-table-column label="閫�璐ч噾棰�(鍏�)"
+                             prop="returnAmount"
                              show-overflow-tooltip
                              :formatter="formattedNumber"
                              width="200" />
@@ -180,7 +190,7 @@
   const summarizeMainTable = param => {
     return proxy.summarizeTable(
       param,
-      ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+      ["invoiceTotal", "receiptPaymentAmount", "returnAmount", "unReceiptPaymentAmount"],
       {
         ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
         futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -191,7 +201,7 @@
   const summarizeMainTable1 = param => {
     var summarizeTable = proxy.summarizeTable(
       param,
-      ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
+      ["contractAmount", "receiptPaymentAmount", "returnAmount", "receiptableAmount"],
       {
         ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
         futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index ecc663f..a09149f 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -11,6 +11,12 @@
         <el-descriptions-item label="閿�鍞崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
         <el-descriptions-item label="涓氬姟鍛�">{{ detail.salesman }}</el-descriptions-item>
         <el-descriptions-item label="鍏宠仈鍙戣揣鍗曞彿">{{ detail.shippingNo }}</el-descriptions-item>
+        <el-descriptions-item label="鍙戣揣绫诲瀷">{{ getShippingTypeText(detail.shippingType) }}</el-descriptions-item>
+        <el-descriptions-item v-if="String(detail.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{ detail.truckPlateNo || "--" }}</el-descriptions-item>
+        <template v-else-if="String(detail.shippingType) === '2'">
+          <el-descriptions-item label="蹇�掑叕鍙�">{{ detail.expressCompany || "--" }}</el-descriptions-item>
+          <el-descriptions-item label="蹇�掑崟鍙�">{{ detail.expressNo || "--" }}</el-descriptions-item>
+        </template>
         <!-- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item> -->
         <el-descriptions-item label="鍒跺崟浜�">{{ detail.maker }}</el-descriptions-item>
         <el-descriptions-item label="鍒跺崟鏃堕棿">{{ detail.makeTime }}</el-descriptions-item>
@@ -21,9 +27,6 @@
       <div style="padding-top: 20px">
         <span class="descriptions">浜у搧鍒楄〃</span>
         <PIMTable :isShowPagination="false" rowKey="id" :column="tableColumn" :tableData="tableData">
-          <template #totalReturnNum="{ row }">
-            {{ calcAlreadyReturned(row) }}
-          </template>
         </PIMTable>
       </div>
     </div>
@@ -44,6 +47,10 @@
 const detail = ref({});
 const tableData = ref([]);
 const availableProducts = ref([]);
+const shippingTypeMap = {
+  1: "璐ц溅",
+  2: "蹇��",
+};
 
 const sameKey = (a, b) => a != null && b != null && String(a) === String(b);
 
@@ -113,6 +120,8 @@
   if (!Number.isFinite(total) || !Number.isFinite(un)) return 0;
   return Math.max(total - un, 0);
 };
+
+const getShippingTypeText = (value) => shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
 
 /** 璇︽儏琛ㄧ敤 productName / model锛涘悎骞舵椂鍕胯绌轰覆鐩栨帀鍑哄簱琛屽瓧娈� */
 const mergeDetailProductRow = (product, normalized) => {
@@ -252,8 +261,9 @@
   {align: "center", label: "瑙勬牸鍨嬪彿", prop: "model"},
   {align: "center", label: "鍗曚綅", prop: "unit", width: 80},
   {align: "center", label: "鎬绘暟閲�", prop: "stockOutNum", width: 120},
-  {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120, dataType: "slot", slot: "totalReturnNum"},
+  {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120},
   {align: "center", label: "鏈��璐ф暟閲�", prop: "unQuantity", width: 120},
+  {align: "center", label: "寰呭鐞嗛��璐ф暟閲�", prop: "pendingReturnNum", width: 120},
   {align: "center", label: "閫�璐ф暟閲�", prop: "returnQuantity", width: 120},
   {align: "center", label: "閫�璐т骇鍝佸崟浠�", prop: "price", width: 120},
   {align: "center", label: "閫�璐т骇鍝侀噾棰�", prop: "amount", width: 120},
@@ -284,7 +294,7 @@
   try {
     const res = await returnManagementGetById({ returnManagementId: row.id });
     detail.value = res?.data ?? res ?? {};
-    
+
     if (detail.value.shippingId) {
       const productRes = await returnManagementGetByShippingId({ shippingId: detail.value.shippingId });
       if (productRes.code === 200) {
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 81d9487..4fc0859 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -69,6 +69,31 @@
               </el-form-item>
             </el-col>
             <el-col :span="4">
+              <el-form-item label="鍙戣揣绫诲瀷锛�" prop="shippingType">
+                <el-select v-model="form.shippingType" placeholder="璇烽�夋嫨鍙戣揣绫诲瀷" @change="handleShippingTypeChange">
+                  <el-option label="璐ц溅" :value="1" />
+                  <el-option label="蹇��" :value="2" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="4" v-if="form.shippingType === 1">
+              <el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="truckPlateNo">
+                <el-input v-model="form.truckPlateNo" placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿" />
+              </el-form-item>
+            </el-col>
+            <template v-else-if="form.shippingType === 2">
+              <el-col :span="4">
+                <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
+                  <el-input v-model="form.expressCompany" placeholder="璇疯緭鍏ュ揩閫掑叕鍙�" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="4">
+                <el-form-item label="蹇�掑崟鍙凤細" prop="expressNo">
+                  <el-input v-model="form.expressNo" placeholder="璇疯緭鍏ュ揩閫掑崟鍙�" />
+                </el-form-item>
+              </el-col>
+            </template>
+            <el-col :span="4">
               <el-form-item label="閫�娆炬�婚锛�" prop="refundAmount">
                 <el-input v-model="form.refundAmount" disabled placeholder="鑷姩璁$畻" />
               </el-form-item>
@@ -82,32 +107,29 @@
             <el-button type="primary" @click="openProductSelection" :disabled="!form.shippingId">娣诲姞浜у搧</el-button>
           </div>
           <PIMTable :isShowPagination="false" rowKey="id" :column="tableColumn" :tableData="tableData">
-            <template #totalReturnNum="{ row }">
-              {{ calcAlreadyReturned(row) }}
-            </template>
             <template #returnQuantity="{ row }">
-              <el-input 
-                v-model="row.returnQuantity" 
-                style="width:100px" 
-                placeholder="璇疯緭鍏�" 
+              <el-input
+                v-model="row.returnQuantity"
+                style="width:100px"
+                placeholder="璇疯緭鍏�"
                 type="number"
                 @input="(val) => handleReturnQuantityChange(val, row)"
               />
             </template>
             <template #price="{ row }">
-              <el-input 
-                v-model="row.price" 
-                style="width:100px" 
-                placeholder="璇疯緭鍏�" 
+              <el-input
+                v-model="row.price"
+                style="width:100px"
+                placeholder="璇疯緭鍏�"
                 type="number"
                 @input="(val) => handlePriceChange(val, row)"
               />
             </template>
             <template #amount="{ row }">
-              <el-input 
-                v-model="row.amount" 
-                style="width:100px" 
-                placeholder="鑷姩璁$畻" 
+              <el-input
+                v-model="row.amount"
+                style="width:100px"
+                placeholder="鑷姩璁$畻"
                 type="number"
                 disabled
               />
@@ -119,10 +141,10 @@
               </el-select>
             </template>
             <template #remark="{ row }">
-              <el-input 
-                v-model="row.remark" 
-                style="width:130px" 
-                placeholder="璇疯緭鍏�" 
+              <el-input
+                v-model="row.remark"
+                style="width:130px"
+                placeholder="璇疯緭鍏�"
               />
             </template>
             <template #action="{ index }">
@@ -140,9 +162,9 @@
     </el-dialog>
 
     <el-dialog v-model="productSelectionVisible" title="閫夋嫨浜у搧" width="70%" append-to-body>
-      <el-table 
-        :data="availableProducts" 
-        style="width: 100%" 
+      <el-table
+        :data="availableProducts"
+        style="width: 100%"
         @selection-change="handleSelectionChange"
         ref="productTableRef"
         row-key="id"
@@ -154,11 +176,9 @@
         <el-table-column align="center" prop="specificationModel" label="瑙勬牸鍨嬪彿" />
         <el-table-column align="center" prop="unit" label="鍗曚綅" />
         <el-table-column align="center" prop="stockOutNum" label="鎬绘暟閲�" />
+        <el-table-column align="center" label="宸查��璐ф暟閲�" prop="totalReturnNum"></el-table-column>
         <el-table-column align="center" prop="unQuantity" label="鏈��璐ф暟閲�" />
-        <el-table-column align="center" label="宸查��璐ф暟閲�">
-          <template #default="{ row }">{{ calcAlreadyReturned(row) }}</template>
-        </el-table-column>
-
+        <el-table-column align="center" prop="pendingReturnNum" label="寰呭鐞嗛��璐ф暟閲�" />
       </el-table>
       <template #footer>
         <div class="dialog-footer">
@@ -191,6 +211,10 @@
     returnNo: "",
     customerId: "",
     shippingId: "",
+    shippingType: "",
+    truckPlateNo: "",
+    expressCompany: "",
+    expressNo: "",
     projectId: "",
     maker: "",
     makeTime: "",
@@ -208,6 +232,7 @@
     }],
     customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
     shippingId: [{ required: true, message: "璇烽�夋嫨鍏宠仈鍑哄簱鍗曞彿", trigger: "change" }],
+    shippingType: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
   }
 });
 const { form, rules } = toRefs(data);
@@ -226,7 +251,8 @@
   {align: "center", label: "瑙勬牸鍨嬪彿", prop: "specificationModel" },
   {align: "center", label: "鍗曚綅", prop: "unit", width: 80 },
   {align: "center", label: "鎬绘暟閲�", prop: "stockOutNum", width: 120 },
-  {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120, dataType: "slot", slot: "totalReturnNum" },
+  {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120 },
+  {align: "center", label: "寰呭鐞嗛��璐ф暟閲�", prop: "pendingReturnNum", width: 120 },
   {align: "center", label: "鏈��璐ф暟閲�", prop: "unQuantity", width: 120 },
   {align: "center", label: "閫�璐ф暟閲�", prop: "returnQuantity", dataType: "slot", slot: "returnQuantity", width: 120 },
   {align: "center", label: "閫�璐т骇鍝佸崟浠�", prop: "price", dataType: "slot", slot: "price", width: 120 },
@@ -495,6 +521,10 @@
       returnNo: "",
       customerId: "",
       shippingId: "",
+      shippingType: "",
+      truckPlateNo: "",
+      expressCompany: "",
+      expressNo: "",
       projectId: "",
       maker: "",
       makeTime: "",
@@ -541,6 +571,11 @@
     const payload = { ...form.value, returnSaleProducts };
     delete payload.returnNoCheckbox;
     if (operationType.value === "add" && form.value.returnNoCheckbox) delete payload.returnNo;
+    if (payload.shippingType !== 1) payload.truckPlateNo = "";
+    if (payload.shippingType !== 2) {
+      payload.expressCompany = "";
+      payload.expressNo = "";
+    }
     if (operationType.value === "add") {
       returnManagementAdd(payload).then(() => {
         proxy.$modal.msgSuccess("鏂板鎴愬姛");
@@ -559,6 +594,22 @@
   proxy.resetForm("formRef");
   dialogFormVisible.value = false;
   emit('close');
+  data.form = {
+        returnNoCheckbox: true,
+        returnNo: "",
+        customerId: "",
+        shippingId: "",
+        shippingType: "",
+        truckPlateNo: "",
+        expressCompany: "",
+        expressNo: "",
+        projectId: "",
+        maker: "",
+        makeTime: "",
+        status: 0,
+        returnReason: "",
+        refundAmount: "",
+  }
 };
 
 const initCustomers = async () => {
@@ -595,13 +646,26 @@
   formRef.value?.validateField('returnNo');
 };
 
+const handleShippingTypeChange = (val) => {
+  if (val === 1) {
+    form.value.expressCompany = "";
+    form.value.expressNo = "";
+  } else if (val === 2) {
+    form.value.truckPlateNo = "";
+  } else {
+    form.value.truckPlateNo = "";
+    form.value.expressCompany = "";
+    form.value.expressNo = "";
+  }
+};
+
 const customerNameChange = async (val, clearDownstream = true) => {
   // val is customerId now
   if (clearDownstream) {
     form.value.shippingId = "";
     outboundOptions.value = [];
   }
-  
+
   // Find customer name for getSalesLedger if it requires name
   const customer = customerNameOptions.value.find(c => c.id === val);
   if (!customer) return;
@@ -609,7 +673,7 @@
   // Assuming getSalesLedger takes customerName. If it takes ID, adjust accordingly.
   // Previous code used customerName. Let's try passing customerName.
   getSalesLedger({
-    customerName: customer.label, 
+    customerName: customer.label,
   }).then(res => {
     if(res.code === 200){
       outboundOptions.value = res.data.map(item => ({
@@ -626,7 +690,7 @@
   if(res.code === 200){
     // If backend returns project info, set it
     if (res.data.projectId) form.value.projectId = res.data.projectId;
-    
+
     availableProducts.value = mergeShippingProductLists(res.data);
     if (clearTable) tableData.value = [];
   }
@@ -634,9 +698,12 @@
 
 const handleReturnQuantityChange = (val, row) => {
   if (val === "" || val === null) return;
-  const max = row.unQuantity === undefined || row.unQuantity === null ? Infinity : Number(row.unQuantity || 0);
+  const unQuantity = row.unQuantity === undefined || row.unQuantity === null ? Infinity : Number(row.unQuantity || 0);//鏈��璐ф暟閲�
+  const pendingReturnNum = row.pendingReturnNum === undefined || row.pendingReturnNum === null ? Infinity : Number(row.pendingReturnNum || 0);//寰呭鐞嗛��璐ф暟閲�
+  //鏈�澶ч��璐ф暟閲忥紝濡傛灉涓虹紪杈戠姸鎬佸姞涓婂緟澶勭悊閫�璐ф暟閲�
+  const max = operationType.value === 'edit' ? unQuantity + pendingReturnNum : unQuantity
   const current = Number(val);
-  
+
   if (current > max) {
     proxy.$nextTick(() => {
       row.returnQuantity = max;
@@ -702,7 +769,7 @@
 // Removed checkSelectable to allow toggling existing items
 const confirmProductSelection = () => {
   const newTableData = [];
-  
+
   selectedProducts.value.forEach(product => {
     const existing = tableData.value.find(item => item.id === product.id);
     if (existing) {
@@ -710,7 +777,7 @@
     } else {
       newTableData.push({
         ...product,
-        returnSaleLedgerProductId: product.id, 
+        returnSaleLedgerProductId: product.id,
         productModelId: product.productModelId,
         returnQuantity: 0,
         num: 0,
@@ -728,7 +795,7 @@
       });
     }
   });
-  
+
   tableData.value = newTableData;
   productSelectionVisible.value = false;
 };
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index 0a8257b..1bcda4d 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,11 +117,21 @@
 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 },
   { label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
   { label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: 170 },
+  {
+    label: "鍙戣揣绫诲瀷",
+    prop: "shippingType",
+    minWidth: 100,
+    formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+  },
+  { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", minWidth: 140 },
+  { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", minWidth: 140 },
+  { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", minWidth: 150 },
   { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
   { label: "鍒跺崟浜�", prop: "maker", minWidth: 120 },
   {
@@ -164,7 +177,12 @@
   tableLoading.value = true;
   returnManagementList({ ...searchForm.value, ...page }).then(res => {
     tableLoading.value = false;
-    tableData.value = res?.data?.records || [];
+    tableData.value = (res?.data?.records || []).map((row) => ({
+      ...row,
+      truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+      expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+      expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+    }));
     page.total = res?.data?.total || 0;
   }).finally(() => tableLoading.value = false);
 };
@@ -207,6 +225,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