From 7209c75ad805bba36ff0fb4dbf62d11a5c002284 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Thu, 14 May 2026 15:43:10 +0000 Subject: [PATCH] =?UTF-8?q?style(web):=20=E6=9B=B4=E6=96=B0=E5=B7=AE?= =?UTF-8?q?=E6=97=85=E6=8A=A5=E9=94=80=E5=88=9B=E5=BB=BA=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=92=8C=E4=B8=9A=E5=8A=A1=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E5=89=8D=E7=AB=AF=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E5=92=8C=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../travel-reimbursement-create-view.css | 23 + web/src/composables/useAppShell.js | 36 +- .../views/TravelReimbursementCreateView.vue | 49 +- .../scripts/TravelReimbursementCreateView.js | 602 ++++++++++++++++-- .../views/scripts/TravelRequestDetailView.js | 13 +- 5 files changed, 651 insertions(+), 72 deletions(-) diff --git a/web/src/assets/styles/views/travel-reimbursement-create-view.css b/web/src/assets/styles/views/travel-reimbursement-create-view.css index ff558bf..2b79ceb 100644 --- a/web/src/assets/styles/views/travel-reimbursement-create-view.css +++ b/web/src/assets/styles/views/travel-reimbursement-create-view.css @@ -3102,6 +3102,25 @@ flex-wrap: wrap; } +.review-upload-decision-modal { + display: grid; + gap: 18px; +} + +.review-upload-decision-copy { + display: grid; + gap: 10px; +} + +.review-upload-decision-actions { + justify-content: stretch; +} + +.review-upload-decision-actions .primary-dialog-btn, +.review-upload-decision-actions .secondary-dialog-btn { + flex: 1 1 168px; +} + .review-edit-modal { max-height: min(860px, calc(100vh - 48px)); display: grid; @@ -3503,6 +3522,10 @@ justify-content: stretch; } + .review-upload-decision-actions { + width: 100%; + } + .primary-dialog-btn, .secondary-dialog-btn, .danger-dialog-btn { diff --git a/web/src/composables/useAppShell.js b/web/src/composables/useAppShell.js index aca536b..20dc79a 100644 --- a/web/src/composables/useAppShell.js +++ b/web/src/composables/useAppShell.js @@ -3,9 +3,13 @@ import { useRoute, useRouter } from 'vue-router' import { useNavigation, navItems } from './useNavigation.js' import { useRequests } from './useRequests.js' +import { useSystemState } from './useSystemState.js' import { useToast } from './useToast.js' +import { fetchLatestConversation } from '../services/orchestrator.js' import { normalizeRequestForUi } from '../utils/requestViewModel.js' +const SESSION_TYPE_EXPENSE = 'expense' + function isPlaceholderValue(value) { const text = String(value || '').trim() if (!text) { @@ -101,6 +105,7 @@ export function useAppShell() { rejectRequest, reload: reloadRequests } = useRequests() + const { currentUser } = useSystemState() const { toast } = useToast() const customRange = ref({ start: '2024-07-06', end: '2024-07-12' }) @@ -179,7 +184,34 @@ export function useAppShell() { smartEntrySessionId.value += 1 } - function openSmartEntry(payload = {}) { + function resolveCurrentUserId() { + const user = currentUser.value || {} + return String(user.username || user.name || 'anonymous').trim() || 'anonymous' + } + + async function resolveSmartEntryConversation(payload = {}) { + if (payload.conversation) { + return payload.conversation + } + + if (!payload.restoreLatestConversation) { + return null + } + + try { + const latestPayload = await fetchLatestConversation(resolveCurrentUserId(), SESSION_TYPE_EXPENSE, { + preferRecoverable: true + }) + return latestPayload?.found ? latestPayload.conversation || null : null + } catch (error) { + console.warn('Failed to restore latest expense conversation for smart entry:', error) + toast(error?.message || '恢复最近报销会话失败,请稍后重试。') + return null + } + } + + async function openSmartEntry(payload = {}) { + const conversation = await resolveSmartEntryConversation(payload) smartEntryOpen.value = true smartEntryContext.value = { @@ -187,7 +219,7 @@ export function useAppShell() { source: payload.source ?? 'workbench', request: payload.request ?? selectedRequest.value, files: Array.isArray(payload.files) ? payload.files : [], - conversation: payload.conversation ?? null + conversation } smartEntrySessionId.value += 1 } diff --git a/web/src/views/TravelReimbursementCreateView.vue b/web/src/views/TravelReimbursementCreateView.vue index d53055d..9283d6f 100644 --- a/web/src/views/TravelReimbursementCreateView.vue +++ b/web/src/views/TravelReimbursementCreateView.vue @@ -264,16 +264,17 @@ -