feat: DingTalk attendance import + integration config + expense types + UI polish

Server:
- Add DingTalk attendance import service with SSE progress streaming
- Add IntegrationConfig entity & module for multi-tenant DingTalk setup
- Add ExpenseType entity & ExpenseTypesModule
- Add SeedModule for DB initialization
- Add UserDingMapping entity for DingTalk user linkage
- Attendance service: import flow with dedup & student auto-mapping
- Rooms service: time-range overlap queries
- Sync controller/service: DingTalk integration wiring
- Permission guard: refactor to pure re-export
- Campus scope middleware: tenant-aware filtering

Admin UI:
- Attendance page: import UI with progress & result summary
- All pages: tableStyle/tablePagination standardization
- Login page: responsive styling
- Sensitive data: useViewSensitive hook for masked viewing
- Vite config: path aliases, build optimization
- Test infra: vitest config, test utilities

Docs: PRD DingTalk batch 1 & 2 design docs
This commit is contained in:
2026-07-09 09:11:56 +08:00
parent f1959f0d2a
commit 42d3f0e27f
71 changed files with 5331 additions and 609 deletions

View File

@@ -36,8 +36,10 @@ import {
StudentEnrollment,
ExamScore,
LearningRecord,
ExpenseType,
ResultArchive,
ArchiveAttachment,
UserDingMapping,
} from './entities';
import { AuthModule } from './auth/auth.module';
import { RbacModule } from './rbac/rbac.module';
@@ -62,6 +64,12 @@ import { NotificationsModule } from './notifications/notifications.module';
import { DepartmentsModule } from './departments/departments.module';
import { CommonModule } from './common/common.module';
import { ArchiveModule } from './archive/archive.module';
import { SeedModule } from './seed/seed.module';
import { ExpenseTypesModule } from './expense-types/expense-types.module';
import { IntegrationConfig, IntegrationConfigDetail } from './integration/entities/integration-config.entity';
import { IntegrationConfigModule } from './integration/config/config.module';
import { CampusScopeMiddleware } from './common/campus-scope.middleware';
@Module({
imports: [
@@ -108,8 +116,14 @@ import { CampusScopeMiddleware } from './common/campus-scope.middleware';
StudentEnrollment,
ExamScore,
LearningRecord,
ResultArchive,
ExpenseType,
ArchiveAttachment,
ResultArchive,
SyncLog,
SyncState,
UserDingMapping,
IntegrationConfig,
IntegrationConfigDetail,
];
if (dbType === 'mysql') {
return {
@@ -153,6 +167,9 @@ import { CampusScopeMiddleware } from './common/campus-scope.middleware';
DepartmentsModule,
CommonModule,
ArchiveModule,
SeedModule,
IntegrationConfigModule,
ExpenseTypesModule,
],
providers: [
{ provide: APP_GUARD, useClass: ThrottlerGuard },