feat: 付款结算单选收票单全额认领并新增发票登记推送指定应付

This commit is contained in:
刘泉佳
2026-10-31 16:07:12 +08:00
parent 441d62a874
commit 46e7952e49
5 changed files with 359 additions and 10 deletions
@@ -440,8 +440,15 @@
/>
<section-card title="发票信息">
<div class="formal-editor__invoice-claim">
<el-button type="primary" @click="openInvoiceClaimDialog">认领查询</el-button>
<div v-if="editable" class="formal-editor__invoice-claim">
<!-- 先票后款:付款结算单选审批通过的收票单(全额认领);收款结算单维持原票池认领 -->
<el-button
v-if="form.settlementType !== 'receivable'"
type="primary"
@click="openInvoiceReceiptDialog"
>选择收票单</el-button
>
<el-button v-else type="primary" @click="openInvoiceClaimDialog">认领查询</el-button>
</div>
<el-table :data="invoices" border>
<el-table-column type="index" label="序号" width="64" align="center" />
@@ -452,11 +459,6 @@
<el-table-column prop="invoiceType" label="发票类型" min-width="150" align="center">
<template #default="{ row }">{{ displayValue(row.invoiceType) }}</template>
</el-table-column>
<el-table-column prop="taxRate" label="税率" min-width="100" align="center">
<template #default="{ row }">
{{ row.taxRate === null || row.taxRate === undefined ? '-' : `${row.taxRate}%` }}
</template>
</el-table-column>
<el-table-column
prop="invoiceAmount"
label="发票金额(含税)"
@@ -480,8 +482,9 @@
align="center"
>
<template #default="{ row }">
<!-- 先票后款:收票单认领金额固定=发票金额(全额认领),不可改 -->
<el-input-number
v-if="editable"
v-if="editable && form.settlementType === 'receivable'"
v-model="row.matchedAmount"
:min="0"
:max="Number(row.availableInvoiceAmount || 0)"
@@ -546,6 +549,11 @@
@confirm="handleInvoiceClaimConfirm"
/>
<invoice-receipt-candidates-dialog
v-model="invoiceReceiptDialog.visible"
@confirm="handleInvoiceReceiptConfirm"
/>
<section-card
v-if="readonly"
:title="form.settlementType === 'receivable' ? '收款信息' : '付款信息'"
@@ -1068,6 +1076,7 @@ import {
settlementDetailPath,
} from '@/utils/settlement-detail-link';
import { getBfiExchangeRate } from '@/api/base/currency';
import InvoiceReceiptCandidatesDialog from './invoice-receipt-candidates-dialog.vue';
import {
createFormalSettlementForm,
formalSettlementFormFields,
@@ -1110,6 +1119,7 @@ export default {
components: {
InfoFilled,
KingdeeInvoicePoolDialog,
InvoiceReceiptCandidatesDialog,
ChangeRecordDetailDialog,
ProjectAdvanceWriteOff,
},
@@ -1158,6 +1168,10 @@ export default {
selected: [],
confirming: false,
},
// 先票后款:付款结算单选收票单(审批通过+未认领)弹窗
invoiceReceiptDialog: {
visible: false,
},
attachmentUploadFiles: [],
attachmentTypeOptions: [],
attachmentFileTypes: [
@@ -2651,6 +2665,39 @@ export default {
openInvoiceClaimDialog() {
this.invoiceClaimDialog.visible = true;
},
// 先票后款:选收票单(审批通过+未被认领),确认后按发票号全额认领
openInvoiceReceiptDialog() {
this.invoiceReceiptDialog.visible = true;
},
async handleInvoiceReceiptConfirm(rows) {
// 收票单行 → 结算单发票行:匹配金额固定=发票金额(全额认领),附件契约归一为单数 attachmentJson
const invoices = rows.map(row => ({
...row,
attachmentJson: row.attachmentJson || row.attachmentsJson,
invoiceType: row.invoiceType || '',
taxRate: row.taxRate ?? null,
availableInvoiceAmount: Number(row.invoiceAmount || 0),
matchedAmount: Number(row.invoiceAmount || 0),
}));
if (!this.form.id) {
const existingNumbers = new Set(this.invoices.map(item => String(item.invoiceNo)));
this.invoices = [
...this.invoices,
...invoices.filter(row => !existingNumbers.has(String(row.invoiceNo))),
];
this.$message.success(`已选择${invoices.length}条收票单,保存正式结算单后生效`);
return;
}
const existingNumbers = new Set(this.invoices.map(item => String(item.invoiceNo)));
const newInvoices = invoices.filter(row => !existingNumbers.has(String(row.invoiceNo)));
if (!newInvoices.length) {
this.$message.warning('所选收票单均已认领');
return;
}
await claimInvoicesApi({ formalSettlementId: this.form.id, invoices: newInvoices });
await this.loadFormalDetail(this.form.id);
this.$message.success('收票单认领成功,已同步正式结算单及关联付款单据');
},
invoicePoolQueryApi(params) {
return queryInvoicePool(params);
},