From d373776526fc1e36b35a209cbef1b0b1e4545227 Mon Sep 17 00:00:00 2001 From: zlwu Date: Sat, 5 Sep 2026 17:12:37 +0800 Subject: [PATCH] feat(bx): bind reimburse apply attachments on save and submit Co-authored-by: Cursor --- .../src/views/bx/reimburse/apply/index.vue | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/web-admin/src/views/bx/reimburse/apply/index.vue b/web-admin/src/views/bx/reimburse/apply/index.vue index 3ee6904b3..93c198f76 100644 --- a/web-admin/src/views/bx/reimburse/apply/index.vue +++ b/web-admin/src/views/bx/reimburse/apply/index.vue @@ -848,7 +848,7 @@ import { Filter } from '@element-plus/icons-vue' import type { UploadFile } from 'element-plus' -import { reimburseApi, invoiceWalletApi } from '@/api/bx' +import { reimburseApi, invoiceWalletApi, attachmentApi } from '@/api/bx' import { buildApplyDateRangeQuery, type ApplyDateRange } from '@/utils/bx/apply-date-filter' import { canDeleteByCreator, allRowsDeletableByCreator, CREATOR_DELETE_TIP } from '@/utils/creator-delete' import { useExpenseItemTree, type ExpenseItem } from '@/hooks/bx/useExpenseItemTree' @@ -1413,6 +1413,7 @@ async function handleViewDelete() { } async function openEditDialog(row: any) { + applyAttachments.value = [] try { const res: any = await reimburseApi.getById(row.id) const data = res.data || res @@ -1709,10 +1710,31 @@ async function saveAddForm(payload: AddPayload): Promise { return id || null } +async function bindApplyAttachments(reimburseId: string) { + const ids = (applyAttachmentRef.value?.getFileIds?.() || applyAttachments.value.map((f) => f.id)).filter( + (id) => id != null && id !== '' && !String(id).startsWith('upload-') + ) + if (!ids.length) return + try { + await attachmentApi.bindBiz(ids, 'reimburse_apply', reimburseId) + } catch (e: any) { + ElMessage.warning(e?.message || '报销单已保存,但申请附件关联失败,请重新编辑后保存') + } +} + +function assertApplyAttachmentsIdle(): boolean { + if (applyAttachmentRef.value?.hasUploading()) { + ElMessage.warning('附件上传中,请稍候') + return false + } + return true +} + /** 保存草稿 */ async function submitAdd() { const payload = buildAddPayload() if (!payload) return + if (!assertApplyAttachmentsIdle()) return const wasEdit = !!editingId.value loadingMap.addSubmit = true try { @@ -1722,6 +1744,7 @@ async function submitAdd() { await refreshList() return } + await bindApplyAttachments(id) ElMessage.success(wasEdit ? '保存成功' : '新增成功') resetAddForm() await refreshList() @@ -1736,6 +1759,7 @@ async function submitAdd() { async function submitAddAndApprove() { const payload = buildAddPayload() if (!payload) return + if (!assertApplyAttachmentsIdle()) return loadingMap.addApprove = true try { const id = await saveAddForm(payload) @@ -1744,6 +1768,7 @@ async function submitAddAndApprove() { await refreshList() return } + await bindApplyAttachments(id) // 保存成功后记下 id,提交失败时再次操作会走更新而非重复新建 editingId.value = id await reimburseApi.submit(id)