style(web): 更新差旅报销创建页面样式和业务脚本,增强前端交互和状态管理

This commit is contained in:
caoxiaozhu
2026-05-14 15:43:10 +00:00
parent 98f68c47b0
commit 7209c75ad8
5 changed files with 651 additions and 72 deletions

View File

@@ -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
}