fix: use real name and phone from frontend when importing students

This commit is contained in:
2026-07-10 09:50:18 +08:00
parent b261ec5930
commit 31bcd15189
2 changed files with 18 additions and 13 deletions

View File

@@ -94,7 +94,7 @@ export class ClassesController {
@Param('id') id: string, @Param('id') id: string,
@Body() dto: BatchImportStudentsDto, @Body() dto: BatchImportStudentsDto,
) { ) {
return this.service.batchImportStudents(+id, dto.dingUserIds); return this.service.batchImportStudents(+id, dto.users);
} }
/** 归档班级 */ /** 归档班级 */

View File

@@ -94,7 +94,7 @@ export class ClassesService {
} }
async create(dto: CreateClassDto) { async create(dto: CreateClassDto) {
const { studentIds, teachers, dingUserIds, ...classData } = dto; const { studentIds, teachers, users, ...classData } = dto;
const cls = this.classRepo.create(classData); const cls = this.classRepo.create(classData);
@@ -120,19 +120,23 @@ export class ClassesService {
} }
// batch import students by dingUserIds // batch import students by dingUserIds
if (dingUserIds?.length) { if (users?.length) {
await this.batchImportStudents(saved.id, dingUserIds); await this.batchImportStudents(saved.id, users);
} }
return this.findOne(saved.id); return this.findOne(saved.id);
} }
async batchImportStudents(classId: number, dingUserIds: string[]): Promise<{ imported: number; skipped: number }> { async batchImportStudents(classId: number, users: Array<{
dingUserId: string; name: string; mobile?: string;
}>): Promise<{ imported: number; skipped: number }> {
const classEntity = await this.classRepo.findOne({ where: { id: classId } }); const classEntity = await this.classRepo.findOne({ where: { id: classId } });
if (!classEntity) throw new NotFoundException('班级不存在'); if (!classEntity) throw new NotFoundException('班级不存在');
if (dingUserIds.length === 0) return { imported: 0, skipped: 0 }; if (users.length === 0) return { imported: 0, skipped: 0 };
const dingUserIds = users.map(u => u.dingUserId);
// 1. Fetch all existing ding mappings in one query // 1. Fetch all existing ding mappings in one query
const existingMappings = await this.studentDingMappingRepo.find({ const existingMappings = await this.studentDingMappingRepo.find({
@@ -141,23 +145,24 @@ export class ClassesService {
const dingToStudentId = new Map(existingMappings.map(m => [m.dingUserId, m.studentId])); const dingToStudentId = new Map(existingMappings.map(m => [m.dingUserId, m.studentId]));
// 2. Batch create students for new dingUserIds // 2. Batch create students for new dingUserIds
const newDingUserIds = dingUserIds.filter(id => !dingToStudentId.has(id)); const newUsers = users.filter(u => !dingToStudentId.has(u.dingUserId));
if (newDingUserIds.length > 0) { if (newUsers.length > 0) {
const newStudents = newDingUserIds.map(dingUserId => const newStudents = newUsers.map(u =>
this.studentRepo.create({ this.studentRepo.create({
name: `dd_${dingUserId}`, name: u.name,
phone: u.mobile || `dt_${u.dingUserId}`,
status: 'active', status: 'active',
}) })
); );
const savedStudents = await this.studentRepo.save(newStudents); const savedStudents = await this.studentRepo.save(newStudents);
const newMappings = savedStudents.map((s, i) => const newMappings = savedStudents.map((s, i) =>
this.studentDingMappingRepo.create({ dingUserId: newDingUserIds[i], studentId: s.id }) this.studentDingMappingRepo.create({ dingUserId: newUsers[i].dingUserId, studentId: s.id })
); );
await this.studentDingMappingRepo.save(newMappings); await this.studentDingMappingRepo.save(newMappings);
for (let i = 0; i < newDingUserIds.length; i++) { for (let i = 0; i < newUsers.length; i++) {
dingToStudentId.set(newDingUserIds[i], savedStudents[i].id); dingToStudentId.set(newUsers[i].dingUserId, savedStudents[i].id);
} }
} }