feat: 新增风险图谱算法与系统仪表盘及操作反馈体系

后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL
校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计,
优化 agent 运行和编排执行链路,清理旧开发文档,前端新增
系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈
对话框和工作台日期选择器,优化报销创建和审批详情交互,
补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-30 15:46:51 +08:00
parent 4c59941ec6
commit 7989f3a159
314 changed files with 30073 additions and 20626 deletions

View File

@@ -1,4 +1,5 @@
import { buildSuggestedActionKey } from '../../utils/suggestedActionKey.js'
import { filterVisibleMessageMeta } from '../../utils/assistantMessageMeta.js'
import { normalizeExpenseQueryPayload } from './travelReimbursementExpenseQueryModel.js'
import { buildAgentInsight, buildReviewFilePreviewsFromReviewPayload } from './travelReimbursementAttachmentModel.js'
import { resolveExpenseTypeLabel } from './travelReimbursementReviewModel.js'
@@ -108,6 +109,8 @@ export const SOURCE_LABELS = {
requests: '来自报销列表'
}
export { filterVisibleMessageMeta } from '../../utils/assistantMessageMeta.js'
export const SCENARIO_LABELS = {
expense: '报销',
accounts_receivable: '应收',
@@ -157,6 +160,12 @@ export const FLOW_STEP_FALLBACKS = {
runningText: '正在把已确认信息保存为草稿...',
completedText: '草稿已保存'
},
'application-submit-success': {
title: '申请单提交成功',
tool: 'ApplicationSubmit',
runningText: '正在提交费用申请...',
completedText: '申请单提交成功'
},
'attachment-association': {
title: '票据关联草稿',
tool: 'database.expense_claims.save_or_submit',
@@ -286,7 +295,7 @@ export function nowTime() {
export function createMessage(role, text, attachments = [], extras = {}) {
messageSeed += 1
return {
const message = {
id: `msg-${messageSeed}`,
role,
text,
@@ -308,8 +317,11 @@ export function createMessage(role, text, attachments = [], extras = {}) {
pendingAttachmentAssociation: null,
applicationPreview: null,
budgetReport: null,
operationFeedback: null,
...extras
}
message.meta = filterVisibleMessageMeta(message.meta)
return message
}
export function buildExpenseIntentConfirmationMessage(rawText) {
@@ -471,18 +483,6 @@ export function resolveStatusTone(status) {
export function buildMessageMeta(payload, fileNames = []) {
const items = []
if (payload?.selected_agent) {
items.push(`Agent: ${payload.selected_agent}`)
}
if (payload?.permission_level) {
items.push(`权限: ${payload.permission_level}`)
}
if (payload?.trace_summary?.tool_count) {
items.push(`工具: ${payload.trace_summary.tool_count}`)
}
if (payload?.trace_summary?.degraded) {
items.push('已降级')
}
@@ -491,15 +491,11 @@ export function buildMessageMeta(payload, fileNames = []) {
items.push('待确认')
}
if (payload?.run_id) {
items.push(`Run: ${payload.run_id}`)
}
if (fileNames.length) {
items.push(`附件: ${fileNames.length}`)
}
return items
return filterVisibleMessageMeta(items)
}
export function buildStoredMessageMeta(messageJson, attachmentNames = []) {
@@ -515,7 +511,7 @@ export function buildStoredMessageMeta(messageJson, attachmentNames = []) {
if (attachmentNames.length) {
items.push(`附件: ${attachmentNames.length}`)
}
return items
return filterVisibleMessageMeta(items)
}
export function buildWelcomeUserContext(user = {}) {
@@ -870,7 +866,7 @@ export function serializeSessionMessages(messages) {
text: message.text,
attachments: Array.isArray(message.attachments) ? message.attachments.filter(Boolean) : [],
time: message.time,
meta: Array.isArray(message.meta) ? message.meta.filter(Boolean) : [],
meta: filterVisibleMessageMeta(message.meta),
metaTone: message.metaTone || '',
citations: Array.isArray(message.citations) ? message.citations : [],
suggestedActions: Array.isArray(message.suggestedActions) ? message.suggestedActions : [],
@@ -883,10 +879,11 @@ export function serializeSessionMessages(messages) {
draftPayload: message.draftPayload || null,
reviewPayload: message.reviewPayload || null,
riskFlags: Array.isArray(message.riskFlags) ? message.riskFlags : [],
pendingAttachmentAssociation: message.pendingAttachmentAssociation || null,
applicationPreview: message.applicationPreview || null,
budgetReport: message.budgetReport || null,
assistantName: message.assistantName || '',
pendingAttachmentAssociation: message.pendingAttachmentAssociation || null,
applicationPreview: message.applicationPreview || null,
budgetReport: message.budgetReport || null,
operationFeedback: message.operationFeedback || null,
assistantName: message.assistantName || '',
isWelcome: Boolean(message.isWelcome),
welcomeQuickActions: Array.isArray(message.welcomeQuickActions) ? message.welcomeQuickActions : []
}))
@@ -908,6 +905,7 @@ export function hasMeaningfulSessionMessages(messages) {
|| message.draftPayload
|| message.applicationPreview
|| message.budgetReport
|| message.operationFeedback
|| message.pendingAttachmentAssociation
|| (Array.isArray(message.riskFlags) && message.riskFlags.length)
)