feat: Excel 导入预检与动态问答,AI 聊天/文件解析体验修复

- imports: 新增 preflight_import 预检报告(判定/分阶段统计/阻断归因/问题/下一步/错误示例),导入任务 settings 落库(映射/校区/更新/重复/未匹配策略),预览应用策略,向导提交写操作日志
- ai-chat: 新增 excel_analyze(ExcelJS)工具,移除附件/上下文截断,start_import_wizard 支持确认参数,ui.import_preflight SSE,预览确认写操作日志
- admin: ImportPreflightCard 渲染与持久化,聊天抽屉布局/侧边栏修复,考勤页 CSS 引入,费用/学生页接口 schema 校验修复
This commit is contained in:
2026-08-05 21:12:50 +08:00
parent b70f45fb04
commit ab4765cee5
44 changed files with 2449 additions and 166 deletions

View File

@@ -16,6 +16,7 @@ import { AiFormService } from './ai-form.service';
import { AiReviewService } from './ai-review.service';
import { AiModelStreamService } from './ai-model-stream.service';
import { OfficeCliService } from './office-cli.service';
import { OperationLogsService } from '../operation-logs/operation-logs.service';
import {
AiConversation,
AiMessage,
@@ -72,7 +73,11 @@ import {
markReviewSubmittedOnMessage,
} from './ai-chat.submissions';
import { denyWriteTool, executeTool } from './ai-chat.tools';
import { executeStartImportWizard } from './ai-chat.tool-actions';
import {
executeExcelAnalyze,
executePreflightImport,
executeStartImportWizard,
} from './ai-chat.tool-actions';
import { executeGeneration } from './ai-chat.generation';
import {
assertGeneratedLength,
@@ -108,6 +113,7 @@ export class AiChatService implements AiChatServiceContext {
readonly excelReader?: AiExcelReaderService,
readonly officeCli?: OfficeCliService,
readonly importsService?: ImportsService,
readonly opLog?: OperationLogsService,
) {}
listSkills(user: AuthenticatedUser): AgentSkillDescriptor[] {
@@ -291,6 +297,24 @@ export class AiChatService implements AiChatServiceContext {
return executeStartImportWizard(this, messageId, call, context, emit);
}
executePreflightImport(
messageId: number,
call: ModelToolCall,
userId: number,
emit: AiSseEmitter,
): Promise<string> {
return executePreflightImport(this, messageId, call, userId, emit);
}
executeExcelAnalyze(
messageId: number,
call: ModelToolCall,
userId: number,
emit: AiSseEmitter,
): Promise<string> {
return executeExcelAnalyze(this, messageId, call, userId, emit);
}
executeGeneration(input: GenerationInput): Promise<void> {
return executeGeneration(this, input);
}