diff --git a/src/api/payment/paymentApplication.js b/src/api/payment/paymentApplication.js index 4a64416..a3fde86 100644 --- a/src/api/payment/paymentApplication.js +++ b/src/api/payment/paymentApplication.js @@ -34,6 +34,15 @@ export const syncKingdeeBatch = ids => // 回写任务按 paymentNo 分批远程查询 A103-2/A103-4,同样可能超过全局超时 export const syncKingdeeResult = () => request({ url: `${baseUrl}/sync-kingdee-result`, method: 'post', timeout: APPROVE_TIMEOUT }); +// 付款记录付款凭证下载(后端代理 A801-2 流式回源),耗时较普通接口长,放宽到 120s +export const downloadRecordVoucher = recordId => + request({ + url: `${baseUrl}/record/download-voucher`, + method: 'get', + params: { recordId }, + responseType: 'blob', + timeout: 120000, + }); export const paymentTypeOptions = [ { label: '项目预付', value: 'project_advance' }, diff --git a/src/components/kingdee-invoice-pool-dialog/main.vue b/src/components/kingdee-invoice-pool-dialog/main.vue index 7b0449c..4c2b1ab 100644 --- a/src/components/kingdee-invoice-pool-dialog/main.vue +++ b/src/components/kingdee-invoice-pool-dialog/main.vue @@ -1,8 +1,8 @@ + @@ -172,8 +177,8 @@ -
- 按名称检索范围为已同步票,未找到请改用发票号码或税号精确查找 +
+ 按名称检索范围为已同步票,未找到请改用发票号码或税号精确查找 diff --git a/src/option/payment/invoiceReceipt.js b/src/option/payment/invoiceReceipt.js index add059a..ddc030d 100644 --- a/src/option/payment/invoiceReceipt.js +++ b/src/option/payment/invoiceReceipt.js @@ -12,7 +12,7 @@ export const invoiceReceiptTableColumns = [ { prop: 'createUserName', label: '创建人', minWidth: 110 }, { prop: 'createTime', label: '创建时间', minWidth: 170 }, { prop: 'kingdeeReceivedInvoiceNo', label: '金蝶单据号', minWidth: 150 }, - { prop: 'kingdeePushStatusName', label: '金蝶状态', minWidth: 130 }, + { prop: 'kingdeePushStatusName', label: '金蝶状态', minWidth: 130, kingdeeStatus: true }, { prop: 'kingdeePushMsg', label: '失败原因', minWidth: 160 }, { prop: 'attachmentSyncStatusName', label: '附件同步', minWidth: 100 }, ]; diff --git a/src/utils/kingdee-attachment.js b/src/utils/kingdee-attachment.js index a7ac977..ab16107 100644 --- a/src/utils/kingdee-attachment.js +++ b/src/utils/kingdee-attachment.js @@ -21,16 +21,17 @@ export const isKingdeePathAttachment = attachment => { }; /** - * 请求金蝶文件流:成功返回 Blob;业务失败为 HTTP 200 + R.fail JSON(响应通道未写流时后端即失败), - * 按 Content-Type 识别并抛出带 msg 的错误;网络级失败拦截器已提示,标记 silent 避免重复提示。 + * 请求金蝶文件流(公共核):成功返回 Blob;业务失败为 HTTP 200 + R.fail JSON + * (响应通道未写流时后端即失败),按 Content-Type 识别并抛出带 msg 的错误; + * 网络级失败拦截器已提示,标记 silent 避免重复提示。 * 供查看(弹窗内预览)/下载两类入口复用 - * @param {String} invoiceNo 发票号码 + * @param {Function} fetcher 文件流请求函数(返回 axios blob 响应) * @returns {Promise} */ -export const requestKingdeeFile = async invoiceNo => { +const fetchKingdeeBlob = async fetcher => { let res; try { - res = await downloadInvoicePoolAttachment(invoiceNo); + res = await fetcher(); } catch (error) { throw Object.assign(new Error(error?.message || '附件下载失败'), { silent: true }); } @@ -51,6 +52,45 @@ export const requestKingdeeFile = async invoiceNo => { return blob; }; +/** + * 请求金蝶文件流:票池发票按发票号回源(后端代理 A801-2) + * @param {String} invoiceNo 发票号码 + * @returns {Promise} + */ +export const requestKingdeeFile = invoiceNo => fetchKingdeeBlob(() => downloadInvoicePoolAttachment(invoiceNo)); + +/** + * 下载金蝶侧附件(经 A801-2 后端代理,公共入口),失败统一 ElMessage 提示 + * @param {Function} fetcher 文件流请求函数 + * @param {String} fileName 下载文件名 + */ +export const downloadKingdeeFile = async (fetcher, fileName) => { + try { + const blob = await fetchKingdeeBlob(fetcher); + downloadFile(blob, fileName); + } catch (error) { + if (!error?.silent) ElMessage.error(error?.message || '金蝶附件下载失败'); + } +}; + +/** + * 新窗口预览金蝶侧附件(经 A801-2 后端代理,公共入口):拉取 Blob 转 objectURL + * (PDF 可预览;OFD 等浏览器不可预览的格式由浏览器触发下载) + * @param {Function} fetcher 文件流请求函数 + * @param {String} fileName 预览文件名 + */ +export const viewKingdeeFile = async (fetcher, fileName) => { + try { + const blob = await fetchKingdeeBlob(fetcher); + const url = URL.createObjectURL(blob); + window.open(url, '_blank'); + // 延迟释放 objectURL:立即回收可能导致新窗口尚未加载完成即失效 + setTimeout(() => URL.revokeObjectURL(url), 60000); + } catch (error) { + if (!error?.silent) ElMessage.error(error?.message || '金蝶附件预览失败'); + } +}; + /** * 下载金蝶侧发票附件(经 A801-2 后端代理),失败统一 ElMessage 提示 * @param {String} invoiceNo 发票号码 @@ -61,12 +101,7 @@ export const downloadKingdeeInvoiceFile = async (invoiceNo, fileName) => { ElMessage.warning('当前发票缺少发票号码,无法下载金蝶侧附件'); return; } - try { - const blob = await requestKingdeeFile(invoiceNo); - downloadFile(blob, fileName || `${invoiceNo}.pdf`); - } catch (error) { - if (!error?.silent) ElMessage.error(error?.message || '金蝶附件下载失败'); - } + await downloadKingdeeFile(() => downloadInvoicePoolAttachment(invoiceNo), fileName || `${invoiceNo}.pdf`); }; /** @@ -79,13 +114,5 @@ export const viewKingdeeInvoiceFile = async (invoiceNo, fileName) => { ElMessage.warning('当前发票缺少发票号码,无法预览金蝶侧附件'); return; } - try { - const blob = await requestKingdeeFile(invoiceNo); - const url = URL.createObjectURL(blob); - window.open(url, '_blank'); - // 延迟释放 objectURL:立即回收可能导致新窗口尚未加载完成即失效 - setTimeout(() => URL.revokeObjectURL(url), 60000); - } catch (error) { - if (!error?.silent) ElMessage.error(error?.message || '金蝶附件预览失败'); - } + await viewKingdeeFile(() => downloadInvoicePoolAttachment(invoiceNo), fileName || `${invoiceNo}.pdf`); }; diff --git a/src/utils/kingdee.js b/src/utils/kingdee.js index 4a4f6ab..3f82010 100644 --- a/src/utils/kingdee.js +++ b/src/utils/kingdee.js @@ -14,6 +14,17 @@ export const KINGDEE_STATUS_TAG_TYPES = { /** 金蝶单据状态 → el-tag 颜色类型,未映射状态返回 info */ export const kingdeeStatusType = status => KINGDEE_STATUS_TAG_TYPES[status] || 'info'; +/** 收票登记推送状态 → el-tag 颜色类型(已指定应付=绿、已保存收票单=黄、推送失败=红、未推送=灰) */ +export const KINGDEE_PUSH_STATUS_TAG_TYPES = { + unsynced: 'info', + pushed: 'warning', + assigned: 'success', + failed: 'danger', +}; + +/** 收票登记推送状态 → el-tag 颜色类型,未映射状态返回 info */ +export const kingdeePushStatusType = status => KINGDEE_PUSH_STATUS_TAG_TYPES[status] || 'info'; + /** 金蝶冲销状态 → el-tag 颜色类型(已冲销=绿、未冲销=黄) */ export const KINGDEE_WRITEOFF_TAG_TYPES = { writtenoff: 'success', diff --git a/src/views/payment/invoice-receipt.vue b/src/views/payment/invoice-receipt.vue index 0a15cd8..7f17ab3 100644 --- a/src/views/payment/invoice-receipt.vue +++ b/src/views/payment/invoice-receipt.vue @@ -119,6 +119,9 @@ {{ displayValue(row[column.prop]) }} + + {{ displayValue(row[column.prop]) }} + {{ formatMoney(row[column.prop]) }} {{ displayValue(row[column.prop]) }} @@ -222,6 +225,7 @@ import TableHeaderTools from '@/components/table-header-tools/main.vue'; import organizationSearch from '@/mixins/organization-search'; import { getMKApprovalUrl } from '@/api/system/business-process'; import { loadMkEnabled, submitMkApprovalFlow } from '@/utils/mk-approval'; +import { kingdeePushStatusType } from '@/utils/kingdee'; // 表单提交成功后带标记返回,keep-alive 缓存的列表页据此重新拉取 const invoiceReceiptListRefreshKey = 'invoice-receipt-list-refresh'; @@ -480,6 +484,7 @@ export default { '' ); }, + kingdeePushStatusType, displayValue(value) { return value === null || value === undefined || value === '' ? '-' : value; }, diff --git a/src/views/payment/payment-application-form.vue b/src/views/payment/payment-application-form.vue index f93c25f..c9bf613 100644 --- a/src/views/payment/payment-application-form.vue +++ b/src/views/payment/payment-application-form.vue @@ -354,11 +354,23 @@ > + min-width="160" />