diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java b/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java index 4b0c038..5986571 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java @@ -694,10 +694,12 @@ public class UserController { @AnonymousAccess public ResultEntity updateTeacher(@RequestParam String userId, @RequestParam(required = false) String operatorId) { Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId); - if (userInfo == null) { + if (userInfo == null || !Integer.valueOf(3).equals(userInfo.getRole())) { return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师账号不存在"); } - if (!canManageSchoolStructure(operatorId, userInfo.getSchoolId())) { + Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId); + if (!isPlatformAdmin(operator) + && !(isTeacherAdmin(operator) && StringUtils.equals(operator.getSchoolId(), userInfo.getSchoolId()))) { return noManagePermission(); } userInfo.setPassword("123qwe"); @@ -2413,11 +2415,39 @@ public class UserController { } SchoolClassExample example = new SchoolClassExample(); example.createCriteria().andCreatedByIn(teacherIds); - Set classOwnerIds = schoolClassMapper.selectByExample(example).stream() - .map(SchoolClass::getCreatedBy) - .filter(StringUtils::isNotBlank) - .collect(java.util.stream.Collectors.toSet()); - teachers.forEach(teacher -> teacher.setHasCreatedClass(classOwnerIds.contains(teacher.getUserId()))); + List ownedClasses = schoolClassMapper.selectByExample(example); + Map> classesByTeacher = (ownedClasses == null ? Collections.emptyList() : ownedClasses) + .stream() + .filter(schoolClass -> StringUtils.isNotBlank(schoolClass.getCreatedBy())) + .collect(java.util.stream.Collectors.groupingBy( + SchoolClass::getCreatedBy, + LinkedHashMap::new, + java.util.stream.Collectors.toList())); + teachers.forEach(teacher -> { + List teacherClasses = classesByTeacher.getOrDefault( + teacher.getUserId(), Collections.emptyList()); + List classNames = teacherClasses.stream() + .map(SchoolClass::getClassName) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(java.util.stream.Collectors.toList()); + Set studentIds = new LinkedHashSet<>(); + if (teachingClassStudentMapper != null) { + for (SchoolClass schoolClass : teacherClasses) { + List members = teachingClassStudentMapper + .selectByTeachingClassId(schoolClass.getSchoolClassId()); + for (TeachingClassStudent member : members == null + ? Collections.emptyList() : members) { + if (member != null && StringUtils.isNotBlank(member.getStudentUserId())) { + studentIds.add(member.getStudentUserId()); + } + } + } + } + teacher.setHasCreatedClass(!teacherClasses.isEmpty()); + teacher.setOwnedClassNames(classNames); + teacher.setOwnedStudentCount(studentIds.size()); + }); } private boolean canOperateClass(String operatorId, String schoolClassId) { diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/Userinfo.java b/src/main/java/com/sztzjy/linkCommerce/entity/Userinfo.java index 28c1342..49cc6ab 100644 --- a/src/main/java/com/sztzjy/linkCommerce/entity/Userinfo.java +++ b/src/main/java/com/sztzjy/linkCommerce/entity/Userinfo.java @@ -1,6 +1,8 @@ package com.sztzjy.linkCommerce.entity; import java.util.Date; +import java.util.Collections; +import java.util.List; import io.swagger.annotations.ApiModelProperty; /** @@ -83,6 +85,12 @@ public class Userinfo { @ApiModelProperty("是否已创建班级,教师管理列表展示用") private Boolean hasCreatedClass = false; + @ApiModelProperty("名下班级名称,教师管理列表展示用") + private List ownedClassNames = Collections.emptyList(); + + @ApiModelProperty("名下班级当前学生数量,教师管理列表展示用") + private Integer ownedStudentCount = 0; + public String getClassName() { return className; } @@ -107,6 +115,22 @@ public class Userinfo { this.hasCreatedClass = hasCreatedClass; } + public List getOwnedClassNames() { + return ownedClassNames; + } + + public void setOwnedClassNames(List ownedClassNames) { + this.ownedClassNames = ownedClassNames == null ? Collections.emptyList() : ownedClassNames; + } + + public Integer getOwnedStudentCount() { + return ownedStudentCount; + } + + public void setOwnedStudentCount(Integer ownedStudentCount) { + this.ownedStudentCount = ownedStudentCount == null ? 0 : ownedStudentCount; + } + public String getUserId() { return userId; } diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java index dd85e93..d6c7044 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java @@ -156,9 +156,15 @@ class UserControllerTeacherAdminTest { void teacherManagementListsCurrentSchoolTeachersAndMarksClassOwners() { UserController controller = controllerWithCommonMocks(); Userinfo owner = teacher("teacher-owner"); + SchoolClass ownedClass = classCreatedBy("teacher-owner"); + ownedClass.setSchoolClassId("class-owned"); + ownedClass.setClassName("产品一班"); + TeachingClassStudent member = activeMember("class-owned", "student-1"); when(controller.userinfoMapper.selectByPrimaryKey("teacher-admin")).thenReturn(teacher("teacher-admin", true)); when(controller.userinfoMapper.selectByExample(any(UserinfoExample.class))).thenReturn(Collections.singletonList(owner)); - when(controller.schoolClassMapper.selectByExample(any(SchoolClassExample.class))).thenReturn(Collections.singletonList(classCreatedBy("teacher-owner"))); + when(controller.schoolClassMapper.selectByExample(any(SchoolClassExample.class))).thenReturn(Collections.singletonList(ownedClass)); + when(controller.teachingClassStudentMapper.selectByTeachingClassId("class-owned")) + .thenReturn(Collections.singletonList(member)); ResultEntity> result = controller.selectTeacher(null, null, null, 1, 10, "teacher-admin"); @@ -167,6 +173,49 @@ class UserControllerTeacherAdminTest { assertEquals(HttpStatus.OK, result.getStatusCode()); assertTrue(hasUserCondition(exampleCaptor.getValue(), "school_id =", "school-1")); assertTrue(result.getBody().getData().getList().get(0).getHasCreatedClass()); + assertEquals(Collections.singletonList("产品一班"), + result.getBody().getData().getList().get(0).getOwnedClassNames()); + assertEquals(1, result.getBody().getData().getList().get(0).getOwnedStudentCount()); + } + + @Test + void teacherAdminCanResetTeacherPasswordInSameSchool() { + UserController controller = controllerWithCommonMocks(); + Userinfo target = teacher("teacher-2"); + target.setPassword("changed-password"); + when(controller.userinfoMapper.selectByPrimaryKey("teacher-2")).thenReturn(target); + when(controller.userinfoMapper.updateByPrimaryKey(target)).thenReturn(1); + + ResultEntity result = controller.updateTeacher("teacher-2", "teacher-admin"); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals("123qwe", target.getPassword()); + verify(controller.userinfoMapper).updateByPrimaryKey(target); + } + + @Test + void ordinaryTeacherCannotResetAnotherTeacherPassword() { + UserController controller = controllerWithCommonMocks(); + Userinfo target = teacher("teacher-2"); + when(controller.userinfoMapper.selectByPrimaryKey("teacher-2")).thenReturn(target); + + ResultEntity result = controller.updateTeacher("teacher-2", "teacher-1"); + + assertEquals(HttpStatus.BAD_REQUEST, result.getStatusCode()); + verify(controller.userinfoMapper, never()).updateByPrimaryKey(target); + } + + @Test + void teacherAdminCannotResetTeacherPasswordFromAnotherSchool() { + UserController controller = controllerWithCommonMocks(); + Userinfo target = teacher("teacher-2"); + target.setSchoolId("school-2"); + when(controller.userinfoMapper.selectByPrimaryKey("teacher-2")).thenReturn(target); + + ResultEntity result = controller.updateTeacher("teacher-2", "teacher-admin"); + + assertEquals(HttpStatus.BAD_REQUEST, result.getStatusCode()); + verify(controller.userinfoMapper, never()).updateByPrimaryKey(target); } @Test