feat: 付款结算单选收票单全额认领并新增发票登记推送指定应付
This commit is contained in:
@@ -98,6 +98,79 @@
|
||||
></template
|
||||
>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 先票后款路径B:结算单审批后发票登记(关联收票单 → 确认推送指定应付) -->
|
||||
<el-dialog
|
||||
v-model="invoiceRegisterDialog.visible"
|
||||
title="发票登记"
|
||||
width="86%"
|
||||
append-to-body
|
||||
class="invoice-register-dialog"
|
||||
>
|
||||
<section-card title="结算基本信息">
|
||||
<el-descriptions :column="4" border size="small">
|
||||
<el-descriptions-item label="结算单号">
|
||||
{{ invoiceRegisterDialog.row.formalSettlementNo || '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="结算总金额">
|
||||
{{ formatMoney(invoiceRegisterDialog.row.settlementAmount, invoiceRegisterDialog.row.currency) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="已匹配发票金额">
|
||||
{{ formatMoney(invoiceRegisterDialog.row.invoiceAmount, invoiceRegisterDialog.row.currency) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="金蝶同步状态">
|
||||
{{ kingdeeSyncName(invoiceRegisterDialog.row.kingdeeSyncStatus) }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</section-card>
|
||||
<section-card title="认领收票单">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
:disabled="invoiceRegisterDialog.saving"
|
||||
@click="candidatesDialog.visible = true"
|
||||
>选择收票单</el-button
|
||||
>
|
||||
<el-table :data="invoiceRegisterDialog.candidates" border class="invoice-register-dialog__table">
|
||||
<el-table-column type="index" label="序号" width="64" align="center" />
|
||||
<el-table-column prop="invoiceNo" label="发票号" min-width="160" align="center" />
|
||||
<el-table-column prop="invoiceDate" label="开票日期" min-width="120" align="center" />
|
||||
<el-table-column prop="invoiceType" label="发票类型" min-width="140" align="center" />
|
||||
<el-table-column prop="issuerName" label="开票单位(销方)" min-width="170" show-overflow-tooltip />
|
||||
<el-table-column label="发票金额(含税)" min-width="140" align="right">
|
||||
<template #default="{ row }">{{ formatMoney(row.invoiceAmount) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="匹配结算单金额" min-width="150" align="right">
|
||||
<template #default="{ row }">{{ formatMoney(row.invoiceAmount) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="90" fixed="right" align="center">
|
||||
<template #default="{ $index }">
|
||||
<el-link
|
||||
type="danger"
|
||||
:disabled="invoiceRegisterDialog.saving"
|
||||
@click="invoiceRegisterDialog.candidates.splice($index, 1)"
|
||||
>移除</el-link
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</section-card>
|
||||
<template #footer>
|
||||
<el-button @click="invoiceRegisterDialog.visible = false">取消</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
:loading="invoiceRegisterDialog.saving"
|
||||
:disabled="!invoiceRegisterDialog.candidates.length"
|
||||
@click="submitInvoiceRegister"
|
||||
>保存认领</el-button
|
||||
>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<invoice-receipt-candidates-dialog
|
||||
v-model="candidatesDialog.visible"
|
||||
@confirm="addInvoiceRegisterCandidates"
|
||||
/>
|
||||
</basic-container>
|
||||
</template>
|
||||
|
||||
@@ -113,16 +186,17 @@ import { isAdministrator } from '@/utils/auth';
|
||||
import { downloadFile } from '@/utils/util';
|
||||
import * as api from '@/api/settlement/formalSettlement';
|
||||
import * as paymentApi from '@/api/payment/paymentApplication';
|
||||
import { formalSettlementOption } from '@/option/settlement/formalSettlement';
|
||||
import { formalSettlementOption, kingdeeSyncName } from '@/option/settlement/formalSettlement';
|
||||
import organizationSearch from '@/mixins/organization-search';
|
||||
import FormalSettlementEditor from './components/formal-settlement-editor.vue';
|
||||
import FormalSettlementTablePanel from './components/formal-settlement-table-panel.vue';
|
||||
import InvoiceReceiptCandidatesDialog from './components/invoice-receipt-candidates-dialog.vue';
|
||||
import { submitMkApprovalFlow, loadMkEnabled } from '@/utils/mk-approval';
|
||||
import { getMKApprovalUrl } from '@/api/system/business-process';
|
||||
|
||||
export default {
|
||||
name: 'FormalSettlement',
|
||||
components: { FormalSettlementEditor, FormalSettlementTablePanel },
|
||||
components: { FormalSettlementEditor, FormalSettlementTablePanel, InvoiceReceiptCandidatesDialog },
|
||||
mixins: [organizationSearch],
|
||||
props: {
|
||||
/** 菜单拆分后锁定结算类型:payable=付款结算单,receivable=收款结算单 */
|
||||
@@ -151,6 +225,16 @@ export default {
|
||||
rows: [],
|
||||
form: { appliedAmount: 0, remark: '' },
|
||||
},
|
||||
// 先票后款路径B:发票登记(关联收票单 + 确认推送指定应付)
|
||||
invoiceRegisterDialog: {
|
||||
visible: false,
|
||||
saving: false,
|
||||
row: {},
|
||||
candidates: [],
|
||||
},
|
||||
candidatesDialog: {
|
||||
visible: false,
|
||||
},
|
||||
mkEnabled: false,
|
||||
// keep-alive 多标签下仅激活实例响应 detailNo,避免缓存页重复弹窗
|
||||
isPageActive: true,
|
||||
@@ -297,6 +381,7 @@ export default {
|
||||
return: () => this.handleReturn(row),
|
||||
void: () => this.handleVoid(row),
|
||||
print: () => this.handlePrint(row),
|
||||
invoiceRegister: () => this.openInvoiceRegisterDialog(row),
|
||||
};
|
||||
(handlers[type] || (() => {}))();
|
||||
},
|
||||
@@ -596,6 +681,58 @@ export default {
|
||||
this.paymentDialog.loading = false;
|
||||
}
|
||||
},
|
||||
// 先票后款路径B:发票登记——认领收票单(claim-invoices 走增量认领并同步收票侧关系)
|
||||
openInvoiceRegisterDialog(row) {
|
||||
this.invoiceRegisterDialog.row = row || {};
|
||||
this.invoiceRegisterDialog.candidates = [];
|
||||
this.invoiceRegisterDialog.visible = true;
|
||||
},
|
||||
addInvoiceRegisterCandidates(rows) {
|
||||
const existing = new Set(
|
||||
this.invoiceRegisterDialog.candidates.map(item => String(item.invoiceNo))
|
||||
);
|
||||
const added = rows.filter(row => !existing.has(String(row.invoiceNo)));
|
||||
if (!added.length) {
|
||||
this.$message.warning('所选收票单均已登记');
|
||||
return;
|
||||
}
|
||||
// 全额认领:匹配金额固定=发票金额
|
||||
this.invoiceRegisterDialog.candidates.push(
|
||||
...added.map(row => ({ ...row, matchedAmount: Number(row.invoiceAmount || 0) }))
|
||||
);
|
||||
},
|
||||
async submitInvoiceRegister() {
|
||||
const settlement = this.invoiceRegisterDialog.row;
|
||||
const invoices = this.invoiceRegisterDialog.candidates.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),
|
||||
}));
|
||||
this.invoiceRegisterDialog.saving = true;
|
||||
try {
|
||||
await api.claimInvoices({ formalSettlementId: settlement.id, invoices });
|
||||
this.invoiceRegisterDialog.visible = false;
|
||||
this.onLoad(this.page);
|
||||
try {
|
||||
await this.$confirm('是否将发票匹配数据推送金蝶?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
});
|
||||
} catch {
|
||||
this.$message.info('已保存认领,未推送金蝶');
|
||||
return;
|
||||
}
|
||||
const data = this.unwrapData(await api.invoiceAssignKingdee(settlement.id));
|
||||
this.$message.success(data || '发票登记推送金蝶成功');
|
||||
this.onLoad(this.page);
|
||||
} finally {
|
||||
this.invoiceRegisterDialog.saving = false;
|
||||
}
|
||||
},
|
||||
handlePrint(row) {
|
||||
if (!row) {
|
||||
row = this.selectedOne('打印');
|
||||
|
||||
Reference in New Issue
Block a user