feat: 完善文档中心与报销申请交互及侧边栏重构

后端优化编排器报销查询和本体检测精度,增强报销单草稿保
存和附件回填逻辑,前端重构侧边栏组件支持折叠和图标导
航,完善文档中心状态筛选和详情提示,报销创建和审批详情
页优化会话管理和费用明细交互,新增助手应用服务和预设动
作工具函数,补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-25 13:35:39 +08:00
parent 50b1c3f9a9
commit d0e946cf47
59 changed files with 5117 additions and 416 deletions

View File

@@ -1,15 +1,19 @@
<template>
<div class="app">
<SidebarRail
:nav-items="filteredNavItems"
:active-view="activeView"
:company-name="companyProfile.name"
:company-logo="companyProfile.logo"
:current-user="currentUser"
@navigate="handleNavigate"
@open-chat="openSmartEntry"
@logout="handleLogout"
/>
<div class="app" :class="{ 'sidebar-collapsed': sidebarCollapsed }">
<div class="app-sidebar">
<SidebarRail
:nav-items="filteredNavItems"
:active-view="activeView"
:company-name="companyProfile.name"
:company-logo="companyProfile.logo"
:current-user="currentUser"
:collapsed="sidebarCollapsed"
@navigate="handleNavigate"
@open-chat="openSmartEntry"
@logout="handleLogout"
@toggle-collapse="toggleSidebarCollapsed"
/>
</div>
<main
class="main"
@@ -49,7 +53,7 @@
@update:active-range="activeRange = $event"
@update:custom-range="customRange = $event"
@batch-approve="toast('已批量通过 23 条审批任务')"
@new-application="openExpenseApplicationDialog"
@new-application="openExpenseApplicationCreate"
/>
<FilterBar
@@ -91,6 +95,7 @@
<TravelRequestDetailView
v-else-if="['requests', 'documents'].includes(activeView) && detailMode && selectedRequest"
:request="selectedRequest"
:back-label="activeView === 'documents' ? '返回单据中心' : '返回报销列表'"
@back-to-requests="closeRequestDetail"
@open-assistant="openSmartEntry"
@request-updated="handleRequestUpdated"
@@ -105,7 +110,7 @@
:error="requestsError"
@open-document="openRequestDetail"
@create-request="openTravelCreate"
@create-application="openExpenseApplicationDialog"
@create-application="openExpenseApplicationCreate"
@reload="reloadRequests"
@summary-change="documentSummary = $event"
/>
@@ -146,12 +151,6 @@
@close="closeSmartEntry"
@draft-saved="handleDraftSaved"
/>
<ExpenseApplicationDialog
v-if="expenseApplicationDialogOpen"
@close="closeExpenseApplicationDialog"
@confirmed="handleExpenseApplicationConfirmed"
/>
</div>
</template>
@@ -161,7 +160,6 @@ import { computed, ref } from 'vue'
import SidebarRail from '../components/layout/SidebarRail.vue'
import TopBar from '../components/layout/TopBar.vue'
import FilterBar from '../components/layout/FilterBar.vue'
import ExpenseApplicationDialog from '../components/shared/ExpenseApplicationDialog.vue'
import OverviewView from './OverviewView.vue'
import PersonalWorkbenchView from './PersonalWorkbenchView.vue'
import TravelReimbursementCreateView from './TravelReimbursementCreateView.vue'
@@ -186,7 +184,11 @@ const knowledgeSummary = ref(null)
const logsSummary = ref(null)
const documentSummary = ref(null)
const auditDetailOpen = ref(false)
const expenseApplicationDialogOpen = ref(false)
const sidebarCollapsed = ref(true)
function toggleSidebarCollapsed() {
sidebarCollapsed.value = !sidebarCollapsed.value
}
const {
activeRange,
@@ -206,6 +208,7 @@ const {
handleRequestDeleted,
handleRequestUpdated,
navItems,
openExpenseApplicationCreate,
openRequestDetail,
openSmartEntry,
openTravelCreate,
@@ -229,19 +232,6 @@ const {
const { companyProfile, currentUser, logout } = useSystemState()
const filteredNavItems = computed(() => filterNavItemsByAccess(navItems, currentUser.value))
function openExpenseApplicationDialog() {
expenseApplicationDialogOpen.value = true
}
function closeExpenseApplicationDialog() {
expenseApplicationDialogOpen.value = false
}
function handleExpenseApplicationConfirmed() {
expenseApplicationDialogOpen.value = false
toast('费用申请字段已接入本体识别,后续会按申请审批流落单。')
}
function handleLogout() {
logout('manual')
}