feat: 新增风险图谱算法与系统仪表盘及操作反馈体系
后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL 校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计, 优化 agent 运行和编排执行链路,清理旧开发文档,前端新增 系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈 对话框和工作台日期选择器,优化报销创建和审批详情交互, 补充单元测试覆盖。
This commit is contained in:
@@ -3,6 +3,12 @@ import { readFileSync } from 'node:fs'
|
||||
import test from 'node:test'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
import { assistantCapabilities } from '../src/data/personalWorkbench.js'
|
||||
import {
|
||||
buildWorkbenchCapabilityAssistantPayload,
|
||||
resolveWorkbenchCapabilityAssistantEntry
|
||||
} from '../src/utils/personalWorkbenchAssistantEntry.js'
|
||||
|
||||
const workbench = readFileSync(
|
||||
fileURLToPath(new URL('../src/components/business/PersonalWorkbench.vue', import.meta.url)),
|
||||
'utf8'
|
||||
@@ -11,8 +17,50 @@ const workbench = readFileSync(
|
||||
test('workbench assistant greets the current employee without the old helper tag', () => {
|
||||
assert.doesNotMatch(workbench, /assistant-tag/)
|
||||
assert.doesNotMatch(workbench, /AI 报销助手/)
|
||||
assert.match(workbench, /嗨,\{\{ assistantGreetingName \}\},描述您想做的事,AI 会直接帮您处理/)
|
||||
assert.match(workbench, /我会自动识别您的意图,协助完成费用申请、报销、查询和制度问答等业务工作/)
|
||||
assert.match(workbench, /const assistantGreetingName = computed/)
|
||||
assert.match(workbench, /嗨,\{\{ displayUserName \}\},我是您的 <span>AI 费用助手<\/span>/)
|
||||
assert.match(workbench, /placeholder="请输入费用申请、报销问题、预算查询或制度问答\.\.\."/)
|
||||
assert.match(workbench, /const displayUserName = computed/)
|
||||
assert.match(workbench, /user\.name/)
|
||||
})
|
||||
|
||||
test('workbench capability cards open assistant without injecting canned prompts', () => {
|
||||
assert.match(workbench, /@click="openCapabilityAssistant\(item\)"/)
|
||||
assert.doesNotMatch(workbench, /openPromptAssistant\(item\.prompt\)/)
|
||||
|
||||
for (const item of assistantCapabilities) {
|
||||
const payload = buildWorkbenchCapabilityAssistantPayload(item, {
|
||||
prompt: '',
|
||||
source: 'workbench',
|
||||
files: []
|
||||
})
|
||||
|
||||
assert.equal(payload.prompt, '')
|
||||
assert.equal(payload.conversation, null)
|
||||
assert.notEqual(payload.prompt, item.prompt)
|
||||
assert.ok(resolveWorkbenchCapabilityAssistantEntry(item).sessionType)
|
||||
}
|
||||
})
|
||||
|
||||
test('workbench capability cards keep user-entered context only', () => {
|
||||
const [expenseApplication] = assistantCapabilities
|
||||
const files = [{ name: 'invoice.pdf' }]
|
||||
const payload = buildWorkbenchCapabilityAssistantPayload(expenseApplication, {
|
||||
prompt: '我需要申请下周出差费用',
|
||||
source: 'workbench',
|
||||
files
|
||||
})
|
||||
|
||||
assert.equal(payload.prompt, '我需要申请下周出差费用')
|
||||
assert.equal(payload.source, 'application')
|
||||
assert.equal(payload.sessionType, 'application')
|
||||
assert.equal(payload.files, files)
|
||||
})
|
||||
|
||||
test('workbench submit shows intent recognition feedback before assistant opens', () => {
|
||||
assert.match(workbench, /class="assistant-intent-status"/)
|
||||
assert.match(workbench, /aria-live="polite"/)
|
||||
assert.match(workbench, /正在识别意图,准备进入对应助手/)
|
||||
assert.match(workbench, /startPendingAction\('intent'\)/)
|
||||
assert.match(workbench, /if \(open\) \{\s*clearPendingAction\(\)/)
|
||||
assert.match(workbench, /:readonly="isComposerPending"/)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user