From 884cc4355fb9f74c5d4bab287bbc52922d421f64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com>
Date: Fri, 18 Sep 2026 20:42:52 +0800
Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5=E9=87=91=E8=9D=B6?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=BE=E5=AE=BD=E8=AF=B7=E6=B1=82=E8=B6=85?=
=?UTF-8?q?=E6=97=B6=EF=BC=8C=E4=BF=AE=E5=A4=8D=E9=95=BF=E8=80=97=E6=97=B6?=
=?UTF-8?q?=E6=8E=A8=E9=80=81=E6=88=90=E5=8A=9F=E4=BD=86=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=E6=97=A0=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/payment/invoiceApplication.js | 2 +-
src/api/payment/invoiceReceipt.js | 2 +-
src/api/payment/paymentApplication.js | 9 ++++++---
src/api/settlement/formalSettlement.js | 3 ++-
4 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/api/payment/invoiceApplication.js b/src/api/payment/invoiceApplication.js
index 3e0433f..28b7251 100644
--- a/src/api/payment/invoiceApplication.js
+++ b/src/api/payment/invoiceApplication.js
@@ -22,7 +22,7 @@ export const approve = data => request({ url: `${baseUrl}/approve`, method: 'pos
export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data });
export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data });
export const syncKingdee = id =>
- request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id } });
+ request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id }, timeout: 120000 });
export const invoiceTypeOptions = [
{ label: '电子专票', value: 'electronic_special' },
diff --git a/src/api/payment/invoiceReceipt.js b/src/api/payment/invoiceReceipt.js
index d4cf692..b0e1e01 100644
--- a/src/api/payment/invoiceReceipt.js
+++ b/src/api/payment/invoiceReceipt.js
@@ -26,7 +26,7 @@ export const approve = data => request({ url: `${baseUrl}/approve`, method: 'pos
export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data });
export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data });
export const syncKingdee = id =>
- request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id } });
+ request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id }, timeout: 120000 });
export const approvalStatusOptions = [
{ label: '草稿', value: 'draft' },
diff --git a/src/api/payment/paymentApplication.js b/src/api/payment/paymentApplication.js
index 7bbbbc5..5cb8c42 100644
--- a/src/api/payment/paymentApplication.js
+++ b/src/api/payment/paymentApplication.js
@@ -16,12 +16,15 @@ export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post'
export const approve = data => request({ url: `${baseUrl}/approve`, method: 'post', data });
export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data });
export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data });
+// 同步金蝶涉及多次金蝶远程接口调用(A103-2 预检 + A103-1/A103-3 推送),单笔可达 20s+,覆盖全局 10s 超时
export const syncKingdee = id =>
- request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id } });
+ request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id }, timeout: 120000 });
+// 批量同步逐单单据级事务串行推送,耗时随单量线性增长
export const syncKingdeeBatch = ids =>
- request({ url: `${baseUrl}/sync-kingdee-batch`, method: 'post', data: ids });
+ request({ url: `${baseUrl}/sync-kingdee-batch`, method: 'post', data: ids, timeout: 300000 });
+// 回写任务按 paymentNo 分批远程查询 A103-2/A103-4,同样可能超过全局超时
export const syncKingdeeResult = () =>
- request({ url: `${baseUrl}/sync-kingdee-result`, method: 'post' });
+ request({ url: `${baseUrl}/sync-kingdee-result`, method: 'post', timeout: 300000 });
export const paymentTypeOptions = [
{ label: '项目预付', value: 'project_advance' },
diff --git a/src/api/settlement/formalSettlement.js b/src/api/settlement/formalSettlement.js
index 50e8810..5b43fbb 100644
--- a/src/api/settlement/formalSettlement.js
+++ b/src/api/settlement/formalSettlement.js
@@ -30,8 +30,9 @@ export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post'
export const approve = data => request({ url: `${baseUrl}/approve`, method: 'post', data });
export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data });
export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data });
+// 同步金蝶涉及多次金蝶远程接口调用(A102-4 预检 + A102-2 保存),可达 20s+,覆盖全局 10s 超时
export const syncKingdee = id =>
- request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id } });
+ request({ url: `${baseUrl}/sync-kingdee`, method: 'post', params: { id }, timeout: 120000 });
export const getDetailFees = detailId =>
request({ url: `${baseUrl}/detail-fees`, method: 'get', params: { detailId } });
export const getReceiptClaims = formalSettlementId =>
From aabe67e4d6d0d596d4afed2011d17758b6a81125 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com>
Date: Thu, 24 Sep 2026 13:27:41 +0800
Subject: [PATCH 2/3] =?UTF-8?q?:sparkles:=20=E9=87=91=E8=9D=B6=E9=99=84?=
=?UTF-8?q?=E4=BB=B6=E5=90=8C=E6=AD=A5=EF=BC=88A902=EF=BC=89=E5=89=8D?=
=?UTF-8?q?=E7=AB=AF=EF=BC=9A=E5=9B=9B=E9=A1=B5=E9=9D=A2=E9=99=84=E4=BB=B6?=
=?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=88=97=E3=80=81=E9=87=8D=E6=8E=A8=E8=A1=A5?=
=?UTF-8?q?=E4=BC=A0=E6=8F=90=E7=A4=BA=E4=B8=8E=E6=94=B6=E7=A5=A8=E6=8E=A8?=
=?UTF-8?q?=E9=80=81=E8=B6=85=E6=97=B6=E6=94=BE=E5=AE=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/payment/invoiceReceipt.js | 3 ++-
src/option/payment/invoiceApplication.js | 1 +
src/option/payment/invoiceReceipt.js | 1 +
src/option/payment/paymentApplication.js | 1 +
.../settlement/formalSettlementTable.js | 1 +
src/views/payment/invoice-application.vue | 13 ++++++++++++-
src/views/payment/invoice-receipt.vue | 9 +++++++--
src/views/payment/payment-application.vue | 19 +++++++++++++++++--
src/views/settlement/formal-settlement.vue | 11 ++++++++++-
9 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/src/api/payment/invoiceReceipt.js b/src/api/payment/invoiceReceipt.js
index c78b5c9..883f131 100644
--- a/src/api/payment/invoiceReceipt.js
+++ b/src/api/payment/invoiceReceipt.js
@@ -26,7 +26,8 @@ export const approve = data => request({ url: `${baseUrl}/approve`, method: 'pos
export const returnBill = data => request({ url: `${baseUrl}/return`, method: 'post', data });
export const voidBill = data => request({ url: `${baseUrl}/void`, method: 'post', data });
export const pushKingdee = ids =>
- request({ url: `${baseUrl}/push-kingdee`, method: 'post', data: ids });
+ // 推送联带 A902 附件上传(登记附件 + 镜像发票文件下载回传),耗时较普通接口长,放宽到 120s
+ request({ url: `${baseUrl}/push-kingdee`, method: 'post', data: ids, timeout: 120000 });
export const approvalStatusOptions = [
{ label: '草稿', value: 'draft' },
diff --git a/src/option/payment/invoiceApplication.js b/src/option/payment/invoiceApplication.js
index a2cef3c..2e7d138 100644
--- a/src/option/payment/invoiceApplication.js
+++ b/src/option/payment/invoiceApplication.js
@@ -13,6 +13,7 @@ export const invoiceApplicationTableColumns = [
{ prop: 'currentProcessor', label: '当前处理人', minWidth: 130 },
{ prop: 'kingdeeBillNo', label: '金蝶单据号', minWidth: 150 },
{ prop: 'kingdeeStatusName', label: '金蝶单据状态', minWidth: 140 },
+ { prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 },
];
export const invoiceApplicationDetailColumns = [
diff --git a/src/option/payment/invoiceReceipt.js b/src/option/payment/invoiceReceipt.js
index 8a65835..add059a 100644
--- a/src/option/payment/invoiceReceipt.js
+++ b/src/option/payment/invoiceReceipt.js
@@ -14,4 +14,5 @@ export const invoiceReceiptTableColumns = [
{ prop: 'kingdeeReceivedInvoiceNo', label: '金蝶单据号', minWidth: 150 },
{ prop: 'kingdeePushStatusName', label: '金蝶状态', minWidth: 130 },
{ prop: 'kingdeePushMsg', label: '失败原因', minWidth: 160 },
+ { prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 },
];
diff --git a/src/option/payment/paymentApplication.js b/src/option/payment/paymentApplication.js
index ed650f7..fdb7227 100644
--- a/src/option/payment/paymentApplication.js
+++ b/src/option/payment/paymentApplication.js
@@ -17,4 +17,5 @@ export const paymentApplicationTableColumns = [
{ prop: 'currentProcessor', label: '当前处理人', minWidth: 120 },
{ prop: 'kingdeeBillNo', label: '金蝶单据号', minWidth: 130 },
{ prop: 'kingdeeStatusName', label: '金蝶单据状态', minWidth: 130 },
+ { prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 },
];
diff --git a/src/option/settlement/formalSettlementTable.js b/src/option/settlement/formalSettlementTable.js
index c3562c2..4cb9012 100644
--- a/src/option/settlement/formalSettlementTable.js
+++ b/src/option/settlement/formalSettlementTable.js
@@ -21,6 +21,7 @@ export const formalSettlementTableColumns = [
{ label: '当前处理人', prop: 'currentProcessor', minWidth: 130 },
{ label: '金蝶单据号', prop: 'kingdeeBillNo', minWidth: 150 },
{ label: '金蝶单据状态', prop: 'kingdeeSyncStatus', minWidth: 135 },
+ { label: '附件同步', prop: 'attachmentSyncStatusName', minWidth: 100 },
{ label: '创建人', prop: 'createUserName', minWidth: 110 },
{ label: '创建时间', prop: 'createTime', minWidth: 170 },
];
diff --git a/src/views/payment/invoice-application.vue b/src/views/payment/invoice-application.vue
index b701546..b62ea09 100644
--- a/src/views/payment/invoice-application.vue
+++ b/src/views/payment/invoice-application.vue
@@ -406,7 +406,18 @@ export default {
}
await Promise.all(rows.map(row => api.syncKingdee(row.id)));
this.$message.success(`已同步${rows.length}条开票申请`);
- this.loadTable();
+ await this.loadTable();
+ // 附件联带同步提示:同步成功但附件未全部上传时追加 warning,重推即自动补传
+ const idSet = new Set(rows.map(row => String(row.id)));
+ const pendingCount = (this.rows || []).filter(row => idSet.has(String(row.id))
+ && ['pending', 'partial'].includes(row.attachmentSyncStatus)).length;
+ if (pendingCount) {
+ this.$message({
+ type: 'warning',
+ message: `其中${pendingCount}单附件未全部上传,可重推补传`,
+ duration: 8000,
+ });
+ }
},
async handleExport() {
const data = this.unwrapData(await api.getList(1, 100000, this.query));
diff --git a/src/views/payment/invoice-receipt.vue b/src/views/payment/invoice-receipt.vue
index a0774f6..e8cea4c 100644
--- a/src/views/payment/invoice-receipt.vue
+++ b/src/views/payment/invoice-receipt.vue
@@ -373,8 +373,13 @@ export default {
type: 'warning',
});
const summary = this.unwrapData(await api.pushKingdee(rows.map(row => row.id)));
- this.$alert(summary || '推送完成', '推送结果', { confirmButtonText: '知道了' });
- this.loadTable();
+ await this.loadTable();
+ // 附件联带同步提示:推送成功但附件未全部上传时在结果弹窗追加说明,重推即自动补传
+ const idSet = new Set(rows.map(row => String(row.id)));
+ const pendingCount = (this.rows || []).filter(row => idSet.has(String(row.id))
+ && ['pending', 'partial'].includes(row.attachmentSyncStatus)).length;
+ const attachmentTip = pendingCount ? `\n其中${pendingCount}单附件未全部上传,可重推补传` : '';
+ this.$alert((summary || '推送完成') + attachmentTip, '推送结果', { confirmButtonText: '知道了' });
},
async handleExport() {
const data = this.unwrapData(await api.getList(1, 100000, this.query));
diff --git a/src/views/payment/payment-application.vue b/src/views/payment/payment-application.vue
index 42bffc8..2328865 100644
--- a/src/views/payment/payment-application.vue
+++ b/src/views/payment/payment-application.vue
@@ -395,7 +395,8 @@ export default {
async handleSyncRow(row) {
const data = this.unwrapData(await api.syncKingdee(row.id));
this.$message.success(`已生成金蝶付款单:${data}`);
- this.loadTable();
+ await this.loadTable();
+ this.warnAttachmentNotUploaded([row.id]);
},
async handleSync() {
const rows = this.selection.filter(row => row.approvalStatus === 'approved');
@@ -414,7 +415,21 @@ export default {
} else {
this.$message.success(`已同步${data.length}条付款申请`);
}
- this.loadTable();
+ await this.loadTable();
+ this.warnAttachmentNotUploaded(rows.map(row => row.id));
+ },
+ // 附件联带同步提示:同步成功但附件未全部上传时追加 warning,重推即自动补传
+ warnAttachmentNotUploaded(ids) {
+ const idSet = new Set(ids.map(String));
+ const pendingCount = (this.rows || []).filter(row => idSet.has(String(row.id))
+ && ['pending', 'partial'].includes(row.attachmentSyncStatus)).length;
+ if (pendingCount) {
+ this.$message({
+ type: 'warning',
+ message: `其中${pendingCount}单附件未全部上传,可重推补传`,
+ duration: 8000,
+ });
+ }
},
async handleSyncResult() {
const data = this.unwrapData(await api.syncKingdeeResult());
diff --git a/src/views/settlement/formal-settlement.vue b/src/views/settlement/formal-settlement.vue
index 002b5d5..e588155 100644
--- a/src/views/settlement/formal-settlement.vue
+++ b/src/views/settlement/formal-settlement.vue
@@ -379,7 +379,16 @@ export default {
const response = await api.syncKingdee(row.id);
const data = this.unwrapData(response);
this.$message.success(`同步成功,金蝶单据号:${data}`);
- this.loadTable();
+ await this.loadTable();
+ // 附件联带同步提示:同步成功但附件未全部上传时追加 warning,重推即自动补传
+ const freshRow = (this.rows || []).find(item => String(item.id) === String(row.id));
+ if (freshRow && ['pending', 'partial'].includes(freshRow.attachmentSyncStatus)) {
+ this.$message({
+ type: 'warning',
+ message: '该单附件未全部上传,可重推补传',
+ duration: 8000,
+ });
+ }
},
async openPaymentDialog() {
if (!this.selection.length) return this.$message.warning('请至少选择一条正式结算单');
From f49f36fb6038b6f143db760d4a3360a9c6833e3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com>
Date: Sun, 27 Sep 2026 21:17:59 +0800
Subject: [PATCH 3/3] =?UTF-8?q?:sparkles:=20=E9=87=91=E8=9D=B6=E9=99=84?=
=?UTF-8?q?=E4=BB=B6=E4=B8=8B=E8=BD=BD=EF=BC=88A801-2=EF=BC=89=E5=89=8D?=
=?UTF-8?q?=E7=AB=AF=EF=BC=9A=E7=A5=A8=E6=B1=A0=E5=BC=B9=E7=AA=97/?=
=?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=BB=93=E7=AE=97/=E4=BB=98=E6=AC=BE?=
=?UTF-8?q?=E7=94=B3=E8=AF=B7=E4=B8=89=E5=85=A5=E5=8F=A3=E9=99=84=E4=BB=B6?=
=?UTF-8?q?=E6=9F=A5=E7=9C=8B=E4=B8=8B=E8=BD=BD=E4=B8=8E=E7=B1=BB=E5=9E=8B?=
=?UTF-8?q?=E5=88=86=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/payment/invoiceReceipt.js | 9 ++
.../kingdee-invoice-pool-dialog/main.vue | 70 +++++++++++++++
src/utils/kingdee-attachment.js | 90 +++++++++++++++++++
.../payment/payment-application-form.vue | 50 +++++++++--
.../components/formal-settlement-editor.vue | 49 +++++++++-
5 files changed, 259 insertions(+), 9 deletions(-)
create mode 100644 src/utils/kingdee-attachment.js
diff --git a/src/api/payment/invoiceReceipt.js b/src/api/payment/invoiceReceipt.js
index 883f131..1cb8775 100644
--- a/src/api/payment/invoiceReceipt.js
+++ b/src/api/payment/invoiceReceipt.js
@@ -7,6 +7,15 @@ export const getList = (current, size, params) =>
export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } });
export const queryInvoicePool = params =>
request({ url: `${baseUrl}/invoice-pool`, method: 'get', params });
+export const downloadInvoicePoolAttachment = invoiceNo =>
+ // 金蝶票池发票文件下载(后端代理 A801-2 流式回源),耗时较普通接口长,放宽到 120s
+ request({
+ url: `${baseUrl}/invoice-pool/attachment/download`,
+ method: 'get',
+ params: { invoiceNo },
+ responseType: 'blob',
+ timeout: 120000,
+ });
export const getSettlementCandidates = (keyword, receiptId) =>
request({
url: `${baseUrl}/settlement-candidates`,
diff --git a/src/components/kingdee-invoice-pool-dialog/main.vue b/src/components/kingdee-invoice-pool-dialog/main.vue
index dcca443..9ccc3ba 100644
--- a/src/components/kingdee-invoice-pool-dialog/main.vue
+++ b/src/components/kingdee-invoice-pool-dialog/main.vue
@@ -104,6 +104,24 @@
未登记
+
+
+ 查看
+ 下载
+
+
选择
@@ -126,6 +144,12 @@