diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java index 6b66423..8050445 100644 --- a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java @@ -356,9 +356,19 @@ public class PgStudentServiceImpl implements IPgStudentService { } // 5. 查找或创建会员 - Long memberId = findOrCreateMember(dto.getMemberPhone().trim()); + PgMember member = findOrCreateMember(dto.getMemberPhone().trim()); + Long memberId = member.getMemberId(); - // 6. 检查学号是否重复 + // 6. 教师身份校验:教师的区域/学校/年级/班级必须与学生一致 + if ("2".equals(member.getIdentityType())) { + String teacherError = validateTeacherStudent(member, school, schoolGrade, schoolClass); + if (teacherError != null) { + failList.add(createFailItem(rowNum, teacherError)); + continue; + } + } + + // 7. 检查学号是否重复 if (StrUtil.isNotBlank(dto.getStudentNo())) { PgStudent existStudent = baseMapper.selectOne( new LambdaQueryWrapper() @@ -370,7 +380,7 @@ public class PgStudentServiceImpl implements IPgStudentService { } } - // 7. 创建学生 + // 8. 创建学生 PgStudent student = new PgStudent(); student.setStudentName(dto.getStudentName().trim()); student.setStudentNo(StrUtil.isNotBlank(dto.getStudentNo()) ? dto.getStudentNo().trim() : null); @@ -440,14 +450,14 @@ public class PgStudentServiceImpl implements IPgStudentService { /** * 查找或创建会员 */ - private Long findOrCreateMember(String phone) { + private PgMember findOrCreateMember(String phone) { // 先查找已有会员 PgMember member = memberMapper.selectOne( new LambdaQueryWrapper() .eq(PgMember::getPhone, phone) ); if (member != null) { - return member.getMemberId(); + return member; } // 不存在则创建新会员(身份为家长,初始密码123456) @@ -462,7 +472,46 @@ public class PgStudentServiceImpl implements IPgStudentService { newMember.setRegisterTime(new Date()); // 注册时间 memberMapper.insert(newMember); - return newMember.getMemberId(); + return newMember; + } + + /** + * 校验教师与学生的归属关系 + * 教师的区域/学校/年级/班级必须与学生一致 + */ + private String validateTeacherStudent(PgMember teacher, PgSchool studentSchool, + PgSchoolGrade studentGrade, PgSchoolClass studentClass) { + String teacherInfo = "教师\"" + (teacher.getNickname() != null ? teacher.getNickname() : "未知") + + "\"(" + teacher.getPhone() + ")"; + + // 检查教师是否设置了学校信息 + if (teacher.getSchoolId() == null || teacher.getSchoolGradeId() == null || teacher.getSchoolClassId() == null) { + return teacherInfo + "未设置学校信息,无法绑定学生"; + } + + // 校验区域(通过学校的区域ID间接校验) + if (teacher.getRegionId() != null && studentSchool.getRegionId() != null) { + if (!teacher.getRegionId().equals(studentSchool.getRegionId())) { + return teacherInfo + "所属区域与学生不一致"; + } + } + + // 校验学校 + if (!teacher.getSchoolId().equals(studentSchool.getSchoolId())) { + return teacherInfo + "所属学校与学生不一致"; + } + + // 校验年级 + if (!teacher.getSchoolGradeId().equals(studentGrade.getId())) { + return teacherInfo + "所属年级与学生不一致"; + } + + // 校验班级 + if (!teacher.getSchoolClassId().equals(studentClass.getId())) { + return teacherInfo + "所属班级与学生不一致"; + } + + return null; // 校验通过 } /** diff --git a/docs/01-需求文档/需求规格说明书_v1.0.md b/docs/01-需求文档/需求规格说明书_v1.0.md index e50a76e..a23f83b 100644 --- a/docs/01-需求文档/需求规格说明书_v1.0.md +++ b/docs/01-需求文档/需求规格说明书_v1.0.md @@ -829,6 +829,8 @@ | 1 | 下载模板,模板包含姓名-必填,学号-必填,会员手机号-必填,区域-必填,学校-必填,年级-必填,班级-必填,性别-选填,出生日期-选填 | | 2 | 导入数据时,检查必填信息,并检查区域/学校/年级/班级对应的信息一致 | | 3 | 导入时,同时需要检查用户手机号,如果系统中存在用户手机号,那么导入的学生就挂在当前用户下;如果系统中不存在对应的用户,自动创建当前手机号的用户,身份为家长,初始密码123456,并把学生信息挂在当前用户下 | +| 4 | **教师身份校验**:如果会员手机号对应的会员身份为"教师",需校验教师与学生的归属关系一致(区域、学校、年级、班级),不一致则导入失败并提示原因 | +| 5 | 教师未设置学校信息时,无法绑定学生,提示"教师未设置学校信息" | **表格列定义:** | 字段 | 说明 |