Commit Graph

227 Commits

Author SHA1 Message Date
1ca4a4d185 fix(archive): serve student attachments securely
Download attachments through authenticated API requests, support configurable upload paths, validate resolved file locations, and retain compatibility with legacy stored paths.
2026-07-10 14:11:47 +08:00
55881863c1 feat(sync): sync class schedules to DingTalk students
Group active schedules by class, resolve enrolled students through DingTalk mappings, reuse shifts and attendance groups, and expose class-based sync status in the admin UI.
2026-07-10 14:11:39 +08:00
bc6b8b0095 fix: 修复入住管理白屏、重构首页工作台、拍平教务菜单
- Occupancies: 补齐缺失的 Alert import(渲染时 ReferenceError 导致白屏),
  并为两处 api.get 补泛型消除既有类型错误
- Dashboard: 改为待办优先的工作台(待办异常区 + 核心 KPI + 更多指标折叠 +
  图表按重要性重排),修复 fetchData 无限请求循环(loadedRef),
  重活图表用 IntersectionObserver(callback ref)懒加载
- MainLayout: 将三层嵌套的"教室管理"提升为一级菜单,全站菜单统一为两层
2026-07-10 11:16:30 +08:00
18060d44a8 fix: pass user name and mobile to backend when importing students 2026-07-10 09:50:45 +08:00
97c2ceccde fix: re-apply UX fixes on Bills, Expenses, Deposits
- Add Empty component to antd imports
- Replace console.error with message.error in catch blocks
- Add batchLoading state + guard on batch operations
- Add locale emptyText to Tables
2026-07-09 19:57:10 +08:00
8f28c172c4 fix: close unclosed fragments in Expenses/Deposits, fix brace in Bills 2026-07-09 19:52:33 +08:00
bc2ff2b270 fix: brace mismatch in Classes fetchData try/catch/finally 2026-07-09 19:49:21 +08:00
c59fd6ce92 fix(admin): UX improvements — silent fetch failures, empty states, batch loading guards, dashboard refresh
- Replace console.error-only catches with message.error user-facing notifications
  across Bills, Classes, ClassroomRentals, ClassroomSchedule, Classrooms, Deposits,
  Expenses, OperationLogs, Permissions, Roles, RoomVisual, Rooms, Students,
  Tenants, Users
- Add Empty component via Table locale prop on list pages: Bills, Classes,
  ClassroomRentals, Classrooms, Deposits, Expenses (room+personal), Occupancies,
  Rooms, Students, Tenants, Roles
- Add batchLoading state to batch delete/update operations: Bills (batchDelete,
  batchUpdateStatus), Expenses (batchDeleteRoom, batchDeletePersonal),
  Occupancies (batchCheckOut, batchDelete), Rooms (batchDelete),
  Students (batchDelete)
- Add refreshLoading indicator to Dashboard header when re-fetching data
- Consistent error pattern: catch (e: unknown) { const err = e as { message?: string }; message.error(...); }
2026-07-09 18:03:42 +08:00
b0f7883f33 feat(admin): remove all department/campus scoping from frontend
- Delete CampusSwitcher component and useCampus hook
- Delete Departments page and its route
- Remove campus header interceptor from API client
- Remove departmentId from Class interfaces
- Remove campusLocation from student profile
- Remove department permissions from test fixtures
- Remove currentCampusId from test cleanup

TypeScript compiles clean.
2026-07-09 17:40:57 +08:00
22bc1876d8 refactor: remove departmentId from Class entity 2026-07-09 17:32:37 +08:00
9b7a8e37b4 fix: resolve 5 review findings
Critical 1: Remove broken '钉钉绑定' tab (IntegConfig) — deleted /rbac/user-ding-mappings calls
Critical 2: Fix decorator placement in CreateClassDto — @IsOptional @IsArray restored to teachers
Important 1: Restore sync.service.spec.ts from 1fa3363, strip importDingTalkUsers tests
Important 2: Fix N+1 in batchImportStudents — batched find/save with In() operator
Important 3: Add migrate-student-ding-mapping.sql
2026-07-09 17:25:44 +08:00
1f63a53222 feat: rewrite sync drawer with checkable tree + class batch import 2026-07-09 17:16:08 +08:00
c1d065a5e6 fix(students): remove staff role from status map 2026-07-09 16:32:02 +08:00
5145c3e4b4 fix(layout): use controlled sidebar openKeys to preserve manual expand/collapse across navigation 2026-07-09 16:31:56 +08:00
d1d5b4681b feat(schedules): replace teacher ID input with searchable user select, show teacher name, add schedule button 2026-07-09 16:31:53 +08:00
7e4f06058c fix(admin): match flat API response shape, no nested data envelope 2026-07-09 15:52:40 +08:00
2da2e68318 fix(admin): refactor inline map arrow to avoid oxc TSX parser confusion 2026-07-09 15:46:24 +08:00
d2d0ca31ad fix(admin): use type pattern consistent with rest of codebase (oxc compat) 2026-07-09 15:43:46 +08:00
867e1aab1f fix(admin): avoid TSX generic syntax to fix oxc parser in Vite 8 2026-07-09 15:41:30 +08:00
8bfb8bf7ae fix(admin): fix syntax error — missing closing parens in map after console.log removal 2026-07-09 15:39:03 +08:00
b624c52b30 fix(admin): restore nested ImportUsersResponse and remove debug console.log 2026-07-09 15:24:54 +08:00
f7df3bdcf1 fix(admin): only show class-mark button on leaf departments with users 2026-07-09 15:18:23 +08:00
db3e4aae84 fix(admin): display classCount and warnings in import response 2026-07-09 13:01:07 +08:00
7f42c12392 feat(admin): add class marking modal in DingTalk org import drawer 2026-07-09 12:41:29 +08:00
e90f73cb60 fix: broken Form.Item tag in check-in room select 2026-07-09 12:19:04 +08:00
74e6171e17 feat: add bed occupancy stats to RoomVisual cards and API 2026-07-09 12:18:30 +08:00
ba94a0e091 feat: add bed/locker selection to check-in form and occupancy table 2026-07-09 12:16:51 +08:00
5700fa556b fix: restore RoomPage component wrapper and fix action column 2026-07-09 12:13:19 +08:00
e572f92017 feat: upgrade Room detail to Drawer with Bed/Locker tabs 2026-07-09 12:08:06 +08:00
454a0d24c6 fix: release beds/lockers in batchCheckOut
The batchCheckOut method was not releasing assigned beds and lockers
after checkout, leaving them orphaned as 'occupied'. Added the same
release pattern used in checkOut() — using runner.manager.update()
since batchCheckOut operates inside a QueryRunner transaction.
2026-07-09 12:05:36 +08:00
fb8c897b4f fix: disable import button when roles not loaded (null defaultTeacherRoleId guard) 2026-07-09 11:32:01 +08:00
0cfdab95ee fix: add DTO validation, transactional imports, role-not-found handling, null role guard 2026-07-09 11:28:11 +08:00
33e6cb445c fix: parallel fetches, error handling, extract UserTreeNode component 2026-07-09 11:16:47 +08:00
a42039d1df feat: add sync users Tab with Drawer tree to IntegrationConfig 2026-07-09 11:13:05 +08:00
3790b2dabb refactor: remove sync and mark-staff buttons from Users page 2026-07-09 11:06:58 +08:00
e8dec3b171 feat: add DingTalk integration config page 2026-07-09 10:14:51 +08:00
7df7695073 fix: missing '>' in header div tag on Users page 2026-07-09 10:11:07 +08:00
903f090293 feat: add staff status filter in student management 2026-07-09 10:07:51 +08:00
e20e22fc65 feat: add mark-staff/restore-student buttons in user management 2026-07-09 10:07:34 +08:00
42d3f0e27f 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
2026-07-09 09:11:56 +08:00
a7cb2865a9 fix: update StudentProfileContent report buttons to use /report-html, remove dead /report references 2026-07-07 10:03:19 +08:00
6e6dd25dc1 feat: change report button to preview in new window 2026-07-07 09:53:39 +08:00
24126ab3a9 fix: adjust Students table scroll.x to match total column width 2026-07-07 09:40:52 +08:00
693ba5d3b8 feat: complete remaining PRD tasks — RBAC nodes and staff split, schedule month view, auto-generate attendance from schedules, plus fix TypeORM name 2026-07-06 18:10:14 +08:00
5ea49d0a9e feat(classes): add schedule and attendance-summary endpoints + frontend tabs
- Add GET /classes/:id/schedule returning ClassSchedule list with classroom name
- Add GET /classes/:id/attendance-summary returning attendance/absence/late rates
- Add 课表 and 出勤汇总 tabs to Classes detail page
- Register ClassSchedule and AttendanceRecord in ClassesModule
2026-07-06 17:48:19 +08:00
85872d6564 refactor(admin): extract StudentProfileContent component and reuse in drawer 2026-07-06 17:22:09 +08:00
b8563fbde0 fix: use div wrapper for Drawer content 2026-07-06 17:01:17 +08:00
edb80b7fb2 fix: wrap Drawer content in fragment 2026-07-06 17:00:51 +08:00
b4fa3ab1fd feat: add learning records and attachments tabs to profile Drawer, plus PDF report button 2026-07-06 17:00:13 +08:00
09eb9ca9e0 fix: archive button opens Drawer instead of navigating to separate page 2026-07-06 16:58:54 +08:00