From 46bb7b4fc1dd5452f9d03f1a12fde20c3a79a84a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 06 二月 2026 16:40:16 +0800
Subject: [PATCH] fix: 编辑web端新增的采购台账后,销售合同号会不展示了

---
 src/pages/procurementManagement/procurementLedger/detail.vue |  167 ++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 139 insertions(+), 28 deletions(-)

diff --git a/src/pages/procurementManagement/procurementLedger/detail.vue b/src/pages/procurementManagement/procurementLedger/detail.vue
index de6f687..d7693cc 100644
--- a/src/pages/procurementManagement/procurementLedger/detail.vue
+++ b/src/pages/procurementManagement/procurementLedger/detail.vue
@@ -17,27 +17,30 @@
       </up-form-item>
       <up-form-item label="閿�鍞悎鍚屽彿"
                     prop="salesContractNo"
-                    required
-                    @click="showPicker = true">
+                    required>
         <up-input v-model="form.salesContractNo"
-                  readonly=""
-                  @click="showPicker = true"
+                  readonly
+                  :disabled="isReadOnly"
+                  @click="!isReadOnly && (showPicker = true)"
                   placeholder="鐐瑰嚮閫夋嫨閿�鍞悎鍚屽彿" />
         <template #right>
           <up-icon name="arrow-right"
+                   v-if="!isReadOnly"
                    @click="showPicker = true"></up-icon>
         </template>
       </up-form-item>
       <up-form-item label="渚涘簲鍟嗗悕绉�"
                     prop="supplierName"
                     required
-                    @click="showCustomerPicker = true">
+                    >
         <up-input v-model="form.supplierName"
-                  readonly=""
-                  @click="showCustomerPicker = true"
+                  readonly
+                  :disabled="isReadOnly"
+                  @click="!isReadOnly && (showCustomerPicker = true)"
                   placeholder="鐐瑰嚮閫夋嫨渚涘簲鍟�" />
         <template #right>
           <up-icon name="arrow-right"
+                   v-if="!isReadOnly"
                    @click="showCustomerPicker = true"></up-icon>
         </template>
       </up-form-item>
@@ -45,11 +48,13 @@
                     prop="projectName"
                     required>
         <up-input v-model="form.projectName"
+                  :disabled="isReadOnly"
                   placeholder="璇疯緭鍏ラ」鐩悕绉�" />
       </up-form-item>
       <up-form-item label="浠樻鏂瑰紡"
                     prop="paymentMethod">
         <up-input v-model="form.paymentMethod"
+                  :disabled="isReadOnly"
                   placeholder="璇疯緭鍏ヤ粯娆炬柟寮�" />
       </up-form-item>
       <up-form-item label="绛捐鏃ユ湡"
@@ -57,9 +62,11 @@
                     prop="executionDate">
         <up-input v-model="form.executionDate"
                   placeholder="璇烽�夋嫨"
-                  readonly="" />
+                  readonly
+                  :disabled="isReadOnly" />
         <template #right>
           <up-icon name="arrow-right"
+                   v-if="!isReadOnly"
                    @click="showTimePicker = true"></up-icon>
         </template>
       </up-form-item>
@@ -99,9 +106,10 @@
                   <text class="approver-name">{{ step.nickName }}</text>
                 </view>
                 <view class="delete-approver-btn"
+                      v-if="!isReadOnly"
                       @click="removeApprover(stepIndex)">脳</view>
               </view>
-              <view v-else
+              <view v-else-if="!isReadOnly"
                     class="add-approver-btn"
                     @click="addApprover(stepIndex)">
                 <view class="add-circle">+</view>
@@ -111,11 +119,11 @@
             <view class="step-line"
                   v-if="stepIndex < approverNodes.length - 1"></view>
             <view class="delete-step-btn"
-                  v-if="approverNodes.length > 1"
+                  v-if="approverNodes.length > 1 && !isReadOnly"
                   @click="removeApprovalStep(stepIndex)">鍒犻櫎鑺傜偣</view>
           </view>
         </view>
-        <view class="add-step-btn">
+        <view class="add-step-btn" v-if="!isReadOnly">
           <u-button icon="plus"
                     plain
                     type="primary"
@@ -190,7 +198,7 @@
                        size="small"
                        @click="addProduct"
                        class="add-btn"
-                       v-if="operationType !== 'view'">
+                       v-if="canEditProducts">
               鏂板
             </up-button>
           </view>
@@ -208,7 +216,7 @@
             </view>
             <!-- 鎿嶄綔鎸夐挳 -->
             <view class="product-actions"
-                  v-if="operationType !== 'view'">
+                  v-if="canEditProducts">
               <up-button type="error"
                          size="mini"
                          @click="removeProduct(idx)"
@@ -227,10 +235,12 @@
               <up-input v-model="product.productCategory"
                         readonly
                         placeholder="璇烽�夋嫨"
+                        :disabled="!canEditProducts"
                         @click="openCategoryPicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         @click="showCategoryPicker = true"></up-icon>
+                         v-if="canEditProducts"
+                         @click="openCategoryPicker(idx)"></up-icon>
               </template>
             </up-form-item>
             <!-- 瑙勬牸鍨嬪彿 -->
@@ -241,10 +251,12 @@
               <up-input v-model="product.specificationModel"
                         readonly
                         placeholder="璇烽�夋嫨"
+                        :disabled="!canEditProducts"
                         @click="openSpecificationPicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         @click="showSpecificationPicker = true"></up-icon>
+                         v-if="canEditProducts"
+                         @click="openSpecificationPicker(idx)"></up-icon>
               </template>
             </up-form-item>
             <!-- 鍗曚綅 -->
@@ -253,6 +265,7 @@
                           required
                           :rules="productRules">
               <up-input v-model="product.unit"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�" />
             </up-form-item>
             <!-- 绋庣巼 -->
@@ -263,10 +276,12 @@
               <up-input v-model="product.taxRate"
                         readonly
                         placeholder="璇烽�夋嫨"
+                        :disabled="!canEditProducts"
                         @click="openTaxRatePicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         @click="showTaxRatePicker = true"></up-icon>
+                         v-if="canEditProducts"
+                         @click="openTaxRatePicker(idx)"></up-icon>
               </template>
             </up-form-item>
             <!-- 鍚◣鍗曚环 -->
@@ -276,6 +291,7 @@
                           :rules="productRules">
               <up-input v-model="product.taxInclusiveUnitPrice"
                         type="number"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�"
                         @blur="formatTaxPrice(idx)" />
             </up-form-item>
@@ -286,6 +302,7 @@
                           :rules="productRules">
               <up-input v-model="product.quantity"
                         type="number"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�"
                         @blur="formatAmount(idx)" />
             </up-form-item>
@@ -296,6 +313,7 @@
                           :rules="productRules">
               <up-input v-model="product.taxInclusiveTotalPrice"
                         type="number"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�"
                         @blur="formatTaxTotal(idx)" />
             </up-form-item>
@@ -306,6 +324,7 @@
                           :rules="productRules">
               <up-input v-model="product.taxExclusiveTotalPrice"
                         type="number"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�"
                         @blur="formatNoTaxTotal(idx)" />
             </up-form-item>
@@ -317,10 +336,12 @@
               <up-input v-model="product.invoiceType"
                         readonly
                         placeholder="璇烽�夋嫨"
+                        :disabled="!canEditProducts"
                         @click="openInvoiceTypePicker(idx)" />
               <template #right>
                 <up-icon name="arrow-right"
-                         @click="showInvoiceTypePicker = true"></up-icon>
+                         v-if="canEditProducts"
+                         @click="openInvoiceTypePicker(idx)"></up-icon>
               </template>
             </up-form-item>
             <!-- 搴撳瓨棰勮鏁伴噺 -->
@@ -330,6 +351,7 @@
                           :rules="productRules">
               <up-input v-model="product.warnNum"
                         type="number"
+                        :disabled="!canEditProducts"
                         placeholder="璇疯緭鍏�" />
             </up-form-item>
             <up-form-item label="鏄惁璐ㄦ"
@@ -337,13 +359,16 @@
                           required
                           :rules="productRules">
               <u-radio-group v-model="product.isChecked"
+                             :disabled="!canEditProducts"
                              placement="row"
                              @change="groupChange">
                 <u-radio :customStyle="{marginRight: '40rpx'}"
                          label="鏄�"
+                         :disabled="!canEditProducts"
                          :name="true">
                 </u-radio>
                 <u-radio label="鍚�"
+                         :disabled="!canEditProducts"
                          :name="false">
                 </u-radio>
               </u-radio-group>
@@ -352,7 +377,7 @@
         </view>
       </view>
       <!-- 浣跨敤鍏叡搴曢儴鎸夐挳缁勪欢 -->
-      <FooterButtons :show="operationType !== 'view'"
+      <FooterButtons :show="operationType !== 'view' && !isApprovalPassed"
                      cancelText="鍙栨秷"
                      confirmText="淇濆瓨"
                      @cancel="goBack"
@@ -375,6 +400,7 @@
     getSalesNo,
     approveProcessGetInfo,
   } from "@/api/procurementManagement/procurementLedger";
+  import { delProduct } from "@/api/salesManagement/salesLedger";
   import PageHeader from "@/components/PageHeader.vue";
   import FooterButtons from "@/components/FooterButtons.vue";
   import { userListNoPageByTenantId } from "@/api/system/user";
@@ -382,11 +408,25 @@
   const operationType = ref("");
   const editData = ref(null);
   const formRef = ref(null);
+  // 瀹℃壒閫氳繃锛坅pprovalStatus === 3锛夊悗锛屾暣鍗曠姝㈢紪杈戯紙鍚骇鍝併�佸熀鏈俊鎭�佸鎵规祦绋嬶級
+  const isApprovalPassed = computed(() => {
+    const status = editData.value?.approvalStatus ?? form.value?.approvalStatus;
+    return Number(status) === 3;
+  });
+  const canEditProducts = computed(() => {
+    return operationType.value !== "view" && !isApprovalPassed.value;
+  });
+  // 鏄惁鏁翠綋鍙锛氭煡鐪嬫ā寮� 鎴� 宸插鎵归�氳繃
+  const isReadOnly = computed(() => {
+    return operationType.value === "view" || isApprovalPassed.value;
+  });
 
   const userStore = useUserStore();
   const form = ref({
     id: "",
     salesContractNo: "",
+    // 鍏宠仈閿�鍞彴璐D锛堢紪杈戝洖鏄炬椂鍙兘缂哄け锛岄渶瑕佷粠鍚堝悓鍙峰弽鏌ヨˉ榻愶級
+    salesLedgerId: "",
     purchaseContractNumber: "",
     supplierId: "",
     supplierName: "",
@@ -413,12 +453,14 @@
     }));
   });
 
-  // 璁$畻渚涘簲鍟嗛�夋嫨鍒楄〃
+  // 璁$畻渚涘簲鍟嗛�夋嫨鍒楄〃锛堝彧淇濈暀 isWhite === 0 鐨勪緵搴斿晢锛�
   const supplierActionList = computed(() => {
-    return supplierList.value.map(item => ({
-      name: item.text,
-      value: item.value,
-    }));
+    return supplierList.value
+      .filter(item => item.isWhite === 0)
+      .map(item => ({
+        name: item.text,
+        value: item.value,
+      }));
   });
 
   // 閫夋嫨鍣ㄧ浉鍏冲彉閲�
@@ -528,6 +570,7 @@
   };
 
   const addProduct = () => {
+    if (!canEditProducts.value) return;
     if (productData.value === null) {
       productData.value = [];
     }
@@ -560,6 +603,18 @@
     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 onCustomerSelect = item => {
     form.value.supplierName = item.name;
@@ -574,26 +629,69 @@
   };
 
   const removeProduct = idx => {
-    productData.value.splice(idx, 1);
+    if (!canEditProducts.value) return;
+    const row = productData.value[idx];
+
+    // 鏂板妯″紡鎴栬繕鏈惤搴撶殑浜у搧锛岀洿鎺ュ墠绔垹闄�
+    if (operationType.value === "add" || !row?.id) {
+      productData.value.splice(idx, 1);
+      return;
+    }
+
+    uni.showModal({
+      title: "鎻愮ず",
+      content: "閫変腑鐨勪骇鍝佸皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�",
+      confirmText: "纭",
+      cancelText: "鍙栨秷",
+      success: res => {
+        if (!res.confirm) {
+          uni.showToast({
+            title: "宸插彇娑�",
+            icon: "none",
+          });
+          return;
+        }
+        const ids = [row.id];
+        delProduct(ids).then(() => {
+          uni.showToast({
+            title: "鍒犻櫎鎴愬姛",
+            icon: "success",
+          });
+          const currentId = form.value.id || editData.value?.id;
+          if (currentId) {
+            getPurchaseById({ id: currentId, type: 2 }).then(res2 => {
+              productData.value = res2.productData || [];
+            });
+          } else {
+            // 鍥為��澶勭悊锛氬鏋滄病鏈夊綋鍓岻D锛屽垯鏈湴鍒犻櫎
+            productData.value.splice(idx, 1);
+          }
+        });
+      },
+    });
   };
 
   // 鏄剧ず閫夋嫨鍣�
   const openCategoryPicker = idx => {
+    if (!canEditProducts.value) return;
     currentProductIndex.value = idx;
     showCategoryPicker.value = true;
   };
 
   const openSpecificationPicker = idx => {
+    if (!canEditProducts.value) return;
     currentProductIndex.value = idx;
     showSpecificationPicker.value = true;
   };
 
   const openTaxRatePicker = idx => {
+    if (!canEditProducts.value) return;
     currentProductIndex.value = idx;
     showTaxRatePicker.value = true;
   };
 
   const openInvoiceTypePicker = idx => {
+    if (!canEditProducts.value) return;
     currentProductIndex.value = idx;
     showInvoiceTypePicker.value = true;
   };
@@ -819,6 +917,14 @@
   };
 
   const onSubmit = () => {
+    // 瀹℃壒閫氳繃鐨勫彴璐︾姝㈠啀娆′慨鏀�
+    if (isApprovalPassed.value) {
+      uni.showToast({
+        title: "宸插鎵归�氳繃鐨勫彴璐︿笉鍏佽淇敼",
+        icon: "none",
+      });
+      return;
+    }
     const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
     if (hasEmptyApprover) {
       uni.showToast({
@@ -838,10 +944,8 @@
       });
       return;
     }
-    // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
-    if (!form.value.salesLedgerId) {
-      form.value.salesContractNo = "";
-    }
+    // 缂栬緫鍥炴樉鏃跺彲鑳藉彧鏈夊悎鍚屽彿锛屾彁浜ゅ墠灏濊瘯琛ラ綈 salesLedgerId
+    syncSalesLedgerIdFromContractNo();
     if (operationType.value == "add") {
       delete form.value.id;
     }
@@ -923,6 +1027,8 @@
         text: user.salesContractNo,
         value: user.id,
       }));
+      // 鍒楄〃鍥炴潵鍚庯紝琛ラ綈缂栬緫鍥炴樉鐨� salesLedgerId
+      syncSalesLedgerIdFromContractNo();
     });
   };
 
@@ -932,6 +1038,7 @@
       supplierList.value = res.data.map(item => ({
         text: item.supplierName,
         value: item.id,
+        isWhite: item.isWhite,
       }));
     });
   };
@@ -1023,6 +1130,7 @@
   };
 
   const addApprover = stepIndex => {
+    if (isReadOnly.value) return;
     // 璺宠浆鍒拌仈绯讳汉閫夋嫨椤甸潰
     uni.setStorageSync("stepIndex", stepIndex);
     uni.navigateTo({
@@ -1031,18 +1139,21 @@
   };
 
   const addApprovalStep = () => {
+    if (isReadOnly.value) return;
     // 娣诲姞鏂扮殑瀹℃壒姝ラ
     approverNodes.value.push({ userId: null, nickName: null });
     console.log(approverNodes.value, "approverNodes.value");
   };
 
   const removeApprover = stepIndex => {
+    if (isReadOnly.value) return;
     // 绉婚櫎瀹℃壒浜�
     approverNodes.value[stepIndex].userId = null;
     approverNodes.value[stepIndex].nickName = null;
   };
 
   const removeApprovalStep = stepIndex => {
+    if (isReadOnly.value) return;
     // 纭繚鑷冲皯淇濈暀涓�涓鎵规楠�
     if (approverNodes.value.length > 1) {
       approverNodes.value.splice(stepIndex, 1);

--
Gitblit v1.9.3