This commit is contained in:
2026-08-28 02:10:54 +08:00
parent 3482d03905
commit 17bbde81b2
5 changed files with 140 additions and 44 deletions
+73 -17
View File
@@ -48,6 +48,7 @@
>
<el-tab-pane label="应付" name="payable">
<formal-settlement-table-panel
:key="activeSettlementType"
:rows="rows"
:columns="columns"
:loading="loading"
@@ -65,6 +66,7 @@
</el-tab-pane>
<el-tab-pane label="应收" name="receivable">
<formal-settlement-table-panel
:key="activeSettlementType"
:rows="rows"
:columns="columns"
:loading="loading"
@@ -96,7 +98,31 @@
class="formal-payment-dialog"
>
<section-card title="付款信息">
<el-form :model="paymentDialog.form" label-position="right" label-width="auto">
<template v-if="paymentDialog.rows.length > 1">
<div class="formal-payment-dialog__batch-tip">
已选择 {{ paymentDialog.rows.length }} 条同合同应付正式结算单请确认各单申请金额
</div>
<el-table :data="paymentDialog.rows" border>
<el-table-column prop="formalSettlementNo" label="结算单号" min-width="160" />
<el-table-column label="剩余可申请金额" min-width="150" align="right">
<template #default="{ row }">{{
formatMoney(paymentRemaining(row), row.currency)
}}</template>
</el-table-column>
<el-table-column label="申请付款金额" min-width="150" align="right">
<template #default="{ row }">
<el-input-number
v-model="row.appliedAmount"
:min="0.01"
:max="paymentRemaining(row)"
:precision="2"
:controls="false"
/>
</template>
</el-table-column>
</el-table>
</template>
<el-form v-else :model="paymentDialog.form" label-position="right" label-width="auto">
<el-form-item label="结算单号">{{
paymentDialog.row.formalSettlementNo || '-'
}}</el-form-item>
@@ -180,6 +206,7 @@ export default {
visible: false,
loading: false,
row: {},
rows: [],
form: { appliedAmount: 0, remark: '' },
},
};
@@ -193,11 +220,7 @@ export default {
return this.searchExpanded ? this.searchFields : this.searchFields.slice(0, 4);
},
paymentAvailable() {
return Math.max(
0,
Number(this.paymentDialog.row.settlementAmount || 0) -
Number(this.paymentDialog.row.appliedPaymentAmount || 0)
);
return this.paymentRemaining(this.paymentDialog.row);
},
},
watch: {
@@ -340,29 +363,52 @@ export default {
this.loadTable();
},
openPaymentDialog() {
const row = this.selectedOne('付款申请');
if (!row) return;
if (row.approvalStatus !== 'approved' || row.settlementType !== 'payable')
if (!this.selection.length) return this.$message.warning('请至少选择一条正式结算单');
const rows = this.selection;
if (rows.some(row => row.approvalStatus !== 'approved' || row.settlementType !== 'payable'))
return this.$message.warning('仅审批通过的应付正式结算单允许发起付款申请');
const contractIds = new Set(rows.map(row => String(row.contractId || '')));
if (rows.length > 1 && (contractIds.size !== 1 || contractIds.has('')))
return this.$message.warning('批量付款申请必须选择同一个合同的正式结算单');
const paymentRows = rows.map(row => ({ ...row, appliedAmount: this.paymentRemaining(row) }));
if (paymentRows.some(row => row.appliedAmount <= 0))
return this.$message.warning('所选正式结算单均须存在剩余可申请金额');
this.paymentDialog = {
visible: true,
loading: false,
row,
form: { appliedAmount: 0, remark: '' },
row: paymentRows[0],
rows: paymentRows,
form: {
appliedAmount: paymentRows.length === 1 ? paymentRows[0].appliedAmount : 0,
remark: '',
},
};
},
async submitPayment() {
if (Number(this.paymentDialog.form.appliedAmount || 0) <= 0)
const paymentRows = this.paymentDialog.rows;
if (paymentRows.length > 1) {
if (paymentRows.some(row => Number(row.appliedAmount || 0) <= 0))
return this.$message.warning('请输入各正式结算单的申请付款金额');
if (paymentRows.some(row => Number(row.appliedAmount) > this.paymentRemaining(row)))
return this.$message.warning('申请付款金额不能超过剩余可申请金额');
} else if (Number(this.paymentDialog.form.appliedAmount || 0) <= 0) {
return this.$message.warning('请输入申请付款金额');
}
this.paymentDialog.loading = true;
try {
const response = await api.applyPayment({
id: this.paymentDialog.row.id,
...this.paymentDialog.form,
});
const response =
paymentRows.length > 1
? await api.applyPayments({
items: paymentRows.map(row => ({ id: row.id, appliedAmount: row.appliedAmount })),
remark: this.paymentDialog.form.remark,
})
: await api.applyPayment({ id: this.paymentDialog.row.id, ...this.paymentDialog.form });
const data = this.unwrapData(response);
this.$message.success(`付款申请已生成:${data}`);
this.$message.success(
Array.isArray(data) ? `已生成 ${data.length} 条付款申请` : `付款申请已生成:${data}`
);
this.paymentDialog.visible = false;
this.selection = [];
this.loadTable();
} finally {
this.paymentDialog.loading = false;
@@ -474,6 +520,12 @@ export default {
formatMoney(value, currency = 'RMB') {
return `${Number(value || 0).toFixed(2)} ${currency || 'RMB'}`;
},
paymentRemaining(row) {
const remaining =
row?.remainingPayableAmount ??
Number(row?.settlementAmount || 0) - Number(row?.appliedPaymentAmount || 0);
return Math.max(0, Number(remaining || 0));
},
},
};
</script>
@@ -512,6 +564,10 @@ export default {
.formal-page__table-panel {
margin-top: 8px;
}
.formal-payment-dialog__batch-tip {
margin-bottom: 12px;
color: #606266;
}
.formal-page :deep(.el-table) {
--el-table-border-color: #eff1f7;
}