feat(web): 工作台 AI 模式报销预审与文档查询模型拆分
- 新增 aiApplicationPrecheckModel/aiDocumentQueryModel/aiApplicationPreviewActions/aiConversationHtmlRenderer 四个独立模型与服务,按职责从主组件拆出 - PersonalWorkbenchAiMode 接入拆分后的预审、文档查询与 HTML 渲染逻辑,配合 markdown 工具增强结构化展示 - 文档中心与归档筛选、风险可见性、申请预览等工具同步适配,补充对应单元测试 - 新增 AI 文档卡片背景资源
This commit is contained in:
@@ -190,3 +190,87 @@ test('legacy risk text falls back to semantic visibility defaults', () => {
|
||||
assert.equal(resolveRiskActionability(legacyFlag, { businessStage: 'reimbursement' }), 'fixable_by_submitter')
|
||||
assert.equal(resolveRiskVisibilityScope(legacyFlag, { businessStage: 'reimbursement' }), 'submitter')
|
||||
})
|
||||
|
||||
test('application submitter can see fixable policy/trip risks in detail', () => {
|
||||
// 申请单申请人在详情页可见可自行整改的风险(信息完整性、差旅、金额),
|
||||
// 以便申请时知晓风险及原因并补充修正。
|
||||
const cards = [
|
||||
{
|
||||
id: 'application-fields-missing',
|
||||
businessStage: 'expense_application',
|
||||
tone: 'low',
|
||||
risk: '差旅申请基础信息不完整,请补充地点、事由、起止时间和预计金额。',
|
||||
risk_domain: 'policy',
|
||||
visibility_scope: 'submitter',
|
||||
actionability: 'fixable_by_submitter'
|
||||
},
|
||||
{
|
||||
id: 'budget-detail',
|
||||
businessStage: 'expense_application',
|
||||
tone: 'high',
|
||||
risk: '预算可用余额不足。',
|
||||
risk_domain: 'budget',
|
||||
visibility_scope: 'budget_manager',
|
||||
actionability: 'budget_governance'
|
||||
},
|
||||
{
|
||||
id: 'profile-detail',
|
||||
businessStage: 'expense_application',
|
||||
tone: 'medium',
|
||||
risk: '历史差旅画像异常。',
|
||||
risk_domain: 'profile',
|
||||
visibility_scope: 'leader',
|
||||
actionability: 'review_decision'
|
||||
}
|
||||
]
|
||||
|
||||
const visibleCards = filterRiskCardsForVisibility(cards, { request: applicationRequest, currentUser: submitter })
|
||||
// 申请人只可见 fixable_by_submitter 的信息完整性类风险,
|
||||
// budget 走预算审批人、profile 走领导,申请人均不可见。
|
||||
assert.deepEqual(visibleCards.map((card) => card.id), ['application-fields-missing'])
|
||||
})
|
||||
|
||||
test('application leader can see review_decision risks that submitter cannot', () => {
|
||||
// 审批人可见 review_decision 类风险(画像、审批流程等),
|
||||
// 满足诉求2:提交后领导能看到风险点。
|
||||
const cards = [
|
||||
{
|
||||
id: 'profile-detail',
|
||||
businessStage: 'expense_application',
|
||||
tone: 'medium',
|
||||
risk: '历史差旅画像异常。',
|
||||
risk_domain: 'profile',
|
||||
visibility_scope: 'leader',
|
||||
actionability: 'review_decision'
|
||||
},
|
||||
{
|
||||
id: 'application-fields-missing',
|
||||
businessStage: 'expense_application',
|
||||
tone: 'low',
|
||||
risk: '差旅申请基础信息不完整。',
|
||||
risk_domain: 'policy',
|
||||
visibility_scope: 'submitter',
|
||||
actionability: 'fixable_by_submitter'
|
||||
}
|
||||
]
|
||||
|
||||
const visibleCards = filterRiskCardsForVisibility(cards, {
|
||||
request: applicationRequest,
|
||||
currentUser: { id: 'EMP-P7', name: '直属领导' },
|
||||
canViewApprovalRiskAdvice: true
|
||||
})
|
||||
assert.deepEqual(visibleCards.map((card) => card.id), ['profile-detail', 'application-fields-missing'])
|
||||
})
|
||||
|
||||
test('application fixable risks derive submitter semantics without hardcoded leader fallback', () => {
|
||||
// 验证申请单阶段 policy/trip/amount 域不再被硬编码为 leader/review_decision,
|
||||
// 而是沿用与报销单一致的 fixable_by_submitter 语义。
|
||||
const policyFlag = {
|
||||
source: 'submission_review',
|
||||
severity: 'low',
|
||||
message: '差旅申请基础信息不完整。',
|
||||
business_stage: 'expense_application'
|
||||
}
|
||||
assert.equal(resolveRiskActionability(policyFlag, { businessStage: 'expense_application' }), 'fixable_by_submitter')
|
||||
assert.equal(resolveRiskVisibilityScope(policyFlag, { businessStage: 'expense_application' }), 'submitter')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user