🐛 修复预付驳回重提、预结算变更记录与收票多选结算单
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -852,6 +852,8 @@ export default {
|
||||
billOptions: [],
|
||||
billLoading: false,
|
||||
billDialogVisible: false,
|
||||
settlementPayerName: '',
|
||||
settlementPayeeName: '',
|
||||
billQuery: {
|
||||
keyword: '',
|
||||
},
|
||||
@@ -1221,8 +1223,12 @@ export default {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
if (selected.billType && selected.billType !== 'received') {
|
||||
callback(new Error('汇票付款仅可选择收票类型的汇票'));
|
||||
if (
|
||||
selected.billType &&
|
||||
selected.billType !== 'received' &&
|
||||
!this.billMatchesSettlementParties(selected)
|
||||
) {
|
||||
callback(new Error('汇票付款仅可选择收票类型,或出票单位与收票单位均为当前结算收付款方的汇票'));
|
||||
return;
|
||||
}
|
||||
if (selected.maturityDate) {
|
||||
@@ -1580,6 +1586,7 @@ export default {
|
||||
this.createInvoiceRows(item.invoices || [], item.formalSettlementNo || item.settlementNo)
|
||||
),
|
||||
});
|
||||
this.rememberSettlementParties(first.payerName, first.payeeName);
|
||||
this.paymentRecords = rows.flatMap(item =>
|
||||
(item.paymentRecords || item.paymentApplications || []).map(record => ({
|
||||
...record,
|
||||
@@ -1667,7 +1674,11 @@ export default {
|
||||
? 0
|
||||
: Number(row.payableAmount || 0);
|
||||
return {
|
||||
id: row.preSettlementId || (isPre ? row.settlementId : null) || row.settlementId || row.id,
|
||||
id:
|
||||
row.preSettlementId ||
|
||||
(isPre ? row.settlementId : null) ||
|
||||
row.settlementId ||
|
||||
(row.paymentNo ? null : row.id),
|
||||
settlementNo: row.preSettlementNo || row.formalSettlementNo || row.settlementNo || '',
|
||||
referenceType: isPre ? 'pre' : 'formal',
|
||||
settlementAmount: Number(Number(settlementAmount || 0).toFixed(2)),
|
||||
@@ -1868,6 +1879,7 @@ export default {
|
||||
paymentRatio,
|
||||
appliedAmount: headerAppliedAmount,
|
||||
});
|
||||
this.rememberSettlementParties(first.payerName, first.payeeName);
|
||||
this.paymentRecords = [];
|
||||
this.clearReceiptAccount();
|
||||
await this.fillBillTypeFromContract(first.contractId, true);
|
||||
@@ -2063,12 +2075,31 @@ export default {
|
||||
},
|
||||
resolveAttachmentMaterial(file, materials = Object.values(ATTACHMENT_MATERIALS)) {
|
||||
if (!this.attachmentFileUrl(file)) return null;
|
||||
const typeMatched = (materials || []).find(
|
||||
material => file.attachmentType === MATERIAL_TYPE_MAP[material.key]
|
||||
);
|
||||
const typeText = String(file.attachmentType || file.type || '')
|
||||
.trim()
|
||||
.toLocaleLowerCase();
|
||||
const typeMatched = (materials || []).find(material => {
|
||||
if (file.attachmentType === MATERIAL_TYPE_MAP[material.key]) return true;
|
||||
if (!typeText) return false;
|
||||
const label = String(material.label || '').toLocaleLowerCase();
|
||||
return (
|
||||
typeText === label ||
|
||||
material.keywords.some(keyword => {
|
||||
const normalizedKeyword = String(keyword).toLocaleLowerCase();
|
||||
return normalizedKeyword && typeText.includes(normalizedKeyword);
|
||||
})
|
||||
);
|
||||
});
|
||||
return typeMatched || this.matchAttachmentMaterialByFileName(file, materials);
|
||||
},
|
||||
mergeAutomaticAttachments(files, materials, sourceName, defaultMaterial = null, sourceKey = '') {
|
||||
mergeAutomaticAttachments(
|
||||
files,
|
||||
materials,
|
||||
sourceName,
|
||||
defaultMaterial = null,
|
||||
sourceKey = '',
|
||||
keepUnmatched = false
|
||||
) {
|
||||
const existingUrls = new Set(
|
||||
(this.form.attachments || []).map(file => this.attachmentFileUrl(file)).filter(Boolean)
|
||||
);
|
||||
@@ -2077,16 +2108,20 @@ export default {
|
||||
file,
|
||||
material: this.resolveAttachmentMaterial(file, materials) || defaultMaterial,
|
||||
}))
|
||||
.filter(item => item.material && !existingUrls.has(this.attachmentFileUrl(item.file)))
|
||||
.filter(item => {
|
||||
const url = this.attachmentFileUrl(item.file);
|
||||
return Boolean(url) && !existingUrls.has(url) && (item.material || keepUnmatched);
|
||||
})
|
||||
.map(({ file, material }) => {
|
||||
existingUrls.add(this.attachmentFileUrl(file));
|
||||
const url = this.attachmentFileUrl(file);
|
||||
existingUrls.add(url);
|
||||
return {
|
||||
...file,
|
||||
originalName: this.attachmentFileName(file),
|
||||
name: this.attachmentFileName(file),
|
||||
url: this.attachmentFileUrl(file),
|
||||
link: file.link || this.attachmentFileUrl(file),
|
||||
attachmentType: MATERIAL_TYPE_MAP[material.key],
|
||||
url,
|
||||
link: file.link || url,
|
||||
attachmentType: material ? MATERIAL_TYPE_MAP[material.key] : 'other',
|
||||
description: file.description || `自动取自${sourceName}`,
|
||||
sourceImported: true,
|
||||
sourceKey: sourceKey || undefined,
|
||||
@@ -2119,11 +2154,7 @@ export default {
|
||||
},
|
||||
/** 按当前结算单附件整批同步:先清旧关联,再写入新结算单上传的附件 */
|
||||
syncSettlementAttachments(settlementRows = []) {
|
||||
const settlementMaterials = [
|
||||
ATTACHMENT_MATERIALS.weighingSlip,
|
||||
ATTACHMENT_MATERIALS.entrustOrder,
|
||||
ATTACHMENT_MATERIALS.settlement,
|
||||
];
|
||||
const settlementMaterials = Object.values(ATTACHMENT_MATERIALS);
|
||||
const settlementFiles = (settlementRows || []).flatMap(row => this.parse(row.attachmentsJson));
|
||||
const nextUrlSet = new Set(
|
||||
settlementFiles.map(file => this.attachmentFileUrl(file)).filter(Boolean)
|
||||
@@ -2140,7 +2171,8 @@ export default {
|
||||
settlementMaterials,
|
||||
'结算单',
|
||||
null,
|
||||
'settlement'
|
||||
'settlement',
|
||||
true
|
||||
);
|
||||
this.linkedSettlementAttachmentUrls = imported
|
||||
.map(file => this.attachmentFileUrl(file))
|
||||
@@ -2547,7 +2579,13 @@ export default {
|
||||
try {
|
||||
this.billOptions =
|
||||
this.unwrapData(
|
||||
await billLedgerApi.getAvailableOptions(keyword, this.form.deptId, selectedId)
|
||||
await billLedgerApi.getAvailableOptions(
|
||||
keyword,
|
||||
this.form.deptId,
|
||||
selectedId,
|
||||
this.settlementPayerName,
|
||||
this.settlementPayeeName
|
||||
)
|
||||
) || [];
|
||||
} finally {
|
||||
this.billLoading = false;
|
||||
@@ -2569,7 +2607,9 @@ export default {
|
||||
this.billPage.size,
|
||||
String(this.billQuery.keyword || '').trim() || undefined,
|
||||
this.form.deptId,
|
||||
this.form.billLedgerId
|
||||
this.form.billLedgerId,
|
||||
this.settlementPayerName,
|
||||
this.settlementPayeeName
|
||||
);
|
||||
const data = this.unwrapData(response) || {};
|
||||
this.billRows = data.records || [];
|
||||
@@ -2590,9 +2630,27 @@ export default {
|
||||
this.billPage.current = 1;
|
||||
this.loadBillPage();
|
||||
},
|
||||
rememberSettlementParties(payerName, payeeName) {
|
||||
this.settlementPayerName = String(payerName || '').trim();
|
||||
this.settlementPayeeName = String(payeeName || '').trim();
|
||||
},
|
||||
billMatchesSettlementParties(row) {
|
||||
const issuer = String(row?.issuerName || '').trim();
|
||||
const receiver = String(row?.receiverName || '').trim();
|
||||
const payer = this.settlementPayerName;
|
||||
const payee = this.settlementPayeeName;
|
||||
if (!issuer || !receiver || !payer || !payee) return false;
|
||||
return (
|
||||
(issuer === payer && receiver === payee) || (issuer === payee && receiver === payer)
|
||||
);
|
||||
},
|
||||
selectBill(row) {
|
||||
if (row?.billType && row.billType !== 'received') {
|
||||
ElMessage.warning('汇票付款仅可选择收票类型的汇票');
|
||||
if (
|
||||
row?.billType &&
|
||||
row.billType !== 'received' &&
|
||||
!this.billMatchesSettlementParties(row)
|
||||
) {
|
||||
ElMessage.warning('汇票付款仅可选择收票类型,或出票单位与收票单位均为当前结算收付款方的汇票');
|
||||
return;
|
||||
}
|
||||
if (row?.maturityDate) {
|
||||
@@ -2848,6 +2906,7 @@ export default {
|
||||
payerName: row.payerName,
|
||||
payeeName: '',
|
||||
});
|
||||
this.rememberSettlementParties(row.payerName, row.payeeName);
|
||||
this.referenceVisible = false;
|
||||
this.refreshReferenceValidation();
|
||||
const detail = this.unwrapData(detailResponse);
|
||||
@@ -2930,6 +2989,7 @@ export default {
|
||||
payerName: row.payerName,
|
||||
payeeName: '',
|
||||
});
|
||||
this.rememberSettlementParties(row.payerName, row.payeeName);
|
||||
this.referenceVisible = false;
|
||||
this.refreshReferenceValidation();
|
||||
const detail = this.unwrapData(detailResponse);
|
||||
@@ -3147,6 +3207,14 @@ export default {
|
||||
: resolvedPreSettlementId
|
||||
? [resolvedPreSettlementId]
|
||||
: [];
|
||||
const preSettlementNo = usePreSettlementOnly
|
||||
? this.form.preSettlementNo ||
|
||||
(this.referenceRows || [])
|
||||
.filter(item => item.referenceType === 'pre')
|
||||
.map(item => item.settlementNo)
|
||||
.filter(Boolean)
|
||||
.join('、')
|
||||
: this.form.preSettlementNo;
|
||||
return {
|
||||
id,
|
||||
paymentType,
|
||||
@@ -3154,6 +3222,7 @@ export default {
|
||||
settlementIds: usePreSettlementOnly ? [] : settlementIds,
|
||||
preSettlementId: usePreSettlementOnly ? resolvedPreSettlementId : preSettlementId,
|
||||
preSettlementIds: usePreSettlementOnly ? resolvedPreSettlementIds : preSettlementIds,
|
||||
preSettlementNo,
|
||||
projectId,
|
||||
projectName,
|
||||
deptId,
|
||||
|
||||
Reference in New Issue
Block a user