|
|
@@ -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%;
|