diff --git a/apps/admin/src/api/imports.ts b/apps/admin/src/api/imports.ts index d87800a..635e8c2 100644 --- a/apps/admin/src/api/imports.ts +++ b/apps/admin/src/api/imports.ts @@ -31,9 +31,7 @@ export async function createImportRun( if (options.mapping && Object.keys(options.mapping).length > 0) { form.append('mapping', JSON.stringify(options.mapping)); } - const res = await api.post>('/imports/runs', form, { - headers: { 'Content-Type': 'multipart/form-data' }, - }); + const res = await api.post>('/imports/runs', form); return res.data; } diff --git a/apps/admin/src/components/AiChat/api.ts b/apps/admin/src/components/AiChat/api.ts index f336abc..bcbd8c3 100644 --- a/apps/admin/src/components/AiChat/api.ts +++ b/apps/admin/src/components/AiChat/api.ts @@ -35,7 +35,6 @@ export const aiChatApi = { form.append('file', file); return ( await api.post>('/ai/chat/attachments', form, { - headers: { 'Content-Type': 'multipart/form-data' }, timeout: 120_000, }) ).data; diff --git a/apps/admin/src/components/StudentProfileContent/AttachmentsTab.tsx b/apps/admin/src/components/StudentProfileContent/AttachmentsTab.tsx index 1a0f132..c987f78 100644 --- a/apps/admin/src/components/StudentProfileContent/AttachmentsTab.tsx +++ b/apps/admin/src/components/StudentProfileContent/AttachmentsTab.tsx @@ -29,9 +29,7 @@ export const AttachmentsTab: React.FC = ); const uploadAttachmentMutation = useApiMutation( async (formData: FormData) => - api.post(`/archive/${studentId}/attachments`, formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post(`/archive/${studentId}/attachments`, formData), { invalidate: [['archive', studentId]] }, ); diff --git a/apps/admin/src/pages/ClassroomRentals/index.tsx b/apps/admin/src/pages/ClassroomRentals/index.tsx index d2d5bc4..bc7bc4b 100644 --- a/apps/admin/src/pages/ClassroomRentals/index.tsx +++ b/apps/admin/src/pages/ClassroomRentals/index.tsx @@ -140,9 +140,7 @@ const ClassroomRentalsPage: React.FC = () => { ); const uploadContractMutation = useApiMutation( async ({ id, formData }: { id: number; formData: FormData }) => - api.post(`/classroom-rentals/${id}/contract`, formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post(`/classroom-rentals/${id}/contract`, formData), { invalidate: [['classroom-rentals']] }, ); diff --git a/apps/admin/src/pages/Classrooms/index.tsx b/apps/admin/src/pages/Classrooms/index.tsx index 869b901..5526afb 100644 --- a/apps/admin/src/pages/Classrooms/index.tsx +++ b/apps/admin/src/pages/Classrooms/index.tsx @@ -110,9 +110,7 @@ const ClassroomsPage: React.FC = () => { ); const importMutation = useApiMutation( async (formData: FormData) => - api.post('/classrooms/import', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post('/classrooms/import', formData), { invalidate: [['classrooms']] }, ); diff --git a/apps/admin/src/pages/Expenses/index.tsx b/apps/admin/src/pages/Expenses/index.tsx index f1e7763..e8d9dff 100644 --- a/apps/admin/src/pages/Expenses/index.tsx +++ b/apps/admin/src/pages/Expenses/index.tsx @@ -137,16 +137,12 @@ const ExpensesPage: React.FC = () => { ), importUtility: useApiMutation( async (formData: FormData) => - api.post('/expenses/utility/import', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post('/expenses/utility/import', formData), { invalidate: [['expenses']] }, ), importPersonal: useApiMutation( async (formData: FormData) => - api.post('/expenses/personal/import', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post('/expenses/personal/import', formData), { invalidate: [['expenses']] }, ), archiveRoom: useApiMutation( diff --git a/apps/admin/src/pages/Occupancies/useOccupancyMutations.ts b/apps/admin/src/pages/Occupancies/useOccupancyMutations.ts index 7e90a16..8c26a0d 100644 --- a/apps/admin/src/pages/Occupancies/useOccupancyMutations.ts +++ b/apps/admin/src/pages/Occupancies/useOccupancyMutations.ts @@ -44,9 +44,7 @@ export function useOccupancyMutations() { ); const importMutation = useApiMutation( async ({ formData, params }: { formData: FormData; params: string }) => - api.post(`/occupancies/import?${params}`, formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post(`/occupancies/import?${params}`, formData), { invalidate: invalidateOccupancies }, ); diff --git a/apps/admin/src/pages/Rooms/useRoomMutations.ts b/apps/admin/src/pages/Rooms/useRoomMutations.ts index 17ec1ac..9195594 100644 --- a/apps/admin/src/pages/Rooms/useRoomMutations.ts +++ b/apps/admin/src/pages/Rooms/useRoomMutations.ts @@ -143,9 +143,7 @@ export function useRoomMutations(editing: any) { ); const importMutation = useApiMutation( async (formData: FormData) => - api.post<{ message?: string }>('/rooms/import', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post<{ message?: string }>('/rooms/import', formData), { invalidate: [['rooms']] }, ); diff --git a/apps/admin/src/pages/Students/index.tsx b/apps/admin/src/pages/Students/index.tsx index 1ccdebf..c601801 100644 --- a/apps/admin/src/pages/Students/index.tsx +++ b/apps/admin/src/pages/Students/index.tsx @@ -228,16 +228,12 @@ const StudentsPage: React.FC = () => { ); const importMutation = useApiMutation( async (formData: FormData) => - api.post('/students/import', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post('/students/import', formData), { invalidate: invalidateStudents }, ); const importMatchMutation = useApiMutation( async (formData: FormData) => - api.post('/students/import-match', formData, { - headers: { 'Content-Type': 'multipart/form-data' }, - }), + api.post('/students/import-match', formData), { invalidate: invalidateStudents }, ); diff --git a/apps/server/src/ai-chat/ai-excel-reader.service.ts b/apps/server/src/ai-chat/ai-excel-reader.service.ts index 67ef99d..83d1d98 100644 --- a/apps/server/src/ai-chat/ai-excel-reader.service.ts +++ b/apps/server/src/ai-chat/ai-excel-reader.service.ts @@ -86,7 +86,7 @@ export class AiExcelReaderService { private async loadWithExcelJs(buffer: Buffer): Promise { const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(buffer as unknown as ArrayBuffer); const sheets: ExcelSheetRows[] = []; workbook.eachSheet((sheet) => { const rows: string[][] = []; diff --git a/apps/server/src/classrooms/classrooms.controller.ts b/apps/server/src/classrooms/classrooms.controller.ts index 92b9662..1cd7e6d 100644 --- a/apps/server/src/classrooms/classrooms.controller.ts +++ b/apps/server/src/classrooms/classrooms.controller.ts @@ -158,7 +158,7 @@ export class ClassroomsController { async importExcel(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const { ipAddress, userAgent } = extractRequestInfo(req); const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const ws = workbook.worksheets[0]; const rows: any[] = []; ws.eachRow((row, idx) => { diff --git a/apps/server/src/expenses/expenses.controller.ts b/apps/server/src/expenses/expenses.controller.ts index 011a93b..76aa6ad 100644 --- a/apps/server/src/expenses/expenses.controller.ts +++ b/apps/server/src/expenses/expenses.controller.ts @@ -316,7 +316,7 @@ export class ExpensesController { @UseInterceptors(FileInterceptor('file')) async importUtilityExpenses(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const ws = workbook.worksheets[0]; const rows: any[] = []; ws.eachRow((row, idx) => { @@ -381,7 +381,7 @@ export class ExpensesController { @UseInterceptors(FileInterceptor('file')) async importPersonalExpenses(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const ws = workbook.worksheets[0]; const rows: any[] = []; ws.eachRow((row, idx) => { diff --git a/apps/server/src/imports/imports.workbook.ts b/apps/server/src/imports/imports.workbook.ts index dcfeaa5..e4f248e 100644 --- a/apps/server/src/imports/imports.workbook.ts +++ b/apps/server/src/imports/imports.workbook.ts @@ -84,7 +84,7 @@ export async function parseSheets( if (kind === 'csv') { await workbook.csv.read(Readable.from(Buffer.from(buffer))); } else { - await workbook.xlsx.load(buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(buffer as unknown as ArrayBuffer); } const sheets = extractSheets(workbook, headerRow); if (sheets.length === 0) { diff --git a/apps/server/src/occupancies/occupancies.controller.ts b/apps/server/src/occupancies/occupancies.controller.ts index ee49fa3..9ee2277 100644 --- a/apps/server/src/occupancies/occupancies.controller.ts +++ b/apps/server/src/occupancies/occupancies.controller.ts @@ -264,7 +264,7 @@ export class OccupanciesController { const { ipAddress, userAgent } = extractRequestInfo(req); if (!file?.buffer) throw new BadRequestException('请上传入住名单 Excel 文件'); const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const ws = workbook.worksheets[0]; const rows = parseOccupancyImportWorksheet(ws); const result = await this.service.batchImportCheckIn(rows, { diff --git a/apps/server/src/rooms/rooms.controller.ts b/apps/server/src/rooms/rooms.controller.ts index dda7648..a7db9a8 100644 --- a/apps/server/src/rooms/rooms.controller.ts +++ b/apps/server/src/rooms/rooms.controller.ts @@ -343,7 +343,7 @@ export class RoomsController { async importExcel(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const { ipAddress, userAgent } = extractRequestInfo(req); const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const ws = workbook.worksheets[0]; const rows: { roomNumber: string; diff --git a/apps/server/src/students/students.controller.ts b/apps/server/src/students/students.controller.ts index 2e85695..0920f64 100644 --- a/apps/server/src/students/students.controller.ts +++ b/apps/server/src/students/students.controller.ts @@ -255,7 +255,7 @@ export class StudentsController { @UseInterceptors(FileInterceptor('file')) async importExcel(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const importData = parseStudentImportWorkbook(workbook); // Resolve organization names to IDs for (const row of importData.students) { @@ -280,7 +280,7 @@ export class StudentsController { @UseInterceptors(FileInterceptor('file')) async matchImport(@UploadedFile() file: Express.Multer.File, @Request() req: any) { const workbook = new ExcelJS.Workbook(); - await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer); + await workbook.xlsx.load(file.buffer as unknown as ArrayBuffer); const importData = parseStudentImportWorkbook(workbook); // Resolve organization names to IDs for (const row of importData.students) {