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:
69
apps/server/src/ai-chat/ai-a2ui-submissions.service.spec.ts
Normal file
69
apps/server/src/ai-chat/ai-a2ui-submissions.service.spec.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import { describe, expect, it, jest } from '@jest/globals';
|
||||
import { A2uiSubmissionsService } from './ai-a2ui-submissions.service';
|
||||
|
||||
function createService(overrides: Record<string, unknown> = {}) {
|
||||
const repo = {
|
||||
findOne: jest.fn(),
|
||||
save: jest.fn(async (value) => value),
|
||||
create: jest.fn((value) => value),
|
||||
...overrides,
|
||||
};
|
||||
return { service: new A2uiSubmissionsService(repo as never), repo };
|
||||
}
|
||||
|
||||
const submission = {
|
||||
id: 1,
|
||||
artifactId: 'form-1',
|
||||
clientRequestId: '4d5c1c2a-1111-4222-8333-444455556666',
|
||||
status: 'created',
|
||||
resultJson: '{"ok":true}',
|
||||
createdAt: new Date(),
|
||||
};
|
||||
|
||||
describe('A2uiSubmissionsService', () => {
|
||||
it('recordSubmission 首次提交创建记录并标记 created', async () => {
|
||||
const { service, repo } = createService({
|
||||
findOne: jest.fn().mockResolvedValue(null),
|
||||
});
|
||||
const result = await service.recordSubmission({
|
||||
artifactId: submission.artifactId,
|
||||
clientRequestId: submission.clientRequestId,
|
||||
status: 'created',
|
||||
resultJson: submission.resultJson,
|
||||
});
|
||||
expect(result.created).toBe(true);
|
||||
expect(repo.save).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
artifactId: submission.artifactId,
|
||||
clientRequestId: submission.clientRequestId,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it('recordSubmission 同一 clientRequestId 重复提交返回既有记录且不重复创建', async () => {
|
||||
const { service, repo } = createService({
|
||||
findOne: jest.fn().mockResolvedValue(submission),
|
||||
});
|
||||
const result = await service.recordSubmission({
|
||||
artifactId: submission.artifactId,
|
||||
clientRequestId: submission.clientRequestId,
|
||||
status: 'created',
|
||||
resultJson: '{"ok":false}',
|
||||
});
|
||||
expect(result.created).toBe(false);
|
||||
expect(result.submission).toEqual(submission);
|
||||
expect(repo.save).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('findSubmission 透传查询条件', async () => {
|
||||
const { service, repo } = createService({
|
||||
findOne: jest.fn().mockResolvedValue(submission),
|
||||
});
|
||||
await expect(
|
||||
service.findSubmission(submission.artifactId, submission.clientRequestId),
|
||||
).resolves.toEqual(submission);
|
||||
expect(repo.findOne).toHaveBeenCalledWith({
|
||||
where: { artifactId: submission.artifactId, clientRequestId: submission.clientRequestId },
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user