zlwu 11 месяцев назад
Родитель
Сommit
11f2897d8b
1 измененных файлов с 248 добавлено и 180 удалено
  1. 248 180
      web/src/views/crm/contract/form.vue

+ 248 - 180
web/src/views/crm/contract/form.vue

@@ -136,7 +136,7 @@
           <!-- 合同条款部分 -->
           <el-divider content-position="left">
             供方信息
-            <el-button type="primary" size="small" @click="handleSwapParties" style="margin-left: 10px; min-width: 120px;">
+            <el-button type="primary" size="small" @click="handleSwapParties" style="margin-left: 10px; min-width: 120px">
               <el-icon><Sort /></el-icon>
               供需方调换
             </el-button>
@@ -368,13 +368,7 @@
                   <div class="upload-file-card">
                     <!-- 缩略图区域 -->
                     <div class="upload-file-thumb">
-                      <ImagePreview 
-                        v-if="isImageFile(file)" 
-                        :src="file.ossId || file.url" 
-                        width="100%" 
-                        height="100%" 
-                        :isOssId="!!file.ossId" 
-                      />
+                      <ImagePreview v-if="isImageFile(file)" :src="file.ossId || file.url" width="100%" height="100%" :isOssId="!!file.ossId" />
                       <div v-else class="upload-file-placeholder">
                         <el-icon><Document /></el-icon>
                         <div class="file-ext">{{ getFileExtension(file.name) }}</div>
@@ -518,7 +512,9 @@ const route = useRoute();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 // 字典数据
-const { crm_contract_type, crm_contract_template, crm_product_unit, crm_shfs } = toRefs<any>(proxy?.useDict('crm_contract_type', 'crm_contract_template', 'crm_product_unit', 'crm_shfs'));
+const { crm_contract_type, crm_contract_template, crm_product_unit, crm_shfs } = toRefs<any>(
+  proxy?.useDict('crm_contract_type', 'crm_contract_template', 'crm_product_unit', 'crm_shfs')
+);
 
 // 表单标题
 const formTitle = computed(() => {
@@ -798,27 +794,84 @@ const handleCustomerConfirm = async (customer: CustomerVO) => {
         console.log('   - bankName:', invoiceData.bankName);
         console.log('   - bankAccount:', invoiceData.bankAccount);
 
-        // 使用开票信息填充需方信息(乙方)
-        form.value.partyB = invoiceData.companyName || '';
-        form.value.partyBAddress = invoiceData.companyAddress || fullAddress || '';
-        form.value.partyBLegalPerson = invoiceData.legalRepresentative || '';
-        form.value.partyBAgent = invoiceData.agent || '';
-        form.value.partyBPhoneFax = invoiceData.phoneFax || '';
-        form.value.partyBBank = invoiceData.bankName || '';
-        form.value.partyBAccount = invoiceData.bankAccount || '';
-
-        console.log('4. 填充后的需方信息:');
-        console.log('   - partyB:', form.value.partyB);
-        console.log('   - partyBAddress:', form.value.partyBAddress);
-        console.log('   - partyBLegalPerson:', form.value.partyBLegalPerson);
-        console.log('   - partyBAgent:', form.value.partyBAgent);
-        console.log('   - partyBPhoneFax:', form.value.partyBPhoneFax);
-        console.log('   - partyBBank:', form.value.partyBBank);
-        console.log('   - partyBAccount:', form.value.partyBAccount);
-        console.log('✅ 已自动填充客户开票信息到需方信息');
+        // 根据调换状态决定填充到哪个区域
+        if (isPartiesSwapped.value) {
+          // 已调换:客户名称对应供方信息区域(partyA)
+          form.value.partyA = invoiceData.companyName || '';
+          form.value.partyAAddress = invoiceData.companyAddress || fullAddress || '';
+          form.value.partyALegalPerson = invoiceData.legalRepresentative || '';
+          form.value.partyAAgent = invoiceData.agent || '';
+          form.value.partyAPhoneFax = invoiceData.phoneFax || '';
+          form.value.partyABank = invoiceData.bankName || '';
+          form.value.partyAAccount = invoiceData.bankAccount || '';
+
+          console.log('4. 填充后的供方信息(已调换):');
+          console.log('   - partyA:', form.value.partyA);
+          console.log('   - partyAAddress:', form.value.partyAAddress);
+          console.log('   - partyALegalPerson:', form.value.partyALegalPerson);
+          console.log('   - partyAAgent:', form.value.partyAAgent);
+          console.log('   - partyAPhoneFax:', form.value.partyAPhoneFax);
+          console.log('   - partyABank:', form.value.partyABank);
+          console.log('   - partyAAccount:', form.value.partyAAccount);
+          console.log('✅ 已自动填充客户开票信息到供方信息(已调换)');
+        } else {
+          // 未调换:客户名称对应需方信息区域(partyB)
+          form.value.partyB = invoiceData.companyName || '';
+          form.value.partyBAddress = invoiceData.companyAddress || fullAddress || '';
+          form.value.partyBLegalPerson = invoiceData.legalRepresentative || '';
+          form.value.partyBAgent = invoiceData.agent || '';
+          form.value.partyBPhoneFax = invoiceData.phoneFax || '';
+          form.value.partyBBank = invoiceData.bankName || '';
+          form.value.partyBAccount = invoiceData.bankAccount || '';
+
+          console.log('4. 填充后的需方信息:');
+          console.log('   - partyB:', form.value.partyB);
+          console.log('   - partyBAddress:', form.value.partyBAddress);
+          console.log('   - partyBLegalPerson:', form.value.partyBLegalPerson);
+          console.log('   - partyBAgent:', form.value.partyBAgent);
+          console.log('   - partyBPhoneFax:', form.value.partyBPhoneFax);
+          console.log('   - partyBBank:', form.value.partyBBank);
+          console.log('   - partyBAccount:', form.value.partyBAccount);
+          console.log('✅ 已自动填充客户开票信息到需方信息');
+        }
       } else {
         // 如果没有开票信息,使用客户基本信息
         console.log('⚠️ 该客户暂无开票信息,使用客户基本信息');
+        if (isPartiesSwapped.value) {
+          // 已调换:客户名称对应供方信息区域(partyA)
+          form.value.partyA = customer.customerName;
+          form.value.partyAAddress = fullAddress;
+          form.value.partyALegalPerson = '';
+          form.value.partyAAgent = '';
+          form.value.partyAPhoneFax = customer.telephone || '';
+          form.value.partyABank = '';
+          form.value.partyAAccount = '';
+        } else {
+          // 未调换:客户名称对应需方信息区域(partyB)
+          form.value.partyB = customer.customerName;
+          form.value.partyBAddress = fullAddress;
+          form.value.partyBLegalPerson = '';
+          form.value.partyBAgent = '';
+          form.value.partyBPhoneFax = customer.telephone || '';
+          form.value.partyBBank = '';
+          form.value.partyBAccount = '';
+        }
+      }
+      console.log('====================================');
+    } catch (error) {
+      console.error('❌ 获取客户开票信息失败:', error);
+      // 如果获取开票信息失败,使用客户基本信息
+      if (isPartiesSwapped.value) {
+        // 已调换:客户名称对应供方信息区域(partyA)
+        form.value.partyA = customer.customerName;
+        form.value.partyAAddress = fullAddress;
+        form.value.partyALegalPerson = '';
+        form.value.partyAAgent = '';
+        form.value.partyAPhoneFax = customer.telephone || '';
+        form.value.partyABank = '';
+        form.value.partyAAccount = '';
+      } else {
+        // 未调换:客户名称对应需方信息区域(partyB)
         form.value.partyB = customer.customerName;
         form.value.partyBAddress = fullAddress;
         form.value.partyBLegalPerson = '';
@@ -827,22 +880,18 @@ const handleCustomerConfirm = async (customer: CustomerVO) => {
         form.value.partyBBank = '';
         form.value.partyBAccount = '';
       }
-      console.log('====================================');
-    } catch (error) {
-      console.error('❌ 获取客户开票信息失败:', error);
-      // 如果获取开票信息失败,使用客户基本信息
-      form.value.partyB = customer.customerName;
-      form.value.partyBAddress = fullAddress;
-      form.value.partyBLegalPerson = '';
-      form.value.partyBAgent = '';
-      form.value.partyBPhoneFax = customer.telephone || '';
-      form.value.partyBBank = '';
-      form.value.partyBAccount = '';
     }
 
     // 初始化联系人字段(后面会自动填充主联系人)
-    form.value.partyBContact = '';
-    form.value.partyBMobile = customer.mobile || customer.telephone || '';
+    if (isPartiesSwapped.value) {
+      // 已调换:客户名称对应供方信息区域(partyA)
+      form.value.partyAContact = '';
+      form.value.partyAMobile = customer.mobile || customer.telephone || '';
+    } else {
+      // 未调换:客户名称对应需方信息区域(partyB)
+      form.value.partyBContact = '';
+      form.value.partyBMobile = customer.mobile || customer.telephone || '';
+    }
     form.value.contactsName = '';
     form.value.contactsPhone = customer.mobile || customer.telephone || '';
 
@@ -860,9 +909,16 @@ const handleCustomerConfirm = async (customer: CustomerVO) => {
         form.value.contactsName = contact.contactName;
         form.value.contactsPhone = contact.mobile || contact.telephone || '';
 
-        // 同步到乙方联系人
-        form.value.partyBContact = contact.contactName;
-        form.value.partyBMobile = contact.mobile || contact.telephone || '';
+        // 根据调换状态同步到对应的联系人字段
+        if (isPartiesSwapped.value) {
+          // 已调换:客户名称对应供方信息区域(partyA)
+          form.value.partyAContact = contact.contactName;
+          form.value.partyAMobile = contact.mobile || contact.telephone || '';
+        } else {
+          // 未调换:客户名称对应需方信息区域(partyB)
+          form.value.partyBContact = contact.contactName;
+          form.value.partyBMobile = contact.mobile || contact.telephone || '';
+        }
       }
     } catch (error) {
       console.error('获取客户联系人失败:', error);
@@ -890,9 +946,16 @@ const handleContactConfirm = (contact: ContactVO) => {
     form.value.contactsName = contact.contactName;
     form.value.contactsPhone = contact.mobile || contact.telephone || '';
 
-    // 同步到乙方联系人
-    form.value.partyBContact = contact.contactName;
-    form.value.partyBMobile = contact.mobile || contact.telephone || '';
+    // 根据调换状态同步到对应的联系人字段
+    if (isPartiesSwapped.value) {
+      // 已调换:客户名称对应供方信息区域(partyA)
+      form.value.partyAContact = contact.contactName;
+      form.value.partyAMobile = contact.mobile || contact.telephone || '';
+    } else {
+      // 未调换:客户名称对应需方信息区域(partyB)
+      form.value.partyBContact = contact.contactName;
+      form.value.partyBMobile = contact.mobile || contact.telephone || '';
+    }
 
     // 触发联系人字段的验证
     formRef.value?.validateField('contactId');
@@ -940,8 +1003,14 @@ const handleQuoteConfirm = (quote: QuoteVO) => {
       form.value.contactId = quote.contactId;
       form.value.contactsName = quote.contactName || '';
 
-      // 同步到乙方联系人
-      form.value.partyBContact = quote.contactName || '';
+      // 根据调换状态同步到对应的联系人字段
+      if (isPartiesSwapped.value) {
+        // 已调换:客户名称对应供方信息区域(partyA)
+        form.value.partyAContact = quote.contactName || '';
+      } else {
+        // 未调换:客户名称对应需方信息区域(partyB)
+        form.value.partyBContact = quote.contactName || '';
+      }
     }
 
     // 自动带出产品明细
@@ -994,31 +1063,55 @@ const handleUserConfirm = (user: UserVO) => {
 /** 供方主体变化处理 */
 const handleSupplierChange = async (supplierId: number | undefined) => {
   if (!supplierId) {
-    // 清空供方主体时,清空供方信息
-    form.value.partyA = '';
-    form.value.partyAAddress = '';
-    form.value.partyALegalPerson = '';
-    form.value.partyAAgent = '';
-    form.value.partyAPhoneFax = '';
-    form.value.partyABank = '';
-    form.value.partyAAccount = '';
+    // 清空供方主体时,根据调换状态清空对应的信息区域
+    if (isPartiesSwapped.value) {
+      // 已调换:供方主体对应需方信息区域(partyB)
+      form.value.partyB = '';
+      form.value.partyBAddress = '';
+      form.value.partyBLegalPerson = '';
+      form.value.partyBAgent = '';
+      form.value.partyBPhoneFax = '';
+      form.value.partyBBank = '';
+      form.value.partyBAccount = '';
+    } else {
+      // 未调换:供方主体对应供方信息区域(partyA)
+      form.value.partyA = '';
+      form.value.partyAAddress = '';
+      form.value.partyALegalPerson = '';
+      form.value.partyAAgent = '';
+      form.value.partyAPhoneFax = '';
+      form.value.partyABank = '';
+      form.value.partyAAccount = '';
+    }
     return;
   }
-  
-  const supplier = supplierList.value.find(s => s.id === supplierId);
+
+  const supplier = supplierList.value.find((s) => s.id === supplierId);
   if (supplier) {
-    // 自动填充供方信息
-    form.value.partyA = supplier.supplierName || '';
-    form.value.partyAAddress = supplier.supplierAddress || '';
-    form.value.partyALegalPerson = supplier.legalPerson || '';
-    form.value.partyAAgent = supplier.agent || '';
-    form.value.partyAPhoneFax = supplier.phoneFax || '';
-    form.value.partyABank = supplier.bankName || '';
-    form.value.partyAAccount = supplier.bankAccount || '';
-    
+    // 根据调换状态决定填充到哪个区域
+    if (isPartiesSwapped.value) {
+      // 已调换:供方主体对应需方信息区域(partyB)
+      form.value.partyB = supplier.supplierName || '';
+      form.value.partyBAddress = supplier.supplierAddress || '';
+      form.value.partyBLegalPerson = supplier.legalPerson || '';
+      form.value.partyBAgent = supplier.agent || '';
+      form.value.partyBPhoneFax = supplier.phoneFax || '';
+      form.value.partyBBank = supplier.bankName || '';
+      form.value.partyBAccount = supplier.bankAccount || '';
+    } else {
+      // 未调换:供方主体对应供方信息区域(partyA)
+      form.value.partyA = supplier.supplierName || '';
+      form.value.partyAAddress = supplier.supplierAddress || '';
+      form.value.partyALegalPerson = supplier.legalPerson || '';
+      form.value.partyAAgent = supplier.agent || '';
+      form.value.partyAPhoneFax = supplier.phoneFax || '';
+      form.value.partyABank = supplier.bankName || '';
+      form.value.partyAAccount = supplier.bankAccount || '';
+    }
+
     // 更新合同编号中的供方编码
     updateContractNoBySupplier(supplier.supplierCode);
-    
+
     // 更新合同名称中的供方简称
     updateContractNameBySupplier(supplier.shortName);
   }
@@ -1033,12 +1126,12 @@ const updateContractNoBySupplier = (newSupplierCode: string | undefined) => {
   if (!form.value.contractNo || !newSupplierCode) {
     return;
   }
-  
+
   // 匹配格式:{供方编码}/X-JT + 日期 + 流水号
   // 例如:SX/X-JT20250926002
   const contractNoPattern = /^([A-Z]+)\/X-JT(\d{8})(\d{3})$/;
   const match = form.value.contractNo.match(contractNoPattern);
-  
+
   if (match) {
     // 替换供方编码部分
     const oldSupplierCode = match[1];
@@ -1066,80 +1159,66 @@ const updateContractNameBySupplier = (newSupplierShortName: string | undefined)
   if (!form.value.contractName || !newSupplierShortName) {
     return;
   }
-  
+
   const contractName = form.value.contractName;
   const contractType = form.value.contractType;
-  
+
   // 提取合同编号(在括号中,支持中文和英文括号)
   const contractNoMatch = contractName.match(/[((](.+?)[))]$/);
   const contractNo = contractNoMatch ? contractNoMatch[1] : '';
-  
+
   // 提取合同名称主体部分(去掉括号和合同编号)
-  const nameBody = contractNoMatch 
-    ? contractName.substring(0, contractNoMatch.index).trim()
-    : contractName.trim();
-  
+  const nameBody = contractNoMatch ? contractName.substring(0, contractNoMatch.index).trim() : contractName.trim();
+
   // 常见的供方简称列表(用于识别和替换)
   const commonSupplierNames = ['山峡', 'SX'];
-  
+
   // 根据合同类型解析和替换
   if (contractType === 'sale') {
     // 销售合同格式:供方简称-客户简称(合同编号)
     // 例如:山峡-客户A(SX/X-JT20250926002)
-    const parts = nameBody.split('-').map(p => p.trim());
+    const parts = nameBody.split('-').map((p) => p.trim());
     if (parts.length >= 2) {
       // 替换第一个部分(供方简称)
       parts[0] = newSupplierShortName;
       const newNameBody = parts.join('-');
-      form.value.contractName = contractNo 
-        ? `${newNameBody}(${contractNo})`
-        : newNameBody;
+      form.value.contractName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
     } else if (parts.length === 1) {
       // 如果只有一个部分,判断是否是供方简称
-      const isSupplierName = commonSupplierNames.some(name => parts[0].includes(name));
+      const isSupplierName = commonSupplierNames.some((name) => parts[0].includes(name));
       if (isSupplierName) {
         // 是供方简称,替换它
-        form.value.contractName = contractNo
-          ? `${newSupplierShortName}(${contractNo})`
-          : newSupplierShortName;
+        form.value.contractName = contractNo ? `${newSupplierShortName}(${contractNo})` : newSupplierShortName;
       } else {
         // 可能是客户简称,保持原样,在前面添加供方简称
-        form.value.contractName = contractNo
-          ? `${newSupplierShortName}-${parts[0]}(${contractNo})`
-          : `${newSupplierShortName}-${parts[0]}`;
+        form.value.contractName = contractNo ? `${newSupplierShortName}-${parts[0]}(${contractNo})` : `${newSupplierShortName}-${parts[0]}`;
       }
     }
   } else if (contractType === 'purchase') {
     // 采购合同格式:客户简称-供方简称(合同编号)
     // 例如:客户A-山峡(SX/X-JT20250926002)
-    const parts = nameBody.split('-').map(p => p.trim());
+    const parts = nameBody.split('-').map((p) => p.trim());
     if (parts.length >= 2) {
       // 替换最后一个部分(供方简称)
       parts[parts.length - 1] = newSupplierShortName;
       const newNameBody = parts.join('-');
-      form.value.contractName = contractNo
-        ? `${newNameBody}(${contractNo})`
-        : newNameBody;
+      form.value.contractName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
     } else if (parts.length === 1) {
       // 如果只有一个部分,判断是否是供方简称
-      const isSupplierName = commonSupplierNames.some(name => parts[0].includes(name));
+      const isSupplierName = commonSupplierNames.some((name) => parts[0].includes(name));
       if (isSupplierName) {
         // 是供方简称,替换它
-        form.value.contractName = contractNo
-          ? `${newSupplierShortName}(${contractNo})`
-          : newSupplierShortName;
+        form.value.contractName = contractNo ? `${newSupplierShortName}(${contractNo})` : newSupplierShortName;
       } else {
         // 可能是客户简称,保持原样,在后面添加供方简称
-        form.value.contractName = contractNo
-          ? `${parts[0]}-${newSupplierShortName}(${contractNo})`
-          : `${parts[0]}-${newSupplierShortName}`;
+        form.value.contractName = contractNo ? `${parts[0]}-${newSupplierShortName}(${contractNo})` : `${parts[0]}-${newSupplierShortName}`;
       }
     }
   } else {
     // 其他类型,尝试替换所有可能的供方简称
     let updatedName = contractName;
     let replaced = false;
-    
+
     for (const oldName of commonSupplierNames) {
       if (updatedName.includes(oldName)) {
         // 使用正则替换,保持格式
@@ -1148,7 +1227,7 @@ const updateContractNameBySupplier = (newSupplierShortName: string | undefined)
         break;
       }
     }
-    
+
     // 如果没有找到已知的供方简称,尝试在名称开头或结尾查找
     if (!replaced && nameBody) {
       // 检查是否以常见供方简称开头或结尾
@@ -1164,17 +1243,14 @@ const updateContractNameBySupplier = (newSupplierShortName: string | undefined)
         }
       }
     }
-    
+
     form.value.contractName = updatedName;
   }
-  
+
   // 如果合同编号已更新,同步更新合同名称中的合同编号
   if (contractNo && form.value.contractNo && contractNo !== form.value.contractNo) {
     // 替换合同名称中的旧合同编号
-    form.value.contractName = form.value.contractName.replace(
-      /[((].+?[))]$/,
-      `(${form.value.contractNo})`
-    );
+    form.value.contractName = form.value.contractName.replace(/[((].+?[))]$/, `(${form.value.contractNo})`);
   }
 };
 
@@ -1188,74 +1264,60 @@ const updateContractNameByCustomer = (newCustomerShortName: string | undefined)
   if (!form.value.contractName || !newCustomerShortName) {
     return;
   }
-  
+
   const contractName = form.value.contractName;
   const contractType = form.value.contractType;
-  
+
   // 提取合同编号(在括号中,支持中文和英文括号)
   const contractNoMatch = contractName.match(/[((](.+?)[))]$/);
   const contractNo = contractNoMatch ? contractNoMatch[1] : '';
-  
+
   // 提取合同名称主体部分(去掉括号和合同编号)
-  const nameBody = contractNoMatch 
-    ? contractName.substring(0, contractNoMatch.index).trim()
-    : contractName.trim();
-  
+  const nameBody = contractNoMatch ? contractName.substring(0, contractNoMatch.index).trim() : contractName.trim();
+
   // 常见的供方简称列表(用于识别,避免误替换)
   const commonSupplierNames = ['山峡', 'SX'];
-  
+
   // 根据合同类型解析和替换
   if (contractType === 'sale') {
     // 销售合同格式:供方简称-客户简称(合同编号)
     // 例如:山峡-客户A(SX/X-JT20250926002)
-    const parts = nameBody.split('-').map(p => p.trim());
+    const parts = nameBody.split('-').map((p) => p.trim());
     if (parts.length >= 2) {
       // 替换第二个部分(客户简称)
       parts[1] = newCustomerShortName;
       const newNameBody = parts.join('-');
-      form.value.contractName = contractNo 
-        ? `${newNameBody}(${contractNo})`
-        : newNameBody;
+      form.value.contractName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
     } else if (parts.length === 1) {
       // 如果只有一个部分,判断是否是供方简称
-      const isSupplierName = commonSupplierNames.some(name => parts[0].includes(name));
+      const isSupplierName = commonSupplierNames.some((name) => parts[0].includes(name));
       if (isSupplierName) {
         // 是供方简称,在后面添加客户简称
-        form.value.contractName = contractNo
-          ? `${parts[0]}-${newCustomerShortName}(${contractNo})`
-          : `${parts[0]}-${newCustomerShortName}`;
+        form.value.contractName = contractNo ? `${parts[0]}-${newCustomerShortName}(${contractNo})` : `${parts[0]}-${newCustomerShortName}`;
       } else {
         // 可能是客户简称,替换它,但需要添加供方简称
         // 这里保持原样,只替换客户简称部分(如果当前没有供方简称,则只更新客户简称)
-        form.value.contractName = contractNo
-          ? `${newCustomerShortName}(${contractNo})`
-          : newCustomerShortName;
+        form.value.contractName = contractNo ? `${newCustomerShortName}(${contractNo})` : newCustomerShortName;
       }
     }
   } else if (contractType === 'purchase') {
     // 采购合同格式:客户简称-供方简称(合同编号)
     // 例如:客户A-山峡(SX/X-JT20250926002)
-    const parts = nameBody.split('-').map(p => p.trim());
+    const parts = nameBody.split('-').map((p) => p.trim());
     if (parts.length >= 2) {
       // 替换第一个部分(客户简称)
       parts[0] = newCustomerShortName;
       const newNameBody = parts.join('-');
-      form.value.contractName = contractNo
-        ? `${newNameBody}(${contractNo})`
-        : newNameBody;
+      form.value.contractName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
     } else if (parts.length === 1) {
       // 如果只有一个部分,判断是否是供方简称
-      const isSupplierName = commonSupplierNames.some(name => parts[0].includes(name));
+      const isSupplierName = commonSupplierNames.some((name) => parts[0].includes(name));
       if (isSupplierName) {
         // 是供方简称,在前面添加客户简称
-        form.value.contractName = contractNo
-          ? `${newCustomerShortName}-${parts[0]}(${contractNo})`
-          : `${newCustomerShortName}-${parts[0]}`;
+        form.value.contractName = contractNo ? `${newCustomerShortName}-${parts[0]}(${contractNo})` : `${newCustomerShortName}-${parts[0]}`;
       } else {
         // 可能是客户简称,替换它
-        form.value.contractName = contractNo
-          ? `${newCustomerShortName}(${contractNo})`
-          : newCustomerShortName;
+        form.value.contractName = contractNo ? `${newCustomerShortName}(${contractNo})` : newCustomerShortName;
       }
     }
   } else {
@@ -1263,7 +1325,7 @@ const updateContractNameByCustomer = (newCustomerShortName: string | undefined)
     // 策略:如果名称中包含已知的供方简称,则替换另一个部分;否则尝试替换非供方简称的部分
     let updatedName = contractName;
     let replaced = false;
-    
+
     // 先检查是否包含供方简称
     let supplierNameInBody = '';
     for (const supplierName of commonSupplierNames) {
@@ -1272,59 +1334,52 @@ const updateContractNameByCustomer = (newCustomerShortName: string | undefined)
         break;
       }
     }
-    
+
     if (supplierNameInBody) {
       // 如果包含供方简称,替换另一个部分
-      const parts = nameBody.split('-').map(p => p.trim());
+      const parts = nameBody.split('-').map((p) => p.trim());
       if (parts.length >= 2) {
         // 找到供方简称的位置并替换另一个部分
-        const supplierIndex = parts.findIndex(p => p.includes(supplierNameInBody));
+        const supplierIndex = parts.findIndex((p) => p.includes(supplierNameInBody));
         const customerIndex = supplierIndex === 0 ? 1 : 0;
         parts[customerIndex] = newCustomerShortName;
         const newNameBody = parts.join('-');
-        updatedName = contractNo
-          ? `${newNameBody}(${contractNo})`
-          : newNameBody;
+        updatedName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
         replaced = true;
       }
     }
-    
+
     // 如果没有替换成功,尝试直接替换非供方简称的部分
     if (!replaced && nameBody) {
-      const parts = nameBody.split('-').map(p => p.trim());
+      const parts = nameBody.split('-').map((p) => p.trim());
       if (parts.length >= 2) {
         // 替换第一个部分(假设是客户简称)
         parts[0] = newCustomerShortName;
         const newNameBody = parts.join('-');
-        updatedName = contractNo
-          ? `${newNameBody}(${contractNo})`
-          : newNameBody;
-      } else if (parts.length === 1 && !commonSupplierNames.some(name => parts[0].includes(name))) {
+        updatedName = contractNo ? `${newNameBody}(${contractNo})` : newNameBody;
+      } else if (parts.length === 1 && !commonSupplierNames.some((name) => parts[0].includes(name))) {
         // 如果只有一个部分且不是供方简称,则替换它
-        updatedName = contractNo
-          ? `${newCustomerShortName}(${contractNo})`
-          : newCustomerShortName;
+        updatedName = contractNo ? `${newCustomerShortName}(${contractNo})` : newCustomerShortName;
       }
     }
-    
+
     form.value.contractName = updatedName;
   }
-  
+
   // 如果合同编号已更新,同步更新合同名称中的合同编号
   if (contractNo && form.value.contractNo && contractNo !== form.value.contractNo) {
     // 替换合同名称中的旧合同编号
-    form.value.contractName = form.value.contractName.replace(
-      /[((].+?[))]$/,
-      `(${form.value.contractNo})`
-    );
+    form.value.contractName = form.value.contractName.replace(/[((].+?[))]$/, `(${form.value.contractNo})`);
   }
 };
 
 /** 供需方调换 */
-const handleSwapParties = () => {
-  // 交换供方和需方的所有信息(包括supplierId)
+const handleSwapParties = async () => {
+  // 保存当前的供方主体ID(调换时保持不变)
+  const currentSupplierId = form.value.supplierId;
+
+  // 交换供方和需方的所有信息(不包括supplierId)
   const temp = {
-    supplierId: form.value.supplierId,
     partyA: form.value.partyA,
     partyAAddress: form.value.partyAAddress,
     partyAContact: form.value.partyAContact,
@@ -1335,9 +1390,6 @@ const handleSwapParties = () => {
     partyABank: form.value.partyABank,
     partyAAccount: form.value.partyAAccount
   };
-
-  // 注意:调换时,supplierId应该清空,因为需方信息来自客户开票信息,不是供方主体
-  form.value.supplierId = undefined;
   form.value.partyA = form.value.partyB;
   form.value.partyAAddress = form.value.partyBAddress;
   form.value.partyAContact = form.value.partyBContact;
@@ -1361,6 +1413,11 @@ const handleSwapParties = () => {
   // 切换调换状态
   isPartiesSwapped.value = !isPartiesSwapped.value;
 
+  // 如果存在供方主体,根据新的调换状态重新填充对应的信息区域
+  if (currentSupplierId) {
+    await handleSupplierChange(currentSupplierId);
+  }
+
   proxy?.$modal.msgSuccess('供需方信息已调换');
 };
 
@@ -1368,7 +1425,8 @@ const handleSwapParties = () => {
 const handleContractTypeChange = (value: string) => {
   // 当选择采购合同时,自动调换供需方
   if (value === 'purchase' && !isPartiesSwapped.value) {
-    proxy?.$modal.confirm('检测到您选择了采购合同,系统将自动调换供需方信息,是否继续?')
+    proxy?.$modal
+      .confirm('检测到您选择了采购合同,系统将自动调换供需方信息,是否继续?')
       .then(() => {
         handleSwapParties();
       })
@@ -1385,7 +1443,7 @@ const handleContractTemplateChange = (value: string) => {
     ElMessage({
       message: '使用客户模版时,必须上传合同附件!',
       type: 'warning',
-      duration: 3000  // 3秒后自动消失
+      duration: 3000 // 3秒后自动消失
     });
   }
 };
@@ -1542,7 +1600,7 @@ const calculateTotalAmount = () => {
 const handleAttachmentData = async () => {
   console.log('[附件回显] 开始处理附件数据');
   console.log('[附件回显] attachmentFiles:', form.value.attachmentFiles);
-  
+
   if (!form.value.attachmentFiles || form.value.attachmentFiles.trim() === '') {
     console.log('[附件回显] attachmentFiles为空,跳过处理');
     attachmentList.value = [];
@@ -1623,22 +1681,22 @@ const handleAttachmentData = async () => {
 /** 文件类型判断 */
 const isImageFile = (file: any) => {
   const imageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp'];
-  
+
   // 1. 检查 raw.type(新上传的文件)
   if (file.raw?.type && imageTypes.includes(file.raw.type)) {
     return true;
   }
-  
+
   // 2. 检查文件名扩展名
   if (file.name && /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(file.name)) {
     return true;
   }
-  
+
   // 3. 检查 URL 扩展名(回显的文件)
   if (file.url && /\.(jpg|jpeg|png|gif|bmp|webp)(\?|$)/i.test(file.url)) {
     return true;
   }
-  
+
   return false;
 };
 
@@ -1930,7 +1988,7 @@ const handleSubmit = async () => {
   // 检查合同模版为"客户模版"时,必须上传附件
   if (form.value.contractTemplate === 'customer') {
     console.log('🔍 检查附件列表:', attachmentList.value);
-    const hasAttachments = attachmentList.value.some(file => file.status === 'success' && file.ossId);
+    const hasAttachments = attachmentList.value.some((file) => file.status === 'success' && file.ossId);
     console.log('✅ 是否有有效附件:', hasAttachments);
     if (!hasAttachments) {
       ElMessage.warning({
@@ -1944,10 +2002,10 @@ const handleSubmit = async () => {
   // 根据合同类型决定是否需要校验产品信息
   console.log('当前合同类型:', form.value.contractType);
   console.log('合同类型判断:', form.value.contractType === 'sale', form.value.contractType === 'purchase');
-  
+
   const requiresProducts = form.value.contractType === 'sale' || form.value.contractType === 'purchase';
   console.log('是否需要强制产品:', requiresProducts);
-  
+
   if (requiresProducts) {
     // 销售合同和采购合同必须至少添加一个产品
     if (!form.value.products || form.value.products.length === 0) {
@@ -2128,15 +2186,17 @@ const loadSupplierList = async () => {
   try {
     const res = await listAllSupplierInfo({ status: '0' }); // 只加载正常状态的供方
     supplierList.value = res.data || [];
+    return res.data || [];
   } catch (error) {
     console.error('加载供方信息列表失败:', error);
+    return [];
   }
 };
 
-onMounted(() => {
+onMounted(async () => {
   // 加载供方信息列表
-  loadSupplierList();
-  
+  await loadSupplierList();
+
   const id = route.query.id as string;
   if (id) {
     loadContractDetail(id); // 保持字符串类型,避免精度丢失
@@ -2144,6 +2204,14 @@ onMounted(() => {
     // 设置默认值
     form.value.signDate = new Date().toISOString().split('T')[0];
     // TODO: 设置当前用户为负责人
+
+    // 设置默认供方主体为"SX"(根据供方编码匹配)
+    const defaultSupplier = supplierList.value.find((supplier) => supplier.supplierCode === 'SX');
+    if (defaultSupplier) {
+      form.value.supplierId = defaultSupplier.id;
+      // 触发供方主体变化处理,自动填充供方信息
+      await handleSupplierChange(defaultSupplier.id);
+    }
   }
 });
 </script>
@@ -2333,7 +2401,7 @@ onMounted(() => {
 .upload-thumb-image {
   width: 100%;
   height: 100%;
-  
+
   :deep(.el-image) {
     width: 100%;
     height: 100%;