From 2e7bb81ebdec5ef30f5a98f265f0ab4b0728e805 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Thu, 6 Aug 2026 11:58:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E4=BF=AE=E6=AD=A3=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20schema=20=E4=B8=8E=E8=B7=AF=E7=94=B1=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - classroomSchema 允许 building/status 为 null,教室查看页恢复数据 - 排期 matrix 单元格为对象而非数组,教室排期页恢复渲染 - 押金批量收取改用 /deposits/eligible-students 路由 - 学生下拉 schema 按 /deposits/student-lookups 实际结构校验 - 水电费录入改走 /expenses/student-utility,批量恢复改为 PUT --- apps/admin/src/api/schemas/core.ts | 10 +++++++--- apps/admin/src/api/schemas/dashboard.ts | 3 ++- apps/admin/src/pages/Deposits/index.tsx | 8 ++++++-- apps/admin/src/pages/Expenses/index.tsx | 6 +++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/apps/admin/src/api/schemas/core.ts b/apps/admin/src/api/schemas/core.ts index 5339f16..722e327 100644 --- a/apps/admin/src/api/schemas/core.ts +++ b/apps/admin/src/api/schemas/core.ts @@ -153,8 +153,8 @@ export const classroomSchema = z .object({ id: z.number(), name: z.string(), - building: z.string().optional(), - status: z.string().optional(), + building: z.string().nullable().optional(), + status: z.string().nullable().optional(), }) .passthrough(); @@ -180,7 +180,11 @@ export const depositSchema = z export const depositsSchema = z.array(depositSchema); export const depositStudentLookupSchema = z - .object({ studentId: z.number(), name: z.string().nullable().optional() }) + .object({ + id: z.number(), + name: z.string().nullable().optional(), + studentNo: z.string().nullable().optional(), + }) .passthrough(); export const depositStudentLookupsSchema = z.array(depositStudentLookupSchema); diff --git a/apps/admin/src/api/schemas/dashboard.ts b/apps/admin/src/api/schemas/dashboard.ts index 99a3ea0..d3dbce3 100644 --- a/apps/admin/src/api/schemas/dashboard.ts +++ b/apps/admin/src/api/schemas/dashboard.ts @@ -4,7 +4,8 @@ export const classroomScheduleSchema = z .object({ classrooms: z.array(z.record(z.string(), z.unknown())), organizations: z.array(z.record(z.string(), z.unknown())), - matrix: z.record(z.string(), z.record(z.string(), z.array(z.record(z.string(), z.unknown())))), + // matrix: 教室 id → 日期 → 单条排课/租赁记录(对象,非数组) + matrix: z.record(z.string(), z.record(z.string(), z.record(z.string(), z.unknown()))), summary: z.record(z.string(), z.record(z.string(), z.unknown())), days: z.number().optional(), }) diff --git a/apps/admin/src/pages/Deposits/index.tsx b/apps/admin/src/pages/Deposits/index.tsx index 60babc3..20358bd 100644 --- a/apps/admin/src/pages/Deposits/index.tsx +++ b/apps/admin/src/pages/Deposits/index.tsx @@ -97,7 +97,11 @@ const DepositsPage: React.FC = () => { { invalidate: [['deposits']] }, ); const payInstallmentMutation = useApiMutation( - async (installmentId: number) => api.post(`/deposits/installments/${installmentId}/pay`), + async (installmentId: number) => + api.put(`/deposits/installments/${installmentId}`, { + status: 'paid', + paidDate: dayjs().format('YYYY-MM-DD'), + }), { invalidate: [['deposits']] }, ); const saveInstallmentCellMutation = useApiMutation( @@ -135,7 +139,7 @@ const DepositsPage: React.FC = () => { if (eligibleRoomType) params.roomType = eligibleRoomType; return validateResponse( eligibleStudentsSchema, - await api.get('/deposits/eligible', { params }), + await api.get('/deposits/eligible-students', { params }), ); }, }); diff --git a/apps/admin/src/pages/Expenses/index.tsx b/apps/admin/src/pages/Expenses/index.tsx index 967d928..f1e7763 100644 --- a/apps/admin/src/pages/Expenses/index.tsx +++ b/apps/admin/src/pages/Expenses/index.tsx @@ -132,7 +132,7 @@ const ExpensesPage: React.FC = () => { { invalidate: [['expenses']] }, ), utility: useApiMutation( - async (payload: Record) => api.post('/expenses/utility', payload), + async (payload: Record) => api.post('/expenses/student-utility', payload), { invalidate: [['expenses'], ['bills']] }, ), importUtility: useApiMutation( @@ -166,11 +166,11 @@ const ExpensesPage: React.FC = () => { { invalidate: [['expenses']] }, ), batchRestoreRoom: useApiMutation( - async (ids: number[]) => api.post('/expenses/room/batch-restore', { ids }), + async (ids: number[]) => api.put('/expenses/room/batch-restore', { ids }), { invalidate: [['expenses']] }, ), batchRestorePersonal: useApiMutation( - async (ids: number[]) => api.post('/expenses/personal/batch-restore', { ids }), + async (ids: number[]) => api.put('/expenses/personal/batch-restore', { ids }), { invalidate: [['expenses']] }, ), purgeRoom: useApiMutation(