merge: teacher admin home all-class charts

bugfix/ai-assessment-evidence-rescore
chenyuan 1 month ago
commit 9b389607a0

@ -11,6 +11,8 @@ import com.sztzjy.linkCommerce.entity.scoreDTO.TeaClassScoreDto;
import com.sztzjy.linkCommerce.entity.vo.TeaTrendVo; import com.sztzjy.linkCommerce.entity.vo.TeaTrendVo;
import com.sztzjy.linkCommerce.mapper.StuGradeMapper; import com.sztzjy.linkCommerce.mapper.StuGradeMapper;
import com.sztzjy.linkCommerce.mapper.StuRankMapper; 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.WeightMapper;
import com.sztzjy.linkCommerce.mapper.TeachingClassStudentMapper; import com.sztzjy.linkCommerce.mapper.TeachingClassStudentMapper;
import com.sztzjy.linkCommerce.service.ScoreRankService; import com.sztzjy.linkCommerce.service.ScoreRankService;
@ -21,6 +23,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -53,6 +56,10 @@ public class ScoreController {
TeacherScoreService teacherScoreService; TeacherScoreService teacherScoreService;
@Autowired @Autowired
TeachingClassStudentMapper teachingClassStudentMapper; TeachingClassStudentMapper teachingClassStudentMapper;
@Autowired
SchoolClassMapper schoolClassMapper;
@Autowired
UserinfoMapper userinfoMapper;
@PostMapping("/selectStuModuleScoreByUserId") @PostMapping("/selectStuModuleScoreByUserId")
@ -279,7 +286,7 @@ public class ScoreController {
@ApiOperation("老师端 -班级平均成绩走势") @ApiOperation("老师端 -班级平均成绩走势")
public List<ClassAVGScoreVo> getClassAVGScore(HttpServletRequest request) { public List<ClassAVGScoreVo> getClassAVGScore(HttpServletRequest request) {
JwtUser teacher = TokenProvider.getJWTUser(request); JwtUser teacher = TokenProvider.getJWTUser(request);
List<SchoolClass> ownedClasses = teacherScoreService.listOwnedClasses(teacher); List<SchoolClass> ownedClasses = listHomeClasses(teacher);
List<ClassAVGScoreVo> returnList = new ArrayList<>(); List<ClassAVGScoreVo> returnList = new ArrayList<>();
for (SchoolClass ownedClass : ownedClasses) { for (SchoolClass ownedClass : ownedClasses) {
//获取第一个班级的平均分和日期 //获取第一个班级的平均分和日期
@ -305,6 +312,14 @@ public class ScoreController {
return returnList; return returnList;
} }
@AnonymousAccess
@GetMapping("/getTeaHomeClasses")
@ApiOperation("老师端首页 -可查看班级列表")
public ResultEntity<List<SchoolClass>> getTeaHomeClasses(HttpServletRequest request) {
JwtUser teacher = TokenProvider.getJWTUser(request);
return new ResultEntity<>(HttpStatus.OK, "查询成功", listHomeClasses(teacher));
}
//老师端 -班级成绩统计分析 //老师端 -班级成绩统计分析
@AnonymousAccess @AnonymousAccess
@GetMapping("/getTeaScoreAnalysis") @GetMapping("/getTeaScoreAnalysis")
@ -319,15 +334,15 @@ public class ScoreController {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate; String formattedDate;
//班级框为空 统计学校下的所有数据返回 //班级框为空 统计学校下的所有数据返回
if (classId == null) { if (StringUtils.isBlank(classId)) {
formattedDate = sdf.format(new Date()); formattedDate = sdf.format(time == null ? new Date() : time);
criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate); criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate);
} else { } else {
formattedDate = sdf.format(time == null ? new Date() : time); formattedDate = sdf.format(time == null ? new Date() : time);
teacherScoreService.requireOwnedClass(teacher, classId); requireHomeClass(teacher, classId);
criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate); criteria.andSchoolIdEqualTo(teacher.getSchoolId()).andUpdateTimeEqualTo(formattedDate);
} }
applyOwnedStudentCriteria(criteria, teacher, classId); applyHomeStudentCriteria(criteria, teacher, classId);
List<StuRank> scoreRankList = stuRankMapper.selectByExample(scoreExample); List<StuRank> scoreRankList = stuRankMapper.selectByExample(scoreExample);
int excellentCount = 0; int excellentCount = 0;
int goodCount = 0; int goodCount = 0;
@ -377,10 +392,10 @@ public class ScoreController {
return teaClassScoreDto; return teaClassScoreDto;
} }
private void applyOwnedStudentCriteria(StuRankExample.Criteria criteria, JwtUser teacher, String classId) { private void applyHomeStudentCriteria(StuRankExample.Criteria criteria, JwtUser teacher, String classId) {
List<SchoolClass> classes = classId == null List<SchoolClass> classes = StringUtils.isBlank(classId)
? teacherScoreService.listOwnedClasses(teacher) ? listHomeClasses(teacher)
: Collections.singletonList(teacherScoreService.requireOwnedClass(teacher, classId)); : Collections.singletonList(requireHomeClass(teacher, classId));
List<String> studentIds = classes.stream() List<String> studentIds = classes.stream()
.flatMap(item -> teachingClassStudentMapper.selectByTeachingClassId(item.getSchoolClassId()).stream()) .flatMap(item -> teachingClassStudentMapper.selectByTeachingClassId(item.getSchoolClassId()).stream())
.map(TeachingClassStudent::getStudentUserId) .map(TeachingClassStudent::getStudentUserId)
@ -390,4 +405,38 @@ public class ScoreController {
criteria.andUserIdIn(studentIds.isEmpty() ? Collections.singletonList("__empty__") : studentIds); criteria.andUserIdIn(studentIds.isEmpty() ? Collections.singletonList("__empty__") : studentIds);
} }
List<SchoolClass> listHomeClasses(JwtUser teacher) {
if (!isTeacherAdmin(teacher)) {
return teacherScoreService.listOwnedClasses(teacher);
}
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andSchoolIdEqualTo(teacher.getSchoolId()).andClassTypeEqualTo("TEACHING");
List<SchoolClass> 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());
}
} }

@ -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<SchoolClass> 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<SchoolClass> 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;
}
}
Loading…
Cancel
Save