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 @@ 未登记 + + +