Files
gongxue-base/apps/server/src/app.module.ts
wangziqi ab4765cee5 feat: Excel 导入预检与动态问答,AI 聊天/文件解析体验修复
- imports: 新增 preflight_import 预检报告(判定/分阶段统计/阻断归因/问题/下一步/错误示例),导入任务 settings 落库(映射/校区/更新/重复/未匹配策略),预览应用策略,向导提交写操作日志
- ai-chat: 新增 excel_analyze(ExcelJS)工具,移除附件/上下文截断,start_import_wizard 支持确认参数,ui.import_preflight SSE,预览确认写操作日志
- admin: ImportPreflightCard 渲染与持久化,聊天抽屉布局/侧边栏修复,考勤页 CSS 引入,费用/学生页接口 schema 校验修复
2026-08-05 21:12:50 +08:00

209 lines
8.1 KiB
TypeScript

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { LoggerModule } from 'nestjs-pino';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { TypeOrmModule, type TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { ScheduleModule } from '@nestjs/schedule';
import * as Entities from './entities';
import { AuthModule } from './auth/auth.module';
import { InitialSchema1784520727860 } from './migrations/1784520727860-InitialSchema';
import { AddExamManagement1784600000000 } from './migrations/1784600000000-AddExamManagement';
import { AddRoomInspections1784680000000 } from './migrations/1784680000000-AddRoomInspections';
import { AddJinshujuMatchRules1784700000000 } from './migrations/1784700000000-AddJinshujuMatchRules';
import { AddAiChat1784780000000 } from './migrations/1784780000000-AddAiChat';
import { EnhanceAiChatForAntDesignX1784860000000 } from './migrations/1784860000000-EnhanceAiChatForAntDesignX';
import { AddA2UiForms1784870000000 } from './migrations/1784870000000-AddA2UiForms';
import { AddA2UiReviews1784880000000 } from './migrations/1784880000000-AddA2UiReviews';
import { AddImportRuns1784910000000 } from './migrations/1784910000000-AddImportRuns';
import { DropAiMessageFeedback1784920000000 } from './migrations/1784920000000-DropAiMessageFeedback';
import { AddImportRunSettings1784930000000 } from './migrations/1784930000000-AddImportRunSettings';
const allMigrations = [
InitialSchema1784520727860,
AddExamManagement1784600000000,
AddRoomInspections1784680000000,
AddJinshujuMatchRules1784700000000,
AddAiChat1784780000000,
EnhanceAiChatForAntDesignX1784860000000,
AddA2UiForms1784870000000,
AddA2UiReviews1784880000000,
AddImportRuns1784910000000,
DropAiMessageFeedback1784920000000,
AddImportRunSettings1784930000000,
];
import { AuthorizationModule } from './authorization';
import { RbacModule } from './rbac/rbac.module';
import { StudentsModule } from './students/students.module';
import { PermissionGuard } from './auth/guards/permission.guard';
import { PoliciesGuard } from './authorization/guards/policies.guard';
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
import { RoomsModule } from './rooms/rooms.module';
import { OccupanciesModule } from './occupancies/occupancies.module';
import { ExpensesModule } from './expenses/expenses.module';
import { BillsModule } from './bills/bills.module';
import { DashboardModule } from './dashboard/dashboard.module';
import { OperationLogsModule } from './operation-logs/operation-logs.module';
import { DepositsModule } from './deposits/deposits.module';
import { ClassroomsModule } from './classrooms/classrooms.module';
import { ClassesModule } from './classes/classes.module';
import { OrganizationsModule } from './organizations/organizations.module';
import { AttendanceModule } from './attendance/attendance.module';
import { AttendanceDevicesModule } from './attendance-devices/attendance-devices.module';
import { SchedulesModule } from './schedules/schedules.module';
import { ClassroomRentalsModule } from './classroom-rentals/classroom-rentals.module';
import { SyncModule } from './sync/sync.module';
import { NotificationsModule } from './notifications/notifications.module';
import { ArchiveModule } from './archive/archive.module';
import { ExpenseTypesModule } from './expense-types/expense-types.module';
import { DatabaseMigrationsModule } from './database/database-migrations.module';
import { AgentToolsModule } from './agent-tools';
import { AiConfigModule } from './ai-config/ai-config.module';
import { WalletsModule } from './wallets/wallets.module';
import { FinancialOperationsModule } from './financial-operations/financial-operations.module';
import { ExamsModule } from './exams/exams.module';
import { AiChatModule } from './ai-chat';
import { ImportsModule } from './imports/imports.module';
import {
IntegrationConfig,
IntegrationConfigDetail,
} from './integration/entities/integration-config.entity';
import { IntegrationConfigModule } from './integration/config/config.module';
@Module({
imports: [
LoggerModule.forRoot({
pinoHttp: {
level: process.env.LOG_LEVEL ?? 'info',
autoLogging: process.env.NODE_ENV === 'production',
},
}),
AuthorizationModule,
ConfigModule.forRoot({ isGlobal: true }),
ThrottlerModule.forRoot([
{
ttl: 60000, // 60秒窗口
limit: 100, // 普通接口每分钟100次
},
]),
EventEmitterModule.forRoot(),
ScheduleModule.forRoot(),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService): TypeOrmModuleOptions => {
const allEntities = [
Entities.Student,
Entities.Room,
Entities.Occupancy,
Entities.Bed,
Entities.Locker,
Entities.RoomExpense,
Entities.PersonalExpense,
Entities.Bill,
Entities.BillItem,
Entities.User,
Entities.OperationLog,
Entities.RoomInspection,
Entities.RoomInspectionDetail,
Entities.Deposit,
Entities.DepositInstallment,
Entities.Classroom,
Entities.Organization,
Entities.ClassroomRental,
Entities.Class,
Entities.ClassStudent,
Entities.ClassTeacher,
Entities.Permission,
Entities.Role,
Entities.ClassSchedule,
Entities.AttendanceRecord,
Entities.AttendanceSession,
Entities.AttendanceDevice,
Entities.AttendancePeriodConfig,
Entities.DingAttendanceRaw,
Entities.DingLeaveRaw,
Entities.Notification,
Entities.StudentProfile,
Entities.StudentEnrollment,
Entities.ExamScore,
Entities.Exam,
Entities.LearningRecord,
Entities.StudentDingMapping,
Entities.JinshujuMatchRule,
Entities.ExpenseType,
Entities.ArchiveAttachment,
Entities.ResultArchive,
Entities.SyncLog,
Entities.SyncState,
IntegrationConfig,
IntegrationConfigDetail,
Entities.AiConfig,
Entities.StudentWallet,
Entities.WalletTransaction,
Entities.FinancialOperation,
Entities.AiConversation,
Entities.AiMessage,
Entities.AiToolRun,
Entities.AiAttachment,
Entities.AiForm,
Entities.AiReview,
Entities.ImportRun,
Entities.ImportStep,
Entities.ImportRow,
];
return {
type: 'mysql' as const,
host: config.get('DB_HOST', 'localhost'),
port: config.get<number>('DB_PORT', 3306),
username: config.get('DB_USERNAME', 'root'),
password: config.get<string>('DB_PASSWORD', ''),
database: config.get<string>('DB_DATABASE', 'dorm_billing'),
entities: allEntities,
migrations: allMigrations,
synchronize: config.get('DB_SYNCHRONIZE', 'true') !== 'false',
charset: 'utf8mb4',
};
},
}),
DatabaseMigrationsModule,
AuthModule,
RbacModule,
StudentsModule,
ExamsModule,
RoomsModule,
OccupanciesModule,
ExpensesModule,
BillsModule,
DashboardModule,
OperationLogsModule,
DepositsModule,
WalletsModule,
FinancialOperationsModule,
ClassroomsModule,
AttendanceModule,
AttendanceDevicesModule,
ClassesModule,
OrganizationsModule,
SchedulesModule,
ClassroomRentalsModule,
SyncModule,
NotificationsModule,
ArchiveModule,
IntegrationConfigModule,
AgentToolsModule,
ExpenseTypesModule,
AiConfigModule,
AiChatModule,
ImportsModule,
],
providers: [
{ provide: APP_GUARD, useClass: ThrottlerGuard },
{ provide: APP_GUARD, useClass: JwtAuthGuard },
{ provide: APP_GUARD, useClass: PermissionGuard },
{ provide: APP_GUARD, useClass: PoliciesGuard },
],
})
export class AppModule {}