feat(ai): 业务上下文感知与 A2UI 链路统一

- 新增代码内业务上下文元数据层(实体字典 + 三大闭环工作流)
- 新增 get_business_context / get_entity_schema / get_pending_tasks 运行时工具
- SYSTEM_PROMPT 与技能目录改为先查业务流程/待办再执行
- A2UI 增加 ai_a2ui_submissions 幂等表、表单过期、ui.artifact 事件
- 提交回灌携带 submissionId / fieldErrors / 下一步建议
- 前端 uiArtifacts 归一化与过期表单禁用
This commit is contained in:
2026-08-06 15:23:23 +08:00
parent d9c541dacc
commit 24e0ecbdaf
44 changed files with 2125 additions and 41 deletions

View File

@@ -12,6 +12,7 @@ import { AiChartService } from './ai-chart.service';
import { AiExcelReaderService } from './ai-excel-reader.service';
import { AiFormService } from './ai-form.service';
import { AiReviewService } from './ai-review.service';
import type { A2uiSubmissionsService } from './ai-a2ui-submissions.service';
import { AiModelStreamService } from './ai-model-stream.service';
import { OperationLogsService } from '../operation-logs/operation-logs.service';
import {
@@ -114,6 +115,7 @@ export abstract class AiChatServiceBase implements AiChatServiceContext {
readonly chartService: AiChartService,
readonly abilityFactory: CaslAbilityFactory,
readonly authorization: AuthorizationService,
readonly a2uiSubmissions?: A2uiSubmissionsService,
readonly excelReader?: AiExcelReaderService,
readonly importsService?: ImportsService,
readonly opLog?: OperationLogsService,
@@ -127,7 +129,12 @@ export abstract class AiChatServiceBase implements AiChatServiceContext {
return a2uiReviewSubmitInfo(metadata);
}
buildFormSubmitModelContent(submit: { title: string; values: Record<string, unknown> }): string {
buildFormSubmitModelContent(submit: {
title: string;
values: Record<string, unknown>;
submissionId?: string;
fieldErrors?: Array<{ field: string; message: string }>;
}): string {
return buildFormSubmitModelContent(submit);
}
@@ -135,6 +142,8 @@ export abstract class AiChatServiceBase implements AiChatServiceContext {
reviewId: string;
reviewTitle: string;
resultMessage: string;
submissionId?: string;
nextSteps?: Array<{ key: string; label: string }>;
}): string {
return buildReviewSubmitModelContent(submit);
}