diff --git a/web/src/views/TravelRequestDetailView.vue b/web/src/views/TravelRequestDetailView.vue index 2c887ca..e146f19 100644 --- a/web/src/views/TravelRequestDetailView.vue +++ b/web/src/views/TravelRequestDetailView.vue @@ -130,16 +130,6 @@ {{ uploadingExpenseId ? '识别中' : '智能录入' }} -
@@ -439,7 +429,7 @@ - 当前还没有费用明细,点击右上角“增加明细”继续补充。 + 当前还没有费用明细,请通过智能录入上传票据后由系统自动归集。 diff --git a/web/src/views/scripts/TravelRequestDetailView.js b/web/src/views/scripts/TravelRequestDetailView.js index 9930e50..30d15f2 100644 --- a/web/src/views/scripts/TravelRequestDetailView.js +++ b/web/src/views/scripts/TravelRequestDetailView.js @@ -590,7 +590,6 @@ export default { const { currentUser } = useSystemState() const editingExpenseId = ref('') const savingExpenseId = ref('') - const creatingExpense = ref(false) const uploadingExpenseId = ref('') const deletingAttachmentId = ref('') const deletingExpenseId = ref('') @@ -898,7 +897,6 @@ export default { || returnBusy.value || approveBusy.value || payBusy.value - || creatingExpense.value || smartEntryRecognitionBusy.value || Boolean(uploadingExpenseId.value) || Boolean(deletingAttachmentId.value) @@ -1086,7 +1084,7 @@ export default { return `已选择 ${names.length} 张附件` }) const smartEntryUploadBusy = computed(() => - smartEntryUploadDialogOpen.value && (creatingExpense.value || Boolean(uploadingExpenseId.value)) + smartEntryUploadDialogOpen.value && Boolean(uploadingExpenseId.value) ) const attachmentPreviewEntries = computed(() => expenseItems.value @@ -1839,48 +1837,6 @@ export default { return '' } - async function createDraftExpenseItem({ openEditor = true } = {}) { - if (!request.value.claimId) { - toast('当前草稿缺少 claimId,暂时无法新增费用明细。') - return null - } - - creatingExpense.value = true - try { - const existingIds = new Set(expenseItems.value.map((item) => item.id)) - const claim = await createExpenseClaimItem(request.value.claimId, {}) - const createdItem = Array.isArray(claim?.items) - ? claim.items.find((entry) => !existingIds.has(String(entry?.id || ''))) - : null - - if (!createdItem) { - throw new Error('新增费用明细失败,请稍后重试。') - } - - const nextItem = buildExpenseItemViewModel(createdItem, expenseItems.value.length, request.value) - expenseItems.value = rebuildExpenseItems([...expenseItems.value, nextItem], request.value) - creatingExpense.value = false - if (openEditor) { - startExpenseEdit(nextItem) - toast('已新增一条费用明细,请继续填写。') - } - return nextItem - } catch (error) { - toast(error?.message || '新增费用明细失败,请稍后重试。') - return null - } finally { - creatingExpense.value = false - } - } - - async function handleAddExpenseItem() { - if (!isEditableRequest.value || actionBusy.value) { - return - } - - await createDraftExpenseItem({ openEditor: true }) - } - function triggerSmartEntryUpload() { if (!isEditableRequest.value || actionBusy.value) { return @@ -2590,12 +2546,12 @@ export default { currentSubmitRiskWarning, canEditDetailNote, deleteActionLabel, deleteBusy, deleteDialogDescription, deleteDialogOpen, deleteDialogTitle, deletingAttachmentId, deletingExpenseId, detailNote, detailNoteDirty, - detailNoteEditor, detailNoteEditorView, detailNoteTags, draftBlockingIssues, editingExpenseId, creatingExpense, expenseEditor, + detailNoteEditor, detailNoteEditorView, detailNoteTags, draftBlockingIssues, editingExpenseId, expenseEditor, expenseItems, expenseTableColumnCount, expenseTotal, expenseUploadInput, expenseTypeOptions: EXPENSE_TYPE_OPTIONS, goToNextSubmitRisk, goToPreviousSubmitRisk, focusExpenseRisk, - handleAddExpenseItem, handleApproveRequest, handleDeleteRequest, handleExpenseFileChange, handleSmartEntryFileChange, + handleApproveRequest, handleDeleteRequest, handleExpenseFileChange, handleSmartEntryFileChange, handleModifyApplication, handlePayRequest, handleReturnRequest, handleSubmit, heroFactItems, isApplicationDocument, isDraftRequest, isEditableRequest, isTravelRequest, diff --git a/web/tests/travel-request-detail-risk-advice.test.mjs b/web/tests/travel-request-detail-risk-advice.test.mjs index 5baf85c..1194242 100644 --- a/web/tests/travel-request-detail-risk-advice.test.mjs +++ b/web/tests/travel-request-detail-risk-advice.test.mjs @@ -605,6 +605,10 @@ test('expense attachment actions keep preview as the only recognition entry poin test('expense detail table shows the amount total below detail rows', () => { assert.match(detailViewTemplate, /]*class="detail-expense-table"/) assert.match(detailViewTemplate, /当前还没有费用明细/) + assert.match(detailViewTemplate, /通过智能录入上传票据后由系统自动归集/) + assert.doesNotMatch(detailViewTemplate, /增加明细/) + assert.doesNotMatch(detailViewTemplate, /handleAddExpenseItem/) + assert.doesNotMatch(detailViewScript, /handleAddExpenseItem/) assert.doesNotMatch(detailViewTemplate, /class="total-row"/) assert.match(detailViewTemplate, /class="expense-total-under-table"[\s\S]*金额合计[\s\S]*\{\{ expenseTotal \}\}/) assert.doesNotMatch(detailViewTemplate, /\{\{ uploadedExpenseCount \}\} 项已关联票据/)