feat: 数字员工财务报告体系与定时提醒及看板快照调度

- 新增数字员工财务报告生成、邮件投递与渲染调度器
- 引入员工画像扫描调度与定时提醒任务
- 完善财务看板快照、排行口径与部门人员占比计算
- 优化数字员工工作看板仪表盘与技能目录
- 增强前端总览页图表、工作台摘要与顶部导航栏交互
- 新增差旅申请规划推动提醒与报销创建会话状态管理
- 补充财务报告、看板调度、数字员工工作记录测试覆盖
This commit is contained in:
caoxiaozhu
2026-06-03 09:25:23 +08:00
parent 0c74b4ab4a
commit 15006a05a7
114 changed files with 7356 additions and 650 deletions

View File

@@ -34,12 +34,15 @@ export function useAppShell() {
conversation: null,
scope: null,
sessionType: '',
budgetContext: null
budgetContext: null,
initialPromptAutoSubmit: true,
initialApplicationPreview: null
})
const smartEntrySessionId = ref(0)
const smartEntryRevealToken = ref(0)
const smartEntryInvalidatedDraftClaimId = ref('')
const selectedRequestSnapshot = ref(null)
const selectedRequestSnapshot = ref(null)
const documentCenterRefreshToken = ref(0)
const { activeView, currentView, setView } = useNavigation()
const {
@@ -98,12 +101,19 @@ export function useAppShell() {
: []
))
const requestsNeeded = computed(() => ['documents', 'workbench'].includes(activeView.value))
async function reloadDocumentCenterRequests() {
documentCenterRefreshToken.value += 1
return reloadRequests()
}
watch(
requestsNeeded,
(isNeeded) => {
if (isNeeded) {
() => [activeView.value, route.name],
([view]) => {
if (view === 'documents') {
void reloadDocumentCenterRequests()
return
}
if (view === 'workbench') {
void ensureRequestsLoaded()
}
},
@@ -166,10 +176,17 @@ export function useAppShell() {
toast(message)
}
function handleNavigate(view) {
smartEntryOpen.value = false
setView(view)
}
function handleNavigate(view) {
smartEntryOpen.value = false
const shouldRefreshCurrentDocumentCenter =
view === 'documents'
&& activeView.value === 'documents'
&& route.name === 'app-documents'
setView(view)
if (shouldRefreshCurrentDocumentCenter) {
void reloadDocumentCenterRequests()
}
}
function openFinancialAssistantCreate(source) {
if (smartEntryOpen.value) {
@@ -185,7 +202,9 @@ export function useAppShell() {
conversation: null,
scope: null,
sessionType: '',
budgetContext: null
budgetContext: null,
initialPromptAutoSubmit: true,
initialApplicationPreview: null
}
smartEntrySessionId.value += 1
}
@@ -320,6 +339,7 @@ export function useAppShell() {
|| String(payload?.prompt || '').trim()
|| (Array.isArray(payload?.files) && payload.files.length)
|| payload?.conversation
|| payload?.applicationPreview
)
if (smartEntryOpen.value && !shouldReplaceOpenEntry) {
smartEntryRevealToken.value += 1
@@ -342,6 +362,10 @@ export function useAppShell() {
sessionType,
budgetContext: payload.budgetContext && typeof payload.budgetContext === 'object'
? payload.budgetContext
: null,
initialPromptAutoSubmit: payload.initialPromptAutoSubmit !== false,
initialApplicationPreview: payload.applicationPreview && typeof payload.applicationPreview === 'object'
? payload.applicationPreview
: null
}
smartEntrySessionId.value += 1
@@ -410,6 +434,7 @@ export function useAppShell() {
currentView,
customRange,
detailMode,
documentCenterRefreshToken,
filteredRequests,
filters,
handleApprove,
@@ -429,6 +454,7 @@ export function useAppShell() {
requestsError,
requestsLoading,
reloadRequests,
reloadDocumentCenterRequests,
requests,
search,
selectedRequest,