feat(web): 工作台 AI 模式与差旅/风险建议交互优化
- 新增 PersonalWorkbenchAiMode 组件、AI 侧边栏与 orb 机器人视觉资源 - 新增 aiApplicationDraftModel / aiExpenseDraftModel / aiWorkbenchConversationStore 及业务准入 aiSidebarBusinessAccess,支撑 AI 模式下的申请与报销草稿 - 顶栏、侧边栏、工作台样式重构,适配 AI 模式切换与响应式布局 - 同步 steward plan/off_topic、差旅报销引导流、风险建议卡片等测试
This commit is contained in:
@@ -300,19 +300,34 @@ test('risk cards carry structured business stage for approval advice filtering',
|
||||
test('stage risk advice card focuses on document risks without profile or budget boards', () => {
|
||||
assert.match(stageRiskAdviceCard, /employee-risk-decision-panel/)
|
||||
assert.match(stageRiskAdviceCard, /综合审核结论/)
|
||||
assert.match(stageRiskAdviceCard, /建议结论/)
|
||||
assert.match(stageRiskAdviceCard, /\{\{ decisionAction \}\}/)
|
||||
assert.match(stageRiskAdviceCard, /是否建议通过/)
|
||||
assert.match(stageRiskAdviceCard, /\{\{ decisionBadgeLabel \}\}/)
|
||||
assert.match(stageRiskAdviceCard, /employee-risk-review-summary/)
|
||||
assert.match(stageRiskAdviceCard, /reviewSummaryItems/)
|
||||
assert.match(stageRiskAdviceCard, /风险概览/)
|
||||
assert.match(stageRiskAdviceCard, /重点依据/)
|
||||
assert.match(stageRiskAdviceCard, /审核建议/)
|
||||
assert.match(stageRiskAdviceCard, /stageRiskFactSummary/)
|
||||
assert.match(stageRiskAdviceCard, /stageReviewBasisSummary/)
|
||||
assert.match(stageRiskAdviceCard, /compactEvidenceItems/)
|
||||
assert.match(stageRiskAdviceCard, /stageBasisTitle/)
|
||||
assert.match(stageRiskAdviceCard, /stageBasisHint/)
|
||||
assert.match(stageRiskAdviceCard, /employee-risk-profile-section/)
|
||||
assert.match(stageRiskAdviceCard, /employee-risk-profile-list/)
|
||||
assert.match(stageRiskAdviceCard, /<details/)
|
||||
assert.match(stageRiskAdviceCard, /申请审核建议/)
|
||||
assert.match(stageRiskAdviceCard, /AI建议/)
|
||||
assert.doesNotMatch(stageRiskAdviceCard, /报销审核建议/)
|
||||
assert.match(stageRiskAdviceCard, /classifyReimbursementRiskCards/)
|
||||
assert.match(stageRiskAdviceCard, /stripEmbeddedExplanationText/)
|
||||
assert.match(stageRiskAdviceCard, /if \(summary\) \{[\s\S]*return \[`已补充异常说明:\$\{summary\}`\]/)
|
||||
assert.match(stageRiskAdviceCard, /employee-risk-tone-pill/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-decision-panel \{[\s\S]*grid-template-columns: minmax\(0, 1fr\) minmax\(220px, 32%\);/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-decision-panel \{[\s\S]*grid-template-columns: minmax\(0, 1\.15fr\) minmax\(220px, \.85fr\);/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-review-summary \{[\s\S]*display: flex;[\s\S]*flex-wrap: wrap;/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-review-item \{[\s\S]*flex: 1 1 180px;/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-profile-list \{[\s\S]*grid-template-columns: 1fr;/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-evidence-row summary \{[\s\S]*cursor: pointer;/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-evidence-title::after \{[\s\S]*content: '展开';/)
|
||||
assert.match(stageRiskAdviceStyles, /\.employee-risk-evidence-row li \{[\s\S]*white-space: normal;/)
|
||||
assert.doesNotMatch(stageRiskAdviceStyles, /grid-row: span 2/)
|
||||
assert.match(stageRiskAdviceCard, /建议退回补充票据、行程说明或超标原因/)
|
||||
@@ -320,8 +335,8 @@ test('stage risk advice card focuses on document risks without profile or budget
|
||||
assert.match(stageRiskAdviceCard, /请核对已补充说明是否覆盖风险点/)
|
||||
assert.match(stageRiskAdviceCard, /已补充异常说明/)
|
||||
assert.match(stageRiskAdviceCard, /可按权限继续审批/)
|
||||
assert.match(stageRiskAdviceCard, /申请单风险依据/)
|
||||
assert.match(stageRiskAdviceCard, /报销单风险依据/)
|
||||
assert.match(stageRiskAdviceCard, /申请单关键依据/)
|
||||
assert.match(stageRiskAdviceCard, /报销单关键依据/)
|
||||
assert.doesNotMatch(stageRiskAdviceCard, /人员行为画像/)
|
||||
assert.doesNotMatch(stageRiskAdviceCard, /部门预算执行/)
|
||||
assert.doesNotMatch(stageRiskAdviceCard, /title: '说明与佐证'/)
|
||||
@@ -631,7 +646,9 @@ test('AI advice template renders grouped section titles with completion before r
|
||||
assert.match(detailViewScript, /const showCompactSafeAdvice = computed/)
|
||||
assert.match(detailViewScript, /const showAiAdvicePanel = computed\(\(\) => \(/)
|
||||
assert.match(detailViewScript, /isCurrentApplicant\.value && !isApplicationDocument\.value && hasVisibleRiskCards\.value/)
|
||||
assert.match(detailViewScript, /return '报销风险提示'/)
|
||||
assert.match(detailViewScript, /return '风险提示'/)
|
||||
assert.match(detailViewScript, /return isEditableRequest\.value \? 'AI建议' : '风险提示'/)
|
||||
assert.doesNotMatch(detailViewScript, /return '报销风险提示'/)
|
||||
assert.match(detailViewScript, /canViewApprovalRiskAdvice\.value && aiAdvice\.value\.riskCards\.length > 0/)
|
||||
assert.match(detailViewScript, /buildTravelReceiptMaterialPrompts\(request\.value, expenseItems\.value\)/)
|
||||
assert.match(detailViewScript, /buildEmployeeProfileAdviceItems\(employeeRiskProfile\.value\)/)
|
||||
@@ -648,9 +665,13 @@ test('AI advice template renders grouped section titles with completion before r
|
||||
)
|
||||
})
|
||||
|
||||
test('AI advice risk section uses compact card styling hooks', () => {
|
||||
test('AI advice risk section keeps compact risk prompt styling', () => {
|
||||
assert.match(detailViewTemplate, /class="\['risk-advice-card', card\.tone, \{ 'is-highlighted': isHighlightedRiskCard\(card\) \}\]"/)
|
||||
assert.match(detailViewTemplate, /class="risk-advice-point"/)
|
||||
assert.match(detailViewTemplate, /class="risk-advice-compact-meta"/)
|
||||
assert.match(detailViewTemplate, /\{\{ card\.ruleBasis\[0\] \}\}/)
|
||||
assert.doesNotMatch(detailViewTemplate, /risk-advice-detail-grid/)
|
||||
assert.doesNotMatch(detailViewTemplate, /<dt>风险事实<\/dt>/)
|
||||
assert.doesNotMatch(detailViewTemplate, /section\.hiddenCount/)
|
||||
assert.doesNotMatch(detailViewTemplate, /risk-advice-more/)
|
||||
assert.doesNotMatch(detailViewTemplate, /card\.tags\?\.length/)
|
||||
@@ -667,6 +688,7 @@ test('AI advice risk section uses compact card styling hooks', () => {
|
||||
assert.match(detailViewStyle, /\.risk-advice-card\.low/)
|
||||
assert.doesNotMatch(detailViewStyle, /\.risk-note-tag/)
|
||||
assert.match(detailViewStyle, /\.risk-advice-compact-meta span,\s*\.risk-advice-compact-meta em \{\s*margin: 0;/)
|
||||
assert.doesNotMatch(detailViewStyle, /\.risk-advice-detail-grid/)
|
||||
assert.doesNotMatch(detailViewStyle, /\.risk-advice-more/)
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user