feat: 学生导入增加教师身份校验

当会员手机号对应的会员身份为"教师"时,校验规则:
1. 教师必须已设置学校信息,否则提示"未设置学校信息,无法绑定学生"
2. 教师所属区域必须与学生所属区域一致
3. 教师所属学校必须与学生所属学校一致
4. 教师所属年级必须与学生所属年级一致
5. 教师所属班级必须与学生所属班级一致
不一致则导入失败并返回具体原因

同步更新需求文档
This commit is contained in:
神码-方晓辉 2026-02-02 20:53:44 +08:00
parent 18b9a09348
commit 904c7c9500
2 changed files with 57 additions and 6 deletions

View File

@ -356,9 +356,19 @@ public class PgStudentServiceImpl implements IPgStudentService {
} }
// 5. 查找或创建会员 // 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())) { if (StrUtil.isNotBlank(dto.getStudentNo())) {
PgStudent existStudent = baseMapper.selectOne( PgStudent existStudent = baseMapper.selectOne(
new LambdaQueryWrapper<PgStudent>() new LambdaQueryWrapper<PgStudent>()
@ -370,7 +380,7 @@ public class PgStudentServiceImpl implements IPgStudentService {
} }
} }
// 7. 创建学生 // 8. 创建学生
PgStudent student = new PgStudent(); PgStudent student = new PgStudent();
student.setStudentName(dto.getStudentName().trim()); student.setStudentName(dto.getStudentName().trim());
student.setStudentNo(StrUtil.isNotBlank(dto.getStudentNo()) ? dto.getStudentNo().trim() : null); 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( PgMember member = memberMapper.selectOne(
new LambdaQueryWrapper<PgMember>() new LambdaQueryWrapper<PgMember>()
.eq(PgMember::getPhone, phone) .eq(PgMember::getPhone, phone)
); );
if (member != null) { if (member != null) {
return member.getMemberId(); return member;
} }
// 不存在则创建新会员身份为家长初始密码123456 // 不存在则创建新会员身份为家长初始密码123456
@ -462,7 +472,46 @@ public class PgStudentServiceImpl implements IPgStudentService {
newMember.setRegisterTime(new Date()); // 注册时间 newMember.setRegisterTime(new Date()); // 注册时间
memberMapper.insert(newMember); 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; // 校验通过
} }
/** /**

View File

@ -829,6 +829,8 @@
| 1 | 下载模板,模板包含姓名-必填,学号-必填,会员手机号-必填,区域-必填,学校-必填,年级-必填,班级-必填,性别-选填,出生日期-选填 | | 1 | 下载模板,模板包含姓名-必填,学号-必填,会员手机号-必填,区域-必填,学校-必填,年级-必填,班级-必填,性别-选填,出生日期-选填 |
| 2 | 导入数据时,检查必填信息,并检查区域/学校/年级/班级对应的信息一致 | | 2 | 导入数据时,检查必填信息,并检查区域/学校/年级/班级对应的信息一致 |
| 3 | 导入时同时需要检查用户手机号如果系统中存在用户手机号那么导入的学生就挂在当前用户下如果系统中不存在对应的用户自动创建当前手机号的用户身份为家长初始密码123456并把学生信息挂在当前用户下 | | 3 | 导入时同时需要检查用户手机号如果系统中存在用户手机号那么导入的学生就挂在当前用户下如果系统中不存在对应的用户自动创建当前手机号的用户身份为家长初始密码123456并把学生信息挂在当前用户下 |
| 4 | **教师身份校验**:如果会员手机号对应的会员身份为"教师",需校验教师与学生的归属关系一致(区域、学校、年级、班级),不一致则导入失败并提示原因 |
| 5 | 教师未设置学校信息时,无法绑定学生,提示"教师未设置学校信息" |
**表格列定义:** **表格列定义:**
| 字段 | 说明 | | 字段 | 说明 |