feat(web): AI 文档查询卡片重构与单号判定统一

- documentClassification 抽出 isApplicationDocumentNo,统一兼容 AP-/APP- 旧格式与 A+8 新格式,aiDocumentQueryModel 复用
- aiDocumentQueryModel 文档卡片改为结构化字段布局(单据类型/金额/申请人/编号/操作),新增查询范围摘要区,渲染走 HTML 信任块
- AppShellRouteView/useAppShell/useRequests/detailAlerts/riskVisibility 等差旅详情模型适配单号判定
- 同步更新 ai-document-query-model/workbench-ai-mode-switch 测试,新增 document-classification 测试
This commit is contained in:
caoxiaozhu
2026-06-20 22:04:37 +08:00
parent 8158716e23
commit 3b74a330a3
17 changed files with 348 additions and 209 deletions

View File

@@ -273,7 +273,27 @@ const sidebarCollapsed = ref(false)
const sidebarCollapsedBeforeAiMode = ref(false)
const mobileSidebarOpen = ref(false)
const overviewDashboard = ref('finance')
const workbenchMode = ref('traditional')
const { companyProfile, currentUser, logout } = useSystemState()
function resolveDefaultWorkbenchMode(user) {
return isPlatformAdminUser(user) ? 'traditional' : 'ai'
}
function resolveWorkbenchUserKey(user = {}) {
const roleCodes = Array.isArray(user?.roleCodes) ? user.roleCodes.join(',') : ''
return [
user?.id,
user?.userId,
user?.username,
user?.account,
user?.name,
user?.role,
roleCodes,
user?.isAdmin ? 'admin' : 'user'
].map((item) => String(item || '').trim()).join('|')
}
const workbenchMode = ref(resolveDefaultWorkbenchMode(currentUser.value))
const aiSidebarCommandSeq = ref(0)
const aiSidebarCommand = ref({ seq: 0, type: '', payload: null })
const aiActiveConversationId = ref('')
@@ -343,7 +363,6 @@ const {
topBarView
} = useAppShell()
const { companyProfile, currentUser, logout } = useSystemState()
const PRODUCT_DISPLAY_NAME = '易财费控'
const ENTERPRISE_DISPLAY_NAME = '远光软件股份有限公司'
const filteredNavItems = computed(() => filterNavItemsByAccess(navItems, currentUser.value))
@@ -496,7 +515,14 @@ function handleLogout() {
watch(
() => currentUser.value,
(user) => {
(user, previousUser) => {
if (resolveWorkbenchUserKey(user) !== resolveWorkbenchUserKey(previousUser)) {
const nextMode = resolveDefaultWorkbenchMode(user)
workbenchMode.value = nextMode
if (nextMode === 'ai') {
sidebarCollapsed.value = false
}
}
aiConversationHistory.value = loadAiWorkbenchConversationHistory(user || {})
},
{ immediate: true }