diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/stu/ScoreController.java b/src/main/java/com/sztzjy/linkCommerce/controller/stu/ScoreController.java index d7f540a..f3e3bfd 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/ScoreController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/ScoreController.java @@ -11,6 +11,8 @@ import com.sztzjy.linkCommerce.entity.scoreDTO.TeaClassScoreDto; import com.sztzjy.linkCommerce.entity.vo.TeaTrendVo; import com.sztzjy.linkCommerce.mapper.StuGradeMapper; import com.sztzjy.linkCommerce.mapper.StuRankMapper; +import com.sztzjy.linkCommerce.mapper.SchoolClassMapper; +import com.sztzjy.linkCommerce.mapper.UserinfoMapper; import com.sztzjy.linkCommerce.mapper.WeightMapper; import com.sztzjy.linkCommerce.mapper.TeachingClassStudentMapper; import com.sztzjy.linkCommerce.service.ScoreRankService; @@ -21,6 +23,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -53,6 +56,10 @@ public class ScoreController { TeacherScoreService teacherScoreService; @Autowired TeachingClassStudentMapper teachingClassStudentMapper; + @Autowired + SchoolClassMapper schoolClassMapper; + @Autowired + UserinfoMapper userinfoMapper; @PostMapping("/selectStuModuleScoreByUserId") @@ -279,7 +286,7 @@ public class ScoreController { @ApiOperation("老师端 -班级平均成绩走势") public List getClassAVGScore(HttpServletRequest request) { JwtUser teacher = TokenProvider.getJWTUser(request); - List ownedClasses = teacherScoreService.listOwnedClasses(teacher); + List ownedClasses = listHomeClasses(teacher); List returnList = new ArrayList<>(); for (SchoolClass ownedClass : ownedClasses) { //获取第一个班级的平均分和日期 @@ -305,6 +312,14 @@ public class ScoreController { return returnList; } + @AnonymousAccess + @GetMapping("/getTeaHomeClasses") + @ApiOperation("老师端首页 -可查看班级列表") + public ResultEntity> getTeaHomeClasses(HttpServletRequest request) { + JwtUser teacher = TokenProvider.getJWTUser(request); + return new ResultEntity<>(HttpStatus.OK, "查询成功", listHomeClasses(teacher)); + } + //老师端 -班级成绩统计分析 @AnonymousAccess @GetMapping("/getTeaScoreAnalysis") @@ -319,15 +334,15 @@ public class ScoreController { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate; //班级框为空 统计学校下的所有数据返回 - if (classId == null) { - formattedDate = sdf.format(new Date()); + if (StringUtils.isBlank(classId)) { + formattedDate = sdf.format(time == null ? new Date() : time); criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate); } else { formattedDate = sdf.format(time == null ? new Date() : time); - teacherScoreService.requireOwnedClass(teacher, classId); + requireHomeClass(teacher, classId); criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate); } - applyOwnedStudentCriteria(criteria, teacher, classId); + applyHomeStudentCriteria(criteria, teacher, classId); List scoreRankList = stuRankMapper.selectByExample(scoreExample); int excellentCount = 0; int goodCount = 0; @@ -377,10 +392,10 @@ public class ScoreController { return teaClassScoreDto; } - private void applyOwnedStudentCriteria(StuRankExample.Criteria criteria, JwtUser teacher, String classId) { - List classes = classId == null - ? teacherScoreService.listOwnedClasses(teacher) - : Collections.singletonList(teacherScoreService.requireOwnedClass(teacher, classId)); + private void applyHomeStudentCriteria(StuRankExample.Criteria criteria, JwtUser teacher, String classId) { + List classes = StringUtils.isBlank(classId) + ? listHomeClasses(teacher) + : Collections.singletonList(requireHomeClass(teacher, classId)); List studentIds = classes.stream() .flatMap(item -> teachingClassStudentMapper.selectByTeachingClassId(item.getSchoolClassId()).stream()) .map(TeachingClassStudent::getStudentUserId) @@ -390,4 +405,38 @@ public class ScoreController { criteria.andUserIdIn(studentIds.isEmpty() ? Collections.singletonList("__empty__") : studentIds); } + List listHomeClasses(JwtUser teacher) { + if (!isTeacherAdmin(teacher)) { + return teacherScoreService.listOwnedClasses(teacher); + } + SchoolClassExample example = new SchoolClassExample(); + example.createCriteria().andSchoolIdEqualTo(teacher.getSchoolId()).andClassTypeEqualTo("TEACHING"); + List classes = schoolClassMapper.selectByExample(example); + return classes == null ? Collections.emptyList() : classes; + } + + SchoolClass requireHomeClass(JwtUser teacher, String teachingClassId) { + if (!isTeacherAdmin(teacher)) { + return teacherScoreService.requireOwnedClass(teacher, teachingClassId); + } + SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(teachingClassId); + if (schoolClass == null || !"TEACHING".equals(schoolClass.getClassType()) + || !StringUtils.equals(teacher.getSchoolId(), schoolClass.getSchoolId())) { + throw new com.sztzjy.linkCommerce.config.exception.handler.ServiceException( + HttpStatus.FORBIDDEN, "无权访问该教学班成绩"); + } + return schoolClass; + } + + private boolean isTeacherAdmin(JwtUser teacher) { + if (teacher == null || teacher.getRoleId() != 3 || StringUtils.isBlank(teacher.getUserId())) { + return false; + } + Userinfo user = userinfoMapper.selectByPrimaryKey(teacher.getUserId()); + return user != null + && Integer.valueOf(3).equals(user.getRole()) + && Boolean.TRUE.equals(user.getTeacherAdmin()) + && StringUtils.equals(teacher.getSchoolId(), user.getSchoolId()); + } + } diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/stu/ScoreControllerTeacherAdminHomeTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/ScoreControllerTeacherAdminHomeTest.java new file mode 100644 index 0000000..2af9a19 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/ScoreControllerTeacherAdminHomeTest.java @@ -0,0 +1,105 @@ +package com.sztzjy.linkCommerce.controller.stu; + +import com.sztzjy.linkCommerce.config.exception.handler.ServiceException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.SchoolClass; +import com.sztzjy.linkCommerce.entity.SchoolClassExample; +import com.sztzjy.linkCommerce.entity.Userinfo; +import com.sztzjy.linkCommerce.mapper.SchoolClassMapper; +import com.sztzjy.linkCommerce.mapper.UserinfoMapper; +import com.sztzjy.linkCommerce.service.TeacherScoreService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class ScoreControllerTeacherAdminHomeTest { + private ScoreController controller; + private SchoolClassMapper schoolClassMapper; + private UserinfoMapper userinfoMapper; + private TeacherScoreService teacherScoreService; + + @BeforeEach + void setUp() { + controller = new ScoreController(); + schoolClassMapper = mock(SchoolClassMapper.class); + userinfoMapper = mock(UserinfoMapper.class); + teacherScoreService = mock(TeacherScoreService.class); + controller.schoolClassMapper = schoolClassMapper; + controller.userinfoMapper = userinfoMapper; + controller.teacherScoreService = teacherScoreService; + } + + @Test + void teacherAdminHomeListsEveryTeachingClassInSchool() { + JwtUser teacher = teacher("admin-1", "school-1"); + when(userinfoMapper.selectByPrimaryKey("admin-1")).thenReturn(user("admin-1", "school-1", true)); + when(schoolClassMapper.selectByExample(any(SchoolClassExample.class))) + .thenReturn(Arrays.asList(teachingClass("class-1", "school-1"), teachingClass("class-2", "school-1"))); + + List classes = controller.listHomeClasses(teacher); + + assertEquals(Arrays.asList("class-1", "class-2"), Arrays.asList( + classes.get(0).getSchoolClassId(), classes.get(1).getSchoolClassId())); + verify(teacherScoreService, never()).listOwnedClasses(any()); + } + + @Test + void ordinaryTeacherHomeKeepsOwnedClassScope() { + JwtUser teacher = teacher("teacher-1", "school-1"); + when(userinfoMapper.selectByPrimaryKey("teacher-1")).thenReturn(user("teacher-1", "school-1", false)); + when(teacherScoreService.listOwnedClasses(teacher)) + .thenReturn(Collections.singletonList(teachingClass("class-1", "school-1"))); + + List classes = controller.listHomeClasses(teacher); + + assertEquals(1, classes.size()); + assertEquals("class-1", classes.get(0).getSchoolClassId()); + verify(schoolClassMapper, never()).selectByExample(any()); + } + + @Test + void teacherAdminCannotOpenAnotherSchoolsClassFromHome() { + JwtUser teacher = teacher("admin-1", "school-1"); + when(userinfoMapper.selectByPrimaryKey("admin-1")).thenReturn(user("admin-1", "school-1", true)); + when(schoolClassMapper.selectByPrimaryKey("foreign-class")) + .thenReturn(teachingClass("foreign-class", "school-2")); + + assertThrows(ServiceException.class, () -> controller.requireHomeClass(teacher, "foreign-class")); + } + + private JwtUser teacher(String userId, String schoolId) { + JwtUser teacher = new JwtUser(); + teacher.setUserId(userId); + teacher.setSchoolId(schoolId); + teacher.setRoleId(3); + return teacher; + } + + private Userinfo user(String userId, String schoolId, boolean teacherAdmin) { + Userinfo user = new Userinfo(); + user.setUserId(userId); + user.setSchoolId(schoolId); + user.setRole(3); + user.setTeacherAdmin(teacherAdmin); + return user; + } + + private SchoolClass teachingClass(String classId, String schoolId) { + SchoolClass schoolClass = new SchoolClass(); + schoolClass.setSchoolClassId(classId); + schoolClass.setSchoolId(schoolId); + schoolClass.setClassType("TEACHING"); + return schoolClass; + } +}