From db76255e483a8829c3c79e752fa0538c9b226289 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期一, 29 六月 2026 16:07:34 +0800
Subject: [PATCH]  完善采购台账功能,新增入库管控与模板导入能力

---
 src/pages/procurementManagement/procurementLedger/index.vue  |   29 +++
 src/api/procurementManagement/procurementLedger.js           |   20 ++
 src/pages/procurementManagement/procurementLedger/view.vue   |   32 +++
 src/pages/procurementManagement/procurementLedger/detail.vue |  359 +++++++++++++++++++++++++++++++++-----------
 4 files changed, 333 insertions(+), 107 deletions(-)

diff --git a/src/api/procurementManagement/procurementLedger.js b/src/api/procurementManagement/procurementLedger.js
index 5c0bb83..4eb71bf 100644
--- a/src/api/procurementManagement/procurementLedger.js
+++ b/src/api/procurementManagement/procurementLedger.js
@@ -73,6 +73,24 @@
   });
 }
 
+// 鏌ヨ閲囪喘妯℃澘鍒楄〃
+export function getPurchaseTemplateList(query) {
+  return request({
+    url: "/purchase/ledger/getPurchaseTemplateList",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏍规嵁閿�鍞悎鍚屽彿锛坰alesLedgerId锛夊鍏ヤ骇鍝�
+export function getProductInfoByContractNo(query) {
+  return request({
+    url: "/purchase/ledger/getProductBySalesNo",
+    method: "get",
+    params: query,
+  });
+}
+
 // 鏌ヨ閲囪喘璇︽儏
 export function getPurchaseByCode(query) {
   return request({
@@ -88,4 +106,4 @@
         method: 'get',
         params: query,
     })
-}
\ No newline at end of file
+}
diff --git a/src/pages/procurementManagement/procurementLedger/detail.vue b/src/pages/procurementManagement/procurementLedger/detail.vue
index 397d863..656972b 100644
--- a/src/pages/procurementManagement/procurementLedger/detail.vue
+++ b/src/pages/procurementManagement/procurementLedger/detail.vue
@@ -15,18 +15,18 @@
                   placeholder="鑷姩鐢熸垚"
                   disabled />
       </up-form-item>
-      <up-form-item label="閿�鍞悎鍚屽彿"
-                    prop="salesContractNo"
-                    required>
-        <up-input v-model="form.salesContractNo"
+      <up-form-item v-if="showSalesContractBinding"
+                    label="閿�鍞悎鍚屽彿"
+                    prop="salesLedgerId">
+        <up-input v-model="salesContractNoText"
+                  placeholder="鐐瑰嚮閫夋嫨閿�鍞悎鍚屽彿"
                   readonly
                   :disabled="isReadOnly"
-                  @click="!isReadOnly && (showPicker = true)"
-                  placeholder="鐐瑰嚮閫夋嫨閿�鍞悎鍚屽彿" />
+                  @click="!isReadOnly && openSalesContractPicker()" />
         <template #right>
           <up-icon name="arrow-right"
                    v-if="!isReadOnly"
-                   @click="showPicker = true"></up-icon>
+                   @click="openSalesContractPicker()"></up-icon>
         </template>
       </up-form-item>
       <up-form-item label="渚涘簲鍟嗗悕绉�"
@@ -81,6 +81,19 @@
                   placeholder="璇疯緭鍏�"
                   disabled />
       </up-form-item>
+      <up-form-item label="鍏ュ簱鐘舵��"
+                    prop="stockInStatus">
+        <up-input v-model="form.stockInStatus"
+                  placeholder="--"
+                  disabled />
+      </up-form-item>
+      <up-form-item label="澶囨敞"
+                    prop="remarks">
+        <up-textarea v-model="form.remarks"
+                     placeholder="璇疯緭鍏ュ娉�"
+                     auto-height
+                     :disabled="isReadOnly" />
+      </up-form-item>
       <up-popup :show="showTimePicker"
                 mode="bottom"
                 @close="showTimePicker = false">
@@ -90,18 +103,24 @@
                             @cancel="showTimePicker = false"
                             mode="date" />
       </up-popup>
-      <!-- 閿�鍞悎鍚屽彿閫夋嫨 -->
-      <up-action-sheet :show="showPicker"
-                       :actions="salesContractActionList"
-                       title="閫夋嫨閿�鍞悎鍚屽彿"
-                       @select="onSalesmanSelect"
-                       @close="showPicker = false" />
       <!-- 渚涘簲鍟嗛�夋嫨 -->
       <up-action-sheet :show="showCustomerPicker"
                        :actions="supplierActionList"
                        title="閫夋嫨渚涘簲鍟�"
                        @select="onCustomerSelect"
                        @close="showCustomerPicker = false" />
+      <!-- 妯℃澘閫夋嫨 -->
+      <up-action-sheet :show="showTemplatePicker"
+                       :actions="templateActionList"
+                       title="閫夋嫨妯℃澘"
+                       @select="onTemplateSelect"
+                       @close="showTemplatePicker = false" />
+      <!-- 閿�鍞悎鍚屽彿閫夋嫨 -->
+      <up-action-sheet :show="showSalesContractPicker"
+                       :actions="salesContractActionList"
+                       title="閫夋嫨閿�鍞悎鍚屽彿"
+                       @select="onSalesContractSelect"
+                       @close="showSalesContractPicker = false" />
       <!-- 浜у搧澶х被閫夋嫨鍣� -->
       <up-popup :show="showCategoryPicker"
                 mode="bottom">
@@ -166,7 +185,7 @@
             </view>
             <!-- 鎿嶄綔鎸夐挳 -->
             <view class="product-actions"
-                  v-if="canEditProducts">
+                  v-if="canEditProducts && canEditProductRow(product)">
               <up-button type="error"
                          size="mini"
                          @click="removeProduct(idx)"
@@ -185,11 +204,11 @@
               <up-input v-model="product.productCategory"
                         readonly
                         placeholder="璇烽�夋嫨"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         @click="openCategoryPicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         v-if="canEditProducts"
+                         v-if="canEditProducts && canEditProductRow(product)"
                          @click="openCategoryPicker(idx)"></up-icon>
               </template>
             </up-form-item>
@@ -201,11 +220,11 @@
               <up-input v-model="product.specificationModel"
                         readonly
                         placeholder="璇烽�夋嫨"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         @click="openSpecificationPicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         v-if="canEditProducts"
+                         v-if="canEditProducts && canEditProductRow(product)"
                          @click="openSpecificationPicker(idx)"></up-icon>
               </template>
             </up-form-item>
@@ -215,7 +234,7 @@
                           required
                           :rules="productRules">
               <up-input v-model="product.unit"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�" />
             </up-form-item>
             <!-- 绋庣巼 -->
@@ -226,11 +245,11 @@
               <up-input v-model="product.taxRate"
                         readonly
                         placeholder="璇烽�夋嫨"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         @click="openTaxRatePicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         v-if="canEditProducts"
+                         v-if="canEditProducts && canEditProductRow(product)"
                          @click="openTaxRatePicker(idx)"></up-icon>
               </template>
             </up-form-item>
@@ -241,7 +260,7 @@
                           :rules="productRules">
               <up-input v-model="product.taxInclusiveUnitPrice"
                         type="number"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�"
                         @blur="formatTaxPrice(idx)" />
             </up-form-item>
@@ -252,7 +271,7 @@
                           :rules="productRules">
               <up-input v-model="product.quantity"
                         type="number"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�"
                         @blur="formatAmount(idx)" />
             </up-form-item>
@@ -263,7 +282,7 @@
                           :rules="productRules">
               <up-input v-model="product.taxInclusiveTotalPrice"
                         type="number"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�"
                         @blur="formatTaxTotal(idx)" />
             </up-form-item>
@@ -274,9 +293,15 @@
                           :rules="productRules">
               <up-input v-model="product.taxExclusiveTotalPrice"
                         type="number"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�"
                         @blur="formatNoTaxTotal(idx)" />
+            </up-form-item>
+            <up-form-item label="鍏ュ簱瀹℃牳鐘舵��"
+                          prop="stockInApprovalStatus">
+              <up-input v-model="product.stockInApprovalStatus"
+                        placeholder="--"
+                        disabled />
             </up-form-item>
             <!-- 鍙戠エ绫诲瀷 -->
             <up-form-item label="鍙戠エ绫诲瀷"
@@ -286,11 +311,11 @@
               <up-input v-model="product.invoiceType"
                         readonly
                         placeholder="璇烽�夋嫨"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         @click="openInvoiceTypePicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         v-if="canEditProducts"
+                         v-if="canEditProducts && canEditProductRow(product)"
                          @click="openInvoiceTypePicker(idx)"></up-icon>
               </template>
             </up-form-item>
@@ -301,7 +326,7 @@
                           :rules="productRules">
               <up-input v-model="product.warnNum"
                         type="number"
-                        :disabled="!canEditProducts"
+                        :disabled="!canEditProductRow(product)"
                         placeholder="璇疯緭鍏�" />
             </up-form-item>
             <up-form-item label="鏄惁璐ㄦ"
@@ -309,16 +334,16 @@
                           required
                           :rules="productRules">
               <u-radio-group v-model="product.isChecked"
-                             :disabled="!canEditProducts"
+                             :disabled="!canEditProductRow(product)"
                              placement="row"
                              @change="groupChange">
                 <u-radio :customStyle="{marginRight: '40rpx'}"
                          label="鏄�"
-                         :disabled="!canEditProducts"
+                         :disabled="!canEditProductRow(product)"
                          :name="true">
                 </u-radio>
                 <u-radio label="鍚�"
-                         :disabled="!canEditProducts"
+                         :disabled="!canEditProductRow(product)"
                          :name="false">
                 </u-radio>
               </u-radio-group>
@@ -327,6 +352,12 @@
         </view>
       </view>
       <!-- 浣跨敤鍏叡搴曢儴鎸夐挳缁勪欢 -->
+      <view v-if="operationType === 'add' && !isReadOnly"
+            class="footer-template-tool"
+            @click="openTemplatePicker()">
+        <text class="footer-template-tool__label">妯℃澘</text>
+        <text class="footer-template-tool__value">{{ templateName || '閫夋嫨' }}</text>
+      </view>
       <FooterButtons :show="operationType !== 'view' && !isApprovalPassed"
                      cancelText="鍙栨秷"
                      confirmText="淇濆瓨"
@@ -347,8 +378,10 @@
     createPurchaseNo,
     getOptions,
     getPurchaseById,
-    getSalesNo,
     approveProcessGetInfo,
+    getPurchaseTemplateList,
+    getProductInfoByContractNo,
+    getSalesNo,
   } from "@/api/procurementManagement/procurementLedger";
   import { delProduct } from "@/api/salesManagement/salesLedger";
   import PageHeader from "@/components/PageHeader.vue";
@@ -358,26 +391,38 @@
   const operationType = ref("");
   const editData = ref(null);
   const formRef = ref(null);
+  const showSalesContractBinding = false;
+
   // 瀹℃壒閫氳繃锛坅pprovalStatus === 3锛夊悗锛屾暣鍗曠姝㈢紪杈戯紙鍚骇鍝併�佸熀鏈俊鎭�佸鎵规祦绋嬶級
   const isApprovalPassed = computed(() => {
     const status = editData.value?.approvalStatus ?? form.value?.approvalStatus;
     return Number(status) === 3;
   });
+  const isStockInFully = computed(() => {
+    const status = editData.value?.stockInStatus ?? form.value?.stockInStatus;
+    return status === "瀹屽叏鍏ュ簱";
+  });
   const canEditProducts = computed(() => {
-    return operationType.value !== "view" && !isApprovalPassed.value;
+    return (
+      operationType.value !== "view" &&
+      !isApprovalPassed.value &&
+      !isStockInFully.value
+    );
   });
   // 鏄惁鏁翠綋鍙锛氭煡鐪嬫ā寮� 鎴� 宸插鎵归�氳繃
   const isReadOnly = computed(() => {
-    return operationType.value === "view" || isApprovalPassed.value;
+    return (
+      operationType.value === "view" ||
+      isApprovalPassed.value ||
+      isStockInFully.value
+    );
   });
 
   const userStore = useUserStore();
   const form = ref({
     id: "",
-    salesContractNo: "",
-    // 鍏宠仈閿�鍞彴璐D锛堢紪杈戝洖鏄炬椂鍙兘缂哄け锛岄渶瑕佷粠鍚堝悓鍙峰弽鏌ヨˉ榻愶級
-    salesLedgerId: "",
     purchaseContractNumber: "",
+    salesLedgerId: "",
     supplierId: "",
     supplierName: "",
     projectName: "",
@@ -387,21 +432,20 @@
     entryDate: "",
     approveUserIds: "",
     executionDate: "",
+    stockInStatus: "",
+    remarks: "",
   });
   const showTimePicker = ref(false);
-  const showPicker = ref(false);
   const showCustomerPicker = ref(false);
-  const salesContractList = ref([]);
   const supplierList = ref([]);
   const productData = ref([]);
   const currentDate = ref(Date.now());
-  // 璁$畻閿�鍞悎鍚屽彿閫夋嫨鍒楄〃
-  const salesContractActionList = computed(() => {
-    return salesContractList.value.map(item => ({
-      name: item.text,
-      value: item.value,
-    }));
-  });
+  const templateList = ref([]);
+  const templateName = ref("");
+  const showTemplatePicker = ref(false);
+  const salesContractList = ref([]);
+  const showSalesContractPicker = ref(false);
+  const salesContractNoText = ref("");
 
   // 璁$畻渚涘簲鍟嗛�夋嫨鍒楄〃锛堝彧淇濈暀 isWhite === 0 鐨勪緵搴斿晢锛�
   const supplierActionList = computed(() => {
@@ -411,6 +455,20 @@
         name: item.text,
         value: item.value,
       }));
+  });
+
+  const templateActionList = computed(() => {
+    return templateList.value.map(item => ({
+      name: item.templateName,
+      value: item.templateName,
+    }));
+  });
+
+  const salesContractActionList = computed(() => {
+    return salesContractList.value.map(item => ({
+      name: item.salesContractNo,
+      value: item.id,
+    }));
   });
 
   // 閫夋嫨鍣ㄧ浉鍏冲彉閲�
@@ -468,9 +526,6 @@
 
   // 琛ㄥ崟鏍¢獙瑙勫垯
   const rules = {
-    salesContractNo: [
-      { required: true, message: "璇烽�夋嫨閿�鍞悎鍚屽彿", trigger: "blur" },
-    ],
     supplierName: [
       { required: true, message: "璇烽�夋嫨渚涘簲鍟嗗悕绉�", trigger: "blur" },
     ],
@@ -535,34 +590,17 @@
       taxInclusiveTotalPrice: "",
       taxExclusiveTotalPrice: "",
       invoiceType: "",
+      stockInApprovalStatus: "",
+      availableQuality: "",
+      returnQuality: "",
       isChecked: false,
       warnNum: "",
     });
   };
 
-  // 閿�鍞悎鍚屽彿閫夋嫨浜嬩欢
-  const onSalesmanSelect = item => {
-    form.value.salesContractNo = item.name;
-    // 鏌ユ壘瀵瑰簲鐨刬d
-    const selectedItem = salesContractList.value.find(
-      contract => contract.text === item.name
-    );
-    if (selectedItem) {
-      form.value.salesLedgerId = selectedItem.value;
-    }
-    showPicker.value = false;
-  };
-
-  // 缂栬緫鍥炴樉鍦烘櫙锛氬彧鏈� salesContractNo锛屾病鏈� salesLedgerId 鏃讹紝灏濊瘯浠庡垪琛ㄥ弽鏌ヨˉ榻�
-  const syncSalesLedgerIdFromContractNo = () => {
-    if (form.value.salesLedgerId) return;
-    if (!form.value.salesContractNo) return;
-    const selectedItem = salesContractList.value.find(
-      contract => contract.text === form.value.salesContractNo
-    );
-    if (selectedItem) {
-      form.value.salesLedgerId = selectedItem.value;
-    }
+  const canEditProductRow = product => {
+    if (!canEditProducts.value) return false;
+    return product?.stockInApprovalStatus !== "瀹屽叏鍏ュ簱";
   };
 
   // 渚涘簲鍟嗛�夋嫨浜嬩欢
@@ -581,6 +619,7 @@
   const removeProduct = idx => {
     if (!canEditProducts.value) return;
     const row = productData.value[idx];
+    if (!canEditProductRow(row)) return;
 
     // 鏂板妯″紡鎴栬繕鏈惤搴撶殑浜у搧锛岀洿鎺ュ墠绔垹闄�
     if (operationType.value === "add" || !row?.id) {
@@ -624,26 +663,113 @@
   // 鏄剧ず閫夋嫨鍣�
   const openCategoryPicker = idx => {
     if (!canEditProducts.value) return;
+    if (!canEditProductRow(productData.value[idx])) return;
     currentProductIndex.value = idx;
     showCategoryPicker.value = true;
   };
 
   const openSpecificationPicker = idx => {
     if (!canEditProducts.value) return;
+    if (!canEditProductRow(productData.value[idx])) return;
     currentProductIndex.value = idx;
     showSpecificationPicker.value = true;
   };
 
   const openTaxRatePicker = idx => {
     if (!canEditProducts.value) return;
+    if (!canEditProductRow(productData.value[idx])) return;
     currentProductIndex.value = idx;
     showTaxRatePicker.value = true;
   };
 
   const openInvoiceTypePicker = idx => {
     if (!canEditProducts.value) return;
+    if (!canEditProductRow(productData.value[idx])) return;
     currentProductIndex.value = idx;
     showInvoiceTypePicker.value = true;
+  };
+
+  const normalizeProductRow = row => {
+    const source = row || {};
+    return {
+      id: source.id,
+      productCategory: source.productCategory || "",
+      specificationModel: source.specificationModel || "",
+      productModelId: source.productModelId || source.materialModelId || "",
+      unit: source.unit || "",
+      taxRate: source.taxRate ?? "",
+      taxInclusiveUnitPrice: source.taxInclusiveUnitPrice ?? "",
+      quantity: source.quantity ?? "",
+      taxInclusiveTotalPrice: source.taxInclusiveTotalPrice ?? "",
+      taxExclusiveTotalPrice: source.taxExclusiveTotalPrice ?? "",
+      invoiceType: source.invoiceType || "",
+      stockInApprovalStatus: source.stockInApprovalStatus || "",
+      availableQuality: source.availableQuality ?? "",
+      returnQuality: source.returnQuality ?? "",
+      isChecked:
+        typeof source.isChecked === "boolean"
+          ? source.isChecked
+          : Boolean(source.isChecked),
+      warnNum: source.warnNum ?? "",
+    };
+  };
+
+  const openTemplatePicker = async () => {
+    if (isReadOnly.value) return;
+    if (!templateList.value.length) {
+      const res = await getPurchaseTemplateList();
+      if (res && res.code === 200 && Array.isArray(res.data)) {
+        templateList.value = res.data;
+      }
+    }
+    showTemplatePicker.value = true;
+  };
+
+  const onTemplateSelect = item => {
+    const selected = templateList.value.find(t => t.templateName === item.name);
+    if (!selected) {
+      showTemplatePicker.value = false;
+      return;
+    }
+    templateName.value = selected.templateName || "";
+    if (selected.supplierId) form.value.supplierId = selected.supplierId;
+    if (selected.supplierName) form.value.supplierName = selected.supplierName;
+    if (selected.projectName) form.value.projectName = selected.projectName;
+    if (selected.paymentMethod) form.value.paymentMethod = selected.paymentMethod;
+    const list =
+      selected.productList ||
+      selected.productData ||
+      selected.purchaseLedgerProductList ||
+      [];
+    productData.value = Array.isArray(list) ? list.map(normalizeProductRow) : [];
+    showTemplatePicker.value = false;
+  };
+
+  const openSalesContractPicker = async () => {
+    if (isReadOnly.value) return;
+    if (!salesContractList.value.length) {
+      const res = await getSalesNo();
+      if (res && res.code === 200 && Array.isArray(res.data)) {
+        salesContractList.value = res.data;
+      } else if (Array.isArray(res)) {
+        salesContractList.value = res;
+      }
+    }
+    showSalesContractPicker.value = true;
+  };
+
+  const onSalesContractSelect = async item => {
+    form.value.salesLedgerId = item.value;
+    salesContractNoText.value = item.name || "";
+    showSalesContractPicker.value = false;
+    const res = await getProductInfoByContractNo({
+      contractNo: form.value.salesLedgerId,
+    });
+    if (res && res.code === 200 && Array.isArray(res.data)) {
+      productData.value = res.data.map(normalizeProductRow);
+    } else if (Array.isArray(res)) {
+      productData.value = res.map(normalizeProductRow);
+    }
   };
 
   // 閫夋嫨鍣ㄧ‘璁や簨浠�
@@ -875,6 +1001,13 @@
       });
       return;
     }
+    if (isStockInFully.value) {
+      uni.showToast({
+        title: "瀹屽叏鍏ュ簱鐨勫彴璐︿笉鍏佽淇敼",
+        icon: "none",
+      });
+      return;
+    }
     const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
     if (hasEmptyApprover) {
       uni.showToast({
@@ -894,8 +1027,6 @@
       });
       return;
     }
-    // 缂栬緫鍥炴樉鏃跺彲鑳藉彧鏈夊悎鍚屽彿锛屾彁浜ゅ墠灏濊瘯琛ラ綈 salesLedgerId
-    syncSalesLedgerIdFromContractNo();
     if (operationType.value == "add") {
       delete form.value.id;
     }
@@ -932,9 +1063,17 @@
   const fillFormData = () => {
     if (!editData.value) return;
     getPurchaseById({ id: editData.value.id, type: 2 }).then(res => {
-      productData.value = res.productData;
-      if (res && res.approveUserIds) {
-        const userIds = res.approveUserIds.split(",");
+      const data = res?.data ? res.data : res || {};
+      const products =
+        data.purchaseLedgerProductList ||
+        res?.productData ||
+        data.productData ||
+        [];
+      productData.value = Array.isArray(products)
+        ? products.map(normalizeProductRow)
+        : [];
+      if (data && data.approveUserIds) {
+        const userIds = data.approveUserIds.split(",");
         approverNodes.value = userIds.map((userId, idx) => {
           const userIdNum = parseInt(userId.trim());
           // 浠巙serList涓壘鍒板搴旂殑鐢ㄦ埛淇℃伅
@@ -957,29 +1096,24 @@
     // 濉厖鍩烘湰淇℃伅
     form.value.purchaseContractNumber =
       editData.value.purchaseContractNumber || "";
-    form.value.salesContractNo = editData.value.salesContractNo || "";
     form.value.supplierName = editData.value.supplierName || "";
     form.value.projectName = editData.value.projectName || "";
     form.value.paymentMethod = editData.value.paymentMethod || "";
-    form.value.salesLedgerId = editData.value.salesLedgerId || "";
     form.value.recorderId = editData.value.recorderId || "";
     form.value.recorderName = editData.value.recorderName || "";
     form.value.entryDate = editData.value.entryDate || "";
     form.value.id = editData.value.id || "";
     form.value.supplierId = editData.value.supplierId || "";
     form.value.executionDate = editData.value.executionDate || "";
-  };
-
-  const getSalesNoList = () => {
-    getSalesNo().then(res => {
-      // 灏嗙敤鎴锋暟鎹粍瑁呮垚 picker 闇�瑕佺殑鏍煎紡
-      salesContractList.value = res.map(user => ({
-        text: user.salesContractNo,
-        value: user.id,
-      }));
-      // 鍒楄〃鍥炴潵鍚庯紝琛ラ綈缂栬緫鍥炴樉鐨� salesLedgerId
-      syncSalesLedgerIdFromContractNo();
-    });
+    form.value.stockInStatus = editData.value.stockInStatus || "";
+    form.value.remarks = editData.value.remarks || "";
+    form.value.salesLedgerId = editData.value.salesLedgerId || "";
+    if (showSalesContractBinding && form.value.salesLedgerId) {
+      const match = salesContractList.value.find(
+        i => i.id === form.value.salesLedgerId
+      );
+      if (match) salesContractNoText.value = match.salesContractNo || "";
+    }
   };
 
   const getOptionsLIst = () => {
@@ -1032,8 +1166,6 @@
     userListNoPageByTenantId().then(res => {
       userList.value = res.data;
     });
-    // 鑾峰彇閿�鍞悎鍚屽彿鍒楄〃
-    getSalesNoList();
     // 鑾峰彇渚涘簲鍟嗗垪琛�
     getOptionsLIst();
     // 鑾峰彇浜у搧澶х被tree鏁版嵁
@@ -1043,6 +1175,15 @@
       setUserInfo();
       createPurchaseNo().then(res => {
         form.value.purchaseContractNumber = res.data;
+      });
+    }
+    if (showSalesContractBinding) {
+      getSalesNo().then(res => {
+        if (res && res.code === 200 && Array.isArray(res.data)) {
+          salesContractList.value = res.data;
+        } else if (Array.isArray(res)) {
+          salesContractList.value = res;
+        }
       });
     }
 
@@ -1500,4 +1641,34 @@
     color: #3b82f6;
     font-size: 14px;
   }
-</style>
\ No newline at end of file
+
+  .footer-template-tool {
+    position: fixed;
+    right: 12px;
+    bottom: 78px;
+    z-index: 1001;
+    display: flex;
+    align-items: center;
+    gap: 6px;
+    padding: 6px 10px;
+    background: rgba(255, 255, 255, 0.96);
+    border: 1px solid #e5e7eb;
+    border-radius: 999px;
+    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
+  }
+
+  .footer-template-tool__label {
+    font-size: 12px;
+    color: #6b7280;
+  }
+
+  .footer-template-tool__value {
+    font-size: 12px;
+    color: #006cfb;
+    font-weight: 600;
+    max-width: 180px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+</style>
diff --git a/src/pages/procurementManagement/procurementLedger/index.vue b/src/pages/procurementManagement/procurementLedger/index.vue
index 4547182..028fb1c 100644
--- a/src/pages/procurementManagement/procurementLedger/index.vue
+++ b/src/pages/procurementManagement/procurementLedger/index.vue
@@ -45,10 +45,14 @@
           </view>
           <up-divider></up-divider>
           <view class="item-details">
-            <!-- <view class="detail-row">
-              <text class="detail-label">閿�鍞悎鍚屽彿</text>
-              <text class="detail-value">{{ item.salesContractNo }}</text>
-            </view> -->
+            <view class="detail-row">
+              <text class="detail-label">鍏ュ簱鐘舵��</text>
+              <view class="detail-value">
+                <u-tag :type="getStockInStatusType(item.stockInStatus)">
+                  {{ item.stockInStatus || '--' }}
+                </u-tag>
+              </view>
+            </view>
             <view class="detail-row">
               <text class="detail-label">渚涘簲鍟嗗悕绉�</text>
               <text class="detail-value">{{ item.supplierName }}</text>
@@ -78,7 +82,7 @@
             </view>
             <!-- 浠呴潪鈥滃鎵归�氳繃鈥濈殑鍙拌处灞曠ず鍒犻櫎鎸夐挳 -->
             <view class="detail-row"
-                  v-if="item.approvalStatus !== 3"
+                  v-if="item.approvalStatus !== 3 && item.stockInStatus !== '瀹屽叏鍏ュ簱'"
                   style="justify-content: flex-end; margin-top: 8px;">
               <up-button type="error"
                          size="small"
@@ -130,6 +134,14 @@
       4: "error", // 瀹℃壒澶辫触 - 绾㈣壊
     };
     return typeMap[status] || "";
+  };
+  const getStockInStatusType = status => {
+    const typeMap = {
+      寰呭叆搴�: "info",
+      鍏ュ簱涓�: "warning",
+      瀹屽叏鍏ュ簱: "success",
+    };
+    return typeMap[status] || "info";
   };
   // 鎼滅储鍏抽敭璇�
   const purchaseContractNumber = ref("");
@@ -201,6 +213,13 @@
           });
           return;
         }
+        if (row.stockInStatus === "瀹屽叏鍏ュ簱") {
+          uni.setStorageSync("editData", JSON.stringify(row));
+          uni.navigateTo({
+            url: "/pages/procurementManagement/procurementLedger/view",
+          });
+          return;
+        }
 
         // 褰曞叆浜虹紪杈戯細瀛樺偍鏁版嵁骞惰烦杞埌缂栬緫椤甸潰
         uni.setStorageSync("editData", JSON.stringify(row));
diff --git a/src/pages/procurementManagement/procurementLedger/view.vue b/src/pages/procurementManagement/procurementLedger/view.vue
index 174b8ae..30dd536 100644
--- a/src/pages/procurementManagement/procurementLedger/view.vue
+++ b/src/pages/procurementManagement/procurementLedger/view.vue
@@ -12,10 +12,6 @@
           <text class="info-value">{{ form.purchaseContractNumber }}</text>
         </view>
         <view class="info-item">
-          <text class="info-label">閿�鍞悎鍚屽彿</text>
-          <text class="info-value">{{ form.salesContractNo }}</text>
-        </view>
-        <view class="info-item">
           <text class="info-label">渚涘簲鍟嗗悕绉�</text>
           <text class="info-value">{{ form.supplierName }}</text>
         </view>
@@ -28,12 +24,20 @@
           <text class="info-value">{{ form.paymentMethod }}</text>
         </view>
         <view class="info-item">
+          <text class="info-label">鍏ュ簱鐘舵��</text>
+          <text class="info-value">{{ form.stockInStatus || '--' }}</text>
+        </view>
+        <view class="info-item">
           <text class="info-label">褰曞叆浜�</text>
           <text class="info-value">{{ form.recorderName }}</text>
         </view>
         <view class="info-item">
           <text class="info-label">褰曞叆鏃ユ湡</text>
           <text class="info-value">{{ form.entryDate }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">澶囨敞</text>
+          <text class="info-value">{{ form.remarks || '--' }}</text>
         </view>
       </view>
     </view>
@@ -64,6 +68,10 @@
               <text class="info-value">{{ product.unit }}</text>
             </view>
             <view class="info-item">
+              <text class="info-label">鍏ュ簱瀹℃牳鐘舵��</text>
+              <text class="info-value">{{ product.stockInApprovalStatus || '--' }}</text>
+            </view>
+            <view class="info-item">
               <text class="info-label">绋庣巼(%)</text>
               <text class="info-value">{{ product.taxRate }}</text>
             </view>
@@ -74,6 +82,14 @@
             <view class="info-item">
               <text class="info-label">鏁伴噺</text>
               <text class="info-value highlight">{{ product.quantity }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鍙敤鏁伴噺</text>
+              <text class="info-value">{{ product.availableQuality ?? '--' }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">閫�璐ф暟閲�</text>
+              <text class="info-value">{{ product.returnQuality ?? '--' }}</text>
             </view>
             <view class="info-item">
               <text class="info-label">鍚◣鎬讳环(鍏�)</text>
@@ -106,7 +122,6 @@
 // 琛ㄥ崟鏁版嵁
 const form = ref({
   id: '',
-  salesContractNo: '',
   customerContractNo: '',
   customerId: '',
   customerName: '',
@@ -138,8 +153,11 @@
   
   // 鑾峰彇瀹屾暣鐨勪骇鍝佷俊鎭�
 	getPurchaseById({ id: editData.value.id, type: 2 }).then((res) => {
-    productData.value = res.productData || [];
-		form.value = {...res}
+    const data = res?.data ? res.data : res || {};
+    const products =
+      data.purchaseLedgerProductList || res?.productData || data.productData || [];
+    productData.value = Array.isArray(products) ? products : [];
+		form.value = { ...data }
   });
 };
 

--
Gitblit v1.9.3