You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2492 lines
126 KiB
Java

1 year ago
package com.sztzjy.linkCommerce.controller.stu;
import com.alibaba.excel.EasyExcel;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
1 year ago
import com.sztzjy.linkCommerce.annotation.AnonymousAccess;
import com.sztzjy.linkCommerce.config.security.JwtUser;
import com.sztzjy.linkCommerce.config.security.TokenProvider;
import com.sztzjy.linkCommerce.entity.*;
import com.sztzjy.linkCommerce.entity.dto.SchoolClassDto;
import com.sztzjy.linkCommerce.entity.dto.SchoolFacultyDto;
import com.sztzjy.linkCommerce.entity.dto.SchoolMajorDto;
import com.sztzjy.linkCommerce.entity.importDto.SchoolAdminStudentImportDTO;
import com.sztzjy.linkCommerce.entity.importDto.StudentImportDTO;
import com.sztzjy.linkCommerce.entity.importDto.TeachingClassStudentImportDTO;
import com.sztzjy.linkCommerce.entity.importDto.TeacherRosterStudentImportDTO;
import com.sztzjy.linkCommerce.entity.importDto.TeacherImportDTO;
import com.sztzjy.linkCommerce.mapper.*;
import com.sztzjy.linkCommerce.service.ImportService;
import com.sztzjy.linkCommerce.service.SchoolService;
import com.sztzjy.linkCommerce.service.StudentTeachingClassResolver;
import com.sztzjy.linkCommerce.service.SchoolProductConfigService;
import com.sztzjy.linkCommerce.service.UserInfoService;
import com.sztzjy.linkCommerce.service.ValidateService;
1 year ago
import com.sztzjy.linkCommerce.util.*;
import com.sztzjy.linkCommerce.util.excel.FilePortUtil;
1 year ago
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
1 year ago
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;
1 year ago
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
1 year ago
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
1 year ago
import java.util.*;
@Api(tags = "用户管理")
@RequestMapping("api/user")
@RestController
public class UserController {
@Autowired
SchoolService schoolService;
@Autowired
SchoolProductConfigService schoolProductConfigService;
@Autowired
SchoolMapper schoolMapper;
@Autowired
UserinfoMapper userinfoMapper;
@Autowired
SchoolMajorMapper schoolMajorMapper;
@Autowired
SchoolClassMapper schoolClassMapper;
@Autowired
TeachingClassStudentMapper teachingClassStudentMapper;
@Autowired
CptfController cptfController;
@Autowired
Pinyin4jUtil pinyin4jUtil;
@Autowired
UserInfoService userInfoService;
@Autowired
ValidateService validateService;
@Autowired
ImportService importService;
@Autowired(required = false)
StudentTeachingClassResolver studentTeachingClassResolver;
1 year ago
@PostMapping("/addSchool")
@ApiOperation("院校管理-院校新增")
@AnonymousAccess
public ResultEntity addSchool(@RequestBody School school) {
//参数校验
if (org.apache.commons.lang3.StringUtils.isBlank(school.getSchoolName())) {
return new ResultEntity<>(HttpStatus.ACCEPTED, "院校名称不能为空");
}
if (org.apache.commons.lang3.StringUtils.isBlank(school.getSchoolGrade())) {
return new ResultEntity<>(HttpStatus.ACCEPTED, "院校层次不能为空");
}
if (org.apache.commons.lang3.StringUtils.isBlank(school.getSchoolProvince())) {
return new ResultEntity<>(HttpStatus.ACCEPTED, "所属省不能为空");
}
if (org.apache.commons.lang3.StringUtils.isBlank(school.getSchoolCity())) {
return new ResultEntity<>(HttpStatus.ACCEPTED, "所属城市不能为空");
}
if (org.apache.commons.lang3.StringUtils.isBlank(school.getSchoolContacts())) {
return new ResultEntity<>(HttpStatus.ACCEPTED, "院校联系人不能为空");
}
Integer result = schoolService.addSchool(school);
if (result > 0) {
return new ResultEntity<>(HttpStatus.OK, "新增成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增失败");
}
}
1 year ago
@PostMapping("/updateSchool")
@ApiOperation("院校管理-院校编辑")
@AnonymousAccess
public ResultEntity updateSchool(@RequestBody School school) {
1 year ago
Integer result = schoolService.updateSchool(school);
if (result > 0) {
return new ResultEntity<>(HttpStatus.OK, "编辑成功");
} else {
return new ResultEntity<>(HttpStatus.ACCEPTED, "编辑失败");
}
}
1 year ago
@GetMapping("/deleteSchool")
@ApiOperation("院校管理-院校删除")
public ResultEntity deleteSchool(String schoolId) {
1 year ago
Integer result = schoolService.deleteSchool(schoolId);
if (result > 0) {
return new ResultEntity<>(HttpStatus.OK, "删除成功");
} else {
return new ResultEntity<>(HttpStatus.ACCEPTED, "删除失败");
}
}
@GetMapping("/getSchoolList")
@ApiOperation("院校管理-院校列表查询")
@AnonymousAccess
public ResultEntity<PageInfo<School>> getSchoolList(@ApiParam("当前页") Integer index,
@ApiParam("每页条数") Integer size,
@ApiParam("院校名称") @RequestParam(required = false) String schoolName) {
PageHelper.startPage(index, size);
SchoolExample schoolExample = new SchoolExample();
SchoolExample.Criteria criteria = schoolExample.createCriteria();
if (StringUtils.isNotEmpty(schoolName)) {
criteria.andSchoolNameLike("%" + schoolName + "%");
}
List<School> schools = schoolMapper.selectByExample(schoolExample);
PageInfo<School> schoolPageInfo = new PageInfo<>(schools);
return new ResultEntity<>(HttpStatus.OK, "院校列表查询-查询成功", schoolPageInfo);
}
//*****************************************院系管理*********************************************
//*****************************************院系管理*********************************************
//*****************************************院系管理*********************************************
1 year ago
@Autowired
SchoolFacultyMapper schoolFacultyMapper;
1 year ago
@PostMapping("/addSchoolFaculty")
@ApiOperation("院系管理-添加院系")
@AnonymousAccess
public ResultEntity addSchoolFaculty(@ApiParam("学校ID") @RequestParam String schoolId,
@ApiParam("院系名称") @RequestParam String schoolFacultyName,
@ApiParam("联系人") @RequestParam(required = false) String schoolFacultyContact,
@ApiParam("联系人电话") @RequestParam(required = false) String schoolFacultyContactTel,
@ApiParam("联系人地址") @RequestParam(required = false) String schoolFacultyContactAddress,
@RequestParam(required = false) String userId) {
//先根据schoolId进行查询 如果不存在则返回
School school = schoolMapper.selectByPrimaryKey(schoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
if (!canManageFaculty(userId, schoolId)) {
return noManagePermission();
}
//查询该学校下院系下 专业名称是否重复
SchoolFacultyExample schoolFacultyExample = new SchoolFacultyExample();
schoolFacultyExample.createCriteria().andSchoolIdEqualTo(schoolId).andSchoolFacultyNameEqualTo(schoolFacultyName);
List<SchoolFaculty> schoolFaculties = schoolFacultyMapper.selectByExample(schoolFacultyExample);
if (!schoolFaculties.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系名称重复");
}
SchoolFaculty schoolFaculty = new SchoolFaculty();
schoolFaculty.setSchoolFacultyId(String.valueOf(UUID.randomUUID()));
schoolFaculty.setSchoolId(schoolId);
schoolFaculty.setSchoolFacultyName(schoolFacultyName);
schoolFaculty.setSchoolFacultyContact(schoolFacultyContact);
schoolFaculty.setSchoolFacultyContactTel(schoolFacultyContactTel);
schoolFaculty.setSchoolFacultyContactAddress(schoolFacultyContactAddress);
schoolFaculty.setCreateTime(new Date());
int insert = schoolFacultyMapper.insert(schoolFaculty);
if (insert == 1) {
return new ResultEntity<>(HttpStatus.OK, "新增院系成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增院系失败");
}
}
@PostMapping("/seleteSchoolFaculty")
@ApiOperation("院系管理-查询")
@AnonymousAccess
public ResultEntity<PageInfo<SchoolFacultyDto>> seleteSchoolFaculty(@ApiParam("当前页") @RequestParam Integer index,
@ApiParam("每页条数") @RequestParam Integer size,
@ApiParam("学校ID") @RequestParam(required = false) String schoolId,
@ApiParam("院系名称") @RequestParam(required = false) String schoolFacultyName) {
PageInfo<SchoolFacultyDto> pageInfo = schoolService.seleteSchoolFaculty(index, size, schoolId, schoolFacultyName);
return new ResultEntity<>(HttpStatus.OK, "院系管理-查询成功", pageInfo);
}
1 year ago
@PostMapping("/seleteSchoolFacultyList")
@ApiOperation("院系管理-院系列表查询")
@AnonymousAccess
public ResultEntity<List<SchoolFaculty>> seleteSchoolFacultyList(@ApiParam("学校ID") @RequestParam String schoolId) {
SchoolFacultyExample schoolFacultyExample = new SchoolFacultyExample();
schoolFacultyExample.createCriteria().andSchoolIdEqualTo(schoolId);
List<SchoolFaculty> schoolFacultyList = schoolFacultyMapper.selectByExample(schoolFacultyExample);
return new ResultEntity<>(HttpStatus.OK, "院系管理-院系列表查询查询", schoolFacultyList);
}
1 year ago
@PostMapping("/deleteSchoolFaculty")
@ApiOperation("院系管理-删除")
1 year ago
@AnonymousAccess
public ResultEntity deleteSchoolFaculty(@ApiParam("院系ID") @RequestParam String schoolFacultyId, @RequestParam String userId) {
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系不存在");
}
if (!canManageFaculty(userId, schoolFaculty.getSchoolId())) {
return noManagePermission();
}
if (hasMajorUnderFaculty(schoolFacultyId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系下存在专业,不能删除");
}
int i = schoolFacultyMapper.deleteByPrimaryKey(schoolFacultyId);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "院系管理-删除成功");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系管理-删除失败");
}
1 year ago
@PostMapping("/updateSchoolFaculty")
@ApiOperation("院系管理-编辑")
@AnonymousAccess
public ResultEntity updateSchoolFaculty(@RequestBody SchoolFaculty schoolFaculty, @RequestParam String userId) {
if (StringUtils.isBlank(schoolFaculty.getSchoolFacultyId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系管理-编辑失败-主键ID缺失");
}
SchoolFaculty existing = schoolFacultyMapper.selectByPrimaryKey(schoolFaculty.getSchoolFacultyId());
if (existing == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系不存在");
}
if (!canManageFaculty(userId, existing.getSchoolId())) {
return noManagePermission();
}
int i = schoolFacultyMapper.updateByPrimaryKey(schoolFaculty);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "院系管理-编辑成功");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系管理-编辑失败");
}
1 year ago
//*****************************************专业管理*********************************************
//*****************************************专业管理*********************************************
//*****************************************专业管理*********************************************
1 year ago
@PostMapping("/addSchoolMajor")
@ApiOperation("专业管理-添加专业")
@AnonymousAccess
public ResultEntity addSchoolMajor(@ApiParam("学校ID") @RequestParam String schoolId,
@ApiParam("院系ID") @RequestParam String schoolFacultyId,
@ApiParam("专业名称") @RequestParam String schoolMajorName,
@ApiParam("联系人") @RequestParam(required = false) String schoolMajorContact,
@ApiParam("联系人电话") @RequestParam(required = false) String schoolMajorContactTel,
@RequestParam(required = false) String userId) {
//先根据schoolId进行查询 如果不存在则返回
School school = schoolMapper.selectByPrimaryKey(schoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
if (!canManageMajorStructure(userId, schoolId)) {
return noManagePermission();
}
//再根据schoolFacultyId查询 如果不存在则返回
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该院系不存在");
}
//查询该学校下院系下 专业名称是否重复
SchoolMajorExample schoolMajorExample = new SchoolMajorExample();
schoolMajorExample.createCriteria().andSchoolFacultyIdEqualTo(schoolFacultyId).andSchoolMajorNameEqualTo(schoolMajorName);
List<SchoolMajor> schoolMajors = schoolMajorMapper.selectByExample(schoolMajorExample);
if (!schoolMajors.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业名称重复");
}
SchoolMajor schoolMajor = new SchoolMajor();
schoolMajor.setSchoolMajorId(String.valueOf(UUID.randomUUID()));
schoolMajor.setSchoolFacultyId(schoolFacultyId);
schoolMajor.setSchoolMajorName(schoolMajorName);
schoolMajor.setSchoolMajorContact(schoolMajorContact);
schoolMajor.setSchoolMajorContactTel(schoolMajorContactTel);
schoolMajor.setCreateTime(new Date());
int insert = schoolMajorMapper.insert(schoolMajor);
if (insert == 1) {
return new ResultEntity<>(HttpStatus.OK, "新增专业成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增专业失败");
}
}
1 year ago
@PostMapping("/selectSchoolMajor")
@ApiOperation("专业管理-查询")
@AnonymousAccess
public ResultEntity<PageInfo<SchoolMajorDto>> selectSchoolMajor(@ApiParam("当前页") @RequestParam Integer index,
@ApiParam("每页条数") @RequestParam Integer size,
@ApiParam("学校ID") @RequestParam(required = false) String schoolId,
@ApiParam("院系ID-学校管理员使用") @RequestParam(required = false) String schoolFacultyId,
@ApiParam("专业名称") @RequestParam(required = false) String schoolMajorName) {
PageInfo<SchoolMajorDto> pageInfo = schoolService.seleteSchoolMajor(index, size, schoolId, schoolMajorName, schoolFacultyId);
return new ResultEntity<>(HttpStatus.OK, "专业管理-查询成功", pageInfo);
}
1 year ago
@PostMapping("/selectSchoolMajorList")
@ApiOperation("专业管理-列表查询")
@AnonymousAccess
public ResultEntity<List<SchoolMajor>> selectSchoolMajorList(@ApiParam("院系ID") @RequestParam String schoolFacultyId) {
if (StringUtils.isBlank(schoolFacultyId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系ID为null");
}
SchoolMajorExample schoolMajorExample = new SchoolMajorExample();
SchoolMajorExample.Criteria criteria = schoolMajorExample.createCriteria();
criteria.andSchoolFacultyIdEqualTo(schoolFacultyId);
List<SchoolMajor> schoolMajorList = schoolMajorMapper.selectByExample(schoolMajorExample);
return new ResultEntity<>(HttpStatus.OK, "专业管理-查询成功", schoolMajorList);
}
@PostMapping("/deleteSchoolMajor")
@ApiOperation("专业管理-删除")
@AnonymousAccess
public ResultEntity deleteSchoolMajor(@ApiParam("专业ID") @RequestParam String schoolMajorId, @RequestParam String userId) {
if (!canManageMajor(userId, schoolMajorId)) {
return noManagePermission();
}
if (hasClassUnderMajor(schoolMajorId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业下存在班级,不能删除");
}
int i = schoolMajorMapper.deleteByPrimaryKey(schoolMajorId);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "专业管理-删除成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业管理-删除失败");
}
}
1 year ago
@PostMapping("/updateSchoolMajor")
@ApiOperation("专业管理-编辑")
@AnonymousAccess
public ResultEntity updateSchoolMajor(@RequestBody SchoolMajor schoolMajor, @RequestParam(required = false) String userId) {
if (StringUtils.isBlank(schoolMajor.getSchoolMajorId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业管理-编辑失败-主键ID缺失");
}
if (!canManageMajor(userId, schoolMajor.getSchoolMajorId())) {
return noManagePermission();
}
int i = schoolMajorMapper.updateByPrimaryKey(schoolMajor);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "专业管理-编辑成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业管理-编辑失败");
}
}
//*****************************************班级管理*********************************************
//*****************************************班级管理*********************************************
//*****************************************班级管理*********************************************
@PostMapping("/addSchoolClass")
@ApiOperation("班级管理-添加班级")
@AnonymousAccess
public ResultEntity addSchoolClass(@ApiParam("学校ID") @RequestParam String schoolId,
@ApiParam("院系ID") @RequestParam(required = false) String schoolFacultyId,
@ApiParam("专业ID") @RequestParam(required = false) String schoolMajorId,
@ApiParam("班级名称") @RequestParam String className,
@RequestParam(required = false) String userId,
@RequestParam(required = false) String classType,
@RequestParam(required = false) String sourceClassIds,
@RequestParam(required = false, defaultValue = "false") Boolean confirmMultiTeachingClass) {
//先根据schoolId进行查询 如果不存在则返回
School school = schoolMapper.selectByPrimaryKey(schoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
String requestedClassType = StringUtils.defaultIfBlank(classType, StringUtils.isBlank(userId) ? "ADMIN" : "TEACHING");
boolean majorManagementEnabled = isMajorManagementEnabled(schoolId);
if (!isAdminClassManagementEnabled(schoolId) && !"TEACHING".equals(requestedClassType)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "当前学校只支持教学班");
}
if (majorManagementEnabled) {
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该院系不存在");
}
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
if (schoolMajor == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该专业不存在");
}
}
//查询班级名称是否存在
if (!canCreateSchoolClass(userId, schoolId, requestedClassType)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "No permission to add this class type");
}
SchoolClassExample schoolClassExample = new SchoolClassExample();
schoolClassExample.createCriteria().andSchoolIdEqualTo(schoolId).andClassNameEqualTo(className);
List<SchoolClass> schoolClasses = schoolClassMapper.selectByExample(schoolClassExample);
if (!schoolClasses.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级名称重复");
}
SchoolClass schoolClass = new SchoolClass();
schoolClass.setSchoolClassId(String.valueOf(UUID.randomUUID()));
schoolClass.setSchoolMajorId(schoolMajorId);
schoolClass.setClassName(className);
//设置classSn 先获取学校名称
String schoolName = school.getSchoolName();
String schoolNamePY = pinyin4jUtil.convertToPinyin(schoolName);
String classNamePY = pinyin4jUtil.convertToPinyin(className);
schoolClass.setClassSn(schoolNamePY + "_" + classNamePY);
schoolClass.setCreateTime(new Date());
schoolClass.setSchoolId(schoolId);
schoolClass.setCreatedBy(userId);
schoolClass.setClassType(requestedClassType);
schoolClass.setDataSource("LOCAL");
schoolClass.setSourceClassIds(sourceClassIds);
if ("TEACHING".equals(schoolClass.getClassType()) && !Boolean.TRUE.equals(confirmMultiTeachingClass)) {
ResultEntity conflict = buildMultiTeachingClassConflict(
findStudentsByAdminClassIds(parseSourceClassIds(sourceClassIds)), "");
if (conflict != null) {
return conflict;
}
}
int insert = schoolClassMapper.insert(schoolClass);
if (insert == 1) {
createTeachingClassMembersFromSourceClasses(schoolClass);
return new ResultEntity<>(HttpStatus.OK, "新增班级成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增班级失败");
}
}
@PostMapping("/seleteSchoolClass")
@ApiOperation("班级管理-查询")
@AnonymousAccess
public ResultEntity<PageInfo<SchoolClassDto>> seleteSchoolClass(@ApiParam("当前页") @RequestParam Integer index,
@ApiParam("每页条数") @RequestParam Integer size,
@ApiParam("学校ID") @RequestParam(required = false) String schoolId,
@ApiParam("专业ID-学校管理员使用") @RequestParam(required = false) String schoolMajorId,
@ApiParam("班级名称") @RequestParam(required = false) String className,
@ApiParam("班级编号") @RequestParam(required = false) String classSn,
@RequestParam(required = false) String operatorId) {
Userinfo operator = StringUtils.isBlank(operatorId) ? null : userinfoMapper.selectByPrimaryKey(operatorId);
if (isSchoolTeacher(operator) && isTeacherRosterMode(operator.getSchoolId())) {
PageInfo<SchoolClassDto> pageInfo = schoolService.seleteSchoolClass(index, size, operator.getSchoolId(),
className, classSn, null, operatorId, "TEACHING");
return new ResultEntity<>(HttpStatus.OK, "班级管理-查询成功", pageInfo);
}
PageInfo<SchoolClassDto> pageInfo = schoolService.seleteSchoolClass(index, size, schoolId, className, classSn, schoolMajorId);
return new ResultEntity<>(HttpStatus.OK, "班级管理-查询成功", pageInfo);
}
@PostMapping("/seleteSchoolFacultyNameAndMajorName")
@ApiOperation("班级管理-查询院系名称和专业名称")
@AnonymousAccess
public ResultEntity<Map<String, String>> seleteSchoolFacultyNameAndMajorName(@RequestParam String schoolMajorId) {
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
String schoolFacultyId = schoolMajor.getSchoolFacultyId();
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
Map<String, String> map = new HashMap<>();
map.put(schoolFaculty.getSchoolFacultyName(), schoolMajor.getSchoolMajorName());
return new ResultEntity<>(HttpStatus.OK, "班级管理-院系名称和专业名称查询成功", map);
}
@PostMapping("/seleteSchoolClassList")
@ApiOperation("班级管理-列表查询")
@AnonymousAccess
public ResultEntity<List<SchoolClass>> seleteSchoolClassList(@RequestParam String schoolMajorId) {
SchoolClassExample schoolClassExample = new SchoolClassExample();
SchoolClassExample.Criteria criteria = schoolClassExample.createCriteria();
criteria.andSchoolMajorIdEqualTo(schoolMajorId);
List<SchoolClass> schoolClasses = schoolClassMapper.selectByExample(schoolClassExample);
return new ResultEntity<>(HttpStatus.OK, "班级管理-列表查询成功", schoolClasses);
}
@PostMapping("/seleteSchoolClassListBySchoolId")
@ApiOperation("班级管理-列表查询通过学校ID")
@AnonymousAccess
public ResultEntity<List<SchoolClass>> seleteSchoolClassListBySchoolId(@RequestParam String schoolId) {
SchoolClassExample schoolClassExample = new SchoolClassExample();
SchoolClassExample.Criteria criteria = schoolClassExample.createCriteria();
criteria.andSchoolIdEqualTo(schoolId);
List<SchoolClass> schoolClasses = schoolClassMapper.selectByExample(schoolClassExample);
return new ResultEntity<>(HttpStatus.OK, "班级管理-列表查询通过学校ID查询成功", schoolClasses);
}
@PostMapping("/deleteSchoolClass")
@ApiOperation("班级管理-删除")
@AnonymousAccess
public ResultEntity deleteSchoolClass(@ApiParam("班级ID") @RequestParam String schoolClassId, @RequestParam String userId) {
//先查询useriD 是否够权限
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
if (userInfo == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-删除失败-权限不足");
}
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(schoolClassId);
if (!canModifySchoolClass(userInfo, schoolClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-删除失败-权限不足");
}
if (classHasStudents(schoolClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级下存在学生,不能删除");
}
int i = schoolClassMapper.deleteByPrimaryKey(schoolClassId);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "班级管理-删除成功");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-删除失败");
}
1 year ago
@PostMapping("/updateSchoolClass")
@ApiOperation("班级管理-编辑")
@AnonymousAccess
public ResultEntity updateSchoolClass(@RequestBody SchoolClass schoolClass, @RequestParam String userId) {
if (StringUtils.isBlank(schoolClass.getSchoolClassId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-编辑失败-主键ID缺失");
}
//先查询useriD 是否够权限
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
if (userInfo == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-编辑失败-权限不足");
}
SchoolClass existingClass = schoolClassMapper.selectByPrimaryKey(schoolClass.getSchoolClassId());
if (!canModifySchoolClass(userInfo, existingClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-编辑失败-权限不足");
}
schoolClass.setCreatedBy(existingClass.getCreatedBy());
if (isClassOwner(existingClass, userId)) {
schoolClass.setCreatedBy(userId);
}
int i = schoolClassMapper.updateByPrimaryKeySelective(schoolClass);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "班级管理-编辑成功");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级管理-编辑失败");
}
//新增 同步子系统账户
@PostMapping("/addTeacherAccount")
@ApiOperation("教师管理-添加教师账号")
@AnonymousAccess
public ResultEntity addTeacherAccount(@ApiParam("学校ID") @RequestParam String schoolId,
@ApiParam("学校名称") @RequestParam String schoolName,
@ApiParam("院系ID") @RequestParam String schoolFacultyId,
@ApiParam("专业ID") @RequestParam String schoolMajorId,
@ApiParam("专业名称") @RequestParam String schoolMajorName,
@ApiParam("教师名称") @RequestParam String name,
@ApiParam("教师工号") @RequestParam String userName,
@ApiParam("电话号码") @RequestParam(required = false) String phone,
@ApiParam("电子邮箱") @RequestParam(required = false) String email,
@RequestParam(required = false) String operatorId) {
//先根据schoolId进行查询 如果不存在则返回
School school = schoolMapper.selectByPrimaryKey(schoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
if (!canManageSchoolStructure(operatorId, schoolId)) {
return noManagePermission();
}
//再根据schoolFacultyId查询 如果不存在则返回
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该院系不存在");
}
//再根据schoolMajorId查询 如果不存在则返回
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
if (schoolMajor == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该专业不存在");
}
//检查userName是否已经存在
boolean b = userInfoService.existsByUserName(userName);
if (b) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在");
}
Userinfo userInfo = new Userinfo();
userInfo.setUserId(UUID.randomUUID().toString());
userInfo.setName(name);
userInfo.setUsername(userName);
userInfo.setPassword("123qwe");
userInfo.setPhone(phone);
userInfo.setEmail(email);
userInfo.setCreateTime(new Date());
userInfo.setRole(3);
userInfo.setSchoolId(schoolId);
userInfo.setSchoolFacultyId(schoolFacultyId);
userInfo.setSchoolMajorId(schoolMajorId);
userInfo.setSchoolClassId(null);
userInfo.setTeacherAdmin(false);
userInfo.setCodeFrom("添加");
int insert = userinfoMapper.insert(userInfo);
if (insert == 1) {
return new ResultEntity<>(HttpStatus.OK, "教师管理-添加教师账号成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师管理-添加教师账号失败");
}
}
//分页条件查询
@PostMapping("/selectTeacher")
@ApiOperation("教师管理-查询教师账号信息")
@AnonymousAccess
public ResultEntity<PageInfo<Userinfo>> selectTeacher(@ApiParam("学校ID") @RequestParam(required = false) String schoolId,
@ApiParam("教师名称") @RequestParam(required = false) String name,
@ApiParam("教师工号") @RequestParam(required = false) String userName,
@RequestParam Integer index,
@RequestParam Integer size,
@RequestParam(required = false) String operatorId) {
if (StringUtils.isNotBlank(operatorId)) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!isSchoolTeacher(operator)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权查询教师账号信息");
}
schoolId = operator.getSchoolId();
}
PageHelper.startPage(index, size);
UserinfoExample userInfoExample = new UserinfoExample();
UserinfoExample.Criteria criteria = userInfoExample.createCriteria();
School school = new School();
if (StringUtils.isNotBlank(schoolId)) {
school = schoolMapper.selectByPrimaryKey(schoolId);
criteria.andSchoolIdEqualTo(schoolId);
}
if (StringUtils.isNotBlank(name)) {
criteria.andNameEqualTo(name);
}
if (StringUtils.isNotBlank(userName)) {
criteria.andUsernameEqualTo(userName);
}
criteria.andRoleEqualTo(3);
List<Userinfo> userInfoList = userinfoMapper.selectByExample(userInfoExample);
for (int i = 0; i < userInfoList.size(); i++) {
if (StringUtils.isNotBlank(schoolId)) {
userInfoList.get(i).setSchoolName(school.getSchoolName());
} else {
String schoolId1 = userInfoList.get(i).getSchoolId();
school = schoolMapper.selectByPrimaryKey(schoolId1);
userInfoList.get(i).setSchoolName(school.getSchoolName());
1 year ago
}
}
markTeachersWithCreatedClasses(userInfoList);
PageInfo<Userinfo> pageInfo = new PageInfo<>(userInfoList);
return new ResultEntity<>(HttpStatus.OK, "查询教师账号信息成功!", pageInfo);
}
1 year ago
//编辑
@PostMapping("/updateTeacher")
@ApiOperation("教师管理-编辑教师账号信息")
@AnonymousAccess
public ResultEntity updateTeacher(@RequestBody Userinfo userInfo, @RequestParam(required = false) String operatorId) {
Userinfo existing = userinfoMapper.selectByPrimaryKey(userInfo.getUserId());
if (existing == null || !Integer.valueOf(3).equals(existing.getRole())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师账号不存在");
}
if (teacherHasCreatedClass(existing.getUserId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该教师已创建班级,不允许编辑或删除");
}
String schoolId = existing.getSchoolId();
if (!canManageSchoolStructure(operatorId, schoolId)) {
return noManagePermission();
}
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!isPlatformAdmin(operator)) {
userInfo.setTeacherAdmin(false);
}
int i = userinfoMapper.updateByPrimaryKey(userInfo);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "编辑教师账号信息成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "编辑教师账号信息失败!");
1 year ago
}
//初始化密码
@PostMapping("/updateTeacherPassword")
@ApiOperation("教师管理-初始化密码")
@AnonymousAccess
public ResultEntity updateTeacher(@RequestParam String userId, @RequestParam(required = false) String operatorId) {
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
if (userInfo == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师账号不存在");
}
if (!canManageSchoolStructure(operatorId, userInfo.getSchoolId())) {
return noManagePermission();
}
userInfo.setPassword("123qwe");
int i = userinfoMapper.updateByPrimaryKey(userInfo);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "初始化密码成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "初始化密码失败!");
}
1 year ago
//微信绑定 *****
1 year ago
//删除
@PostMapping("/deleteTeacher")
@ApiOperation("教师管理-删除")
1 year ago
@AnonymousAccess
public ResultEntity deleteTeacher(@RequestParam String userId, @RequestParam(required = false) String operatorId) {
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
if (userInfo == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师账号不存在");
}
if (!canManageSchoolStructure(operatorId, userInfo.getSchoolId())) {
return noManagePermission();
}
if (teacherHasCreatedClass(userId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该教师已创建班级,不允许编辑或删除");
}
int i = userinfoMapper.deleteByPrimaryKey(userId);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "删除成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "删除失败!");
1 year ago
}
//导入 同步子系统账户
@PostMapping("/uploadTeacherUserInfo")
@ApiOperation("教师管理-导入教师账号")
@AnonymousAccess
public ResultEntity uploadTeacherUserInfo(@RequestParam MultipartFile file,
@RequestParam(required = false) String operatorId) {
// 基本校验
if (file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "上传文件不能为空!");
}
String originalFilename = file.getOriginalFilename();
if (!originalFilename.endsWith(".xls") && !originalFilename.endsWith(".xlsx")) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请上传Excel文件");
}
if (file.getSize() > 10 * 1024 * 1024) { // 10MB限制
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "文件大小不能超过10MB");
}
1 year ago
try (InputStream inputStream = file.getInputStream()) {
// 解析Excel
List<TeacherImportDTO> teacherList = EasyExcel.read(inputStream)
.head(TeacherImportDTO.class)
.sheet()
.doReadSync();
// 数据校验
List<String> errorMessages = validateService.validateTeacherData(teacherList);
if (!errorMessages.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", errorMessages);
}
for (TeacherImportDTO teacher : teacherList) {
String schoolId = schoolService.selectSchoolIdBySchoolName(teacher.getSchoolName());
if (!canManageSchoolStructure(operatorId, schoolId)) {
return noManagePermission();
}
}
1 year ago
// 异步处理导入*****
importService.processTeacherImport(teacherList);
return new ResultEntity<>(HttpStatus.OK, "导入成功!");
} catch (Exception e) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", e.getMessage());
}
1 year ago
}
//导出
@PostMapping("/exportTeacherUserInfo")
@ApiOperation("教师管理-导出")
@AnonymousAccess
public void exportTeacherUserInfo(HttpServletResponse response,
@RequestParam String schoolId) {
if (StringUtils.isNotBlank(schoolId)) {
UserinfoExample userInfoExample = new UserinfoExample();
userInfoExample.createCriteria().andSchoolIdEqualTo(schoolId).andRoleEqualTo(3);
List<Userinfo> list = userinfoMapper.selectByExample(userInfoExample);
//导出的表名
String title = "老师账号汇总";
//表中第一行表头字段
String[] headers = {"姓名", "工号", "性别", "手机号", "邮箱"};
//具体需要写入excel需要哪些字段这些字段取自UserReward类也就是上面的实际数据结果集的泛型
List<String> listColumn = Arrays.asList("name", "username", "sex", "phone", "email");
try {
FilePortUtil.exportExcel(response, title, headers, list, listColumn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//*****************************************学生管理*********************************************
//*****************************************学生管理*********************************************
//*****************************************学生管理*********************************************
//新增 *****创建资金账户
@PostMapping("/addStudentAccount")
@ApiOperation("学生管理-添加学生账号")
@AnonymousAccess
public ResultEntity addStudentAccount(@ApiParam("学校ID") @RequestParam String schoolId,
@ApiParam("学校名称") @RequestParam String schoolName,
@ApiParam("院系ID") @RequestParam String schoolFacultyId,
@ApiParam("专业ID") @RequestParam String schoolMajorId,
@ApiParam("专业名称") @RequestParam String schoolMajorName,
@ApiParam("班级名称") @RequestParam String schoolClassName,
@ApiParam("班级Id") @RequestParam String schoolClassId,
@ApiParam("学生姓名") @RequestParam String name,
@ApiParam("学号") @RequestParam String userName,
@ApiParam("电话号码") @RequestParam(required = false) String phone,
@ApiParam("电子邮箱") @RequestParam(required = false) String email,
@RequestParam(required = false) String userId) {
//先根据schoolId进行查询 如果不存在则返回
Userinfo operator = StringUtils.isBlank(userId) ? null : userinfoMapper.selectByPrimaryKey(userId);
String effectiveSchoolId = isSchoolTeacher(operator) ? operator.getSchoolId() : schoolId;
School school = schoolMapper.selectByPrimaryKey(effectiveSchoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
//再根据schoolFacultyId查询 如果不存在则返回
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该院系不存在");
}
//再根据schoolMajorId查询 如果不存在则返回
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
if (schoolMajor == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该专业不存在");
}
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(schoolClassId);
if (schoolClass == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该班级不存在");
}
if (StringUtils.isNotBlank(userId) && !canOperateClass(userId, schoolClassId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能维护自己创建班级的学生");
}
//检查userName是否已经存在
boolean b = userInfoService.existsByUserName(userName);
if (b) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在");
}
Userinfo userInfo = new Userinfo();
userInfo.setUserId(UUID.randomUUID().toString());
userInfo.setName(name);
userInfo.setUsername(userName);
userInfo.setPassword("123qwe");
userInfo.setPhone(phone);
userInfo.setEmail(email);
userInfo.setCreateTime(new Date());
userInfo.setRole(4);
userInfo.setTeacherAdmin(false);
userInfo.setSchoolId(effectiveSchoolId);
userInfo.setSchoolFacultyId(schoolFacultyId);
userInfo.setSchoolMajorId(schoolMajorId);
String adminClassId = "TEACHING".equals(schoolClass.getClassType())
? resolveAdminClassIdForTeachingClass(schoolClass)
: schoolClassId;
userInfo.setSchoolClassId(adminClassId);
userInfo.setCodeFrom("添加");
int insert = userinfoMapper.insert(userInfo);
if (insert == 1) {
if ("TEACHING".equals(schoolClass.getClassType()) && teachingClassStudentMapper != null) {
upsertActiveTeachingClassMember(schoolClassId, userInfo, adminClassId, "MANUAL");
}
return new ResultEntity<>(HttpStatus.OK, "学生管理-添加学生账号成功");
} else {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生管理-添加学生账号失败");
}
}
1 year ago
@PostMapping("/teacher-roster/students")
@ApiOperation("教师维护名单模式-新增学生档案")
@AnonymousAccess
public ResultEntity addTeacherRosterStudent(@RequestParam String name,
@RequestParam String userName,
@RequestParam String teachingClassId,
@RequestParam String operatorId) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!isSchoolTeacher(operator) || !isTeacherRosterMode(operator.getSchoolId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权维护学生名单");
}
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (!canManageTeachingClass(operator, teachingClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能选择可维护的教学班");
}
if (StringUtils.isAnyBlank(StringUtils.trimToNull(name), StringUtils.trimToNull(userName))) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生姓名和学号不能为空");
}
String normalizedUserName = StringUtils.trim(userName);
if (userinfoMapper.selectBySchoolIdAndUsername(operator.getSchoolId(), normalizedUserName) != null
|| userInfoService.existsByUserName(normalizedUserName)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在");
}
Userinfo student = new Userinfo();
student.setUserId(UUID.randomUUID().toString());
student.setName(StringUtils.trim(name));
student.setUsername(normalizedUserName);
student.setPassword("123qwe");
student.setRole(4);
student.setTeacherAdmin(false);
student.setSchoolId(operator.getSchoolId());
student.setCreateTime(new Date());
student.setCodeFrom("教师名单添加");
if (userinfoMapper.insertSelective(student) <= 0) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增学生失败");
}
teachingClassStudentMapper.exitActiveByStudentUserIdExceptClass(student.getUserId(), teachingClassId);
upsertActiveTeachingClassMember(teachingClassId, student, null, "TEACHER_ROSTER_MANUAL");
return new ResultEntity<>(HttpStatus.OK, "新增学生成功");
}
@PostMapping("/teacher-roster/students/{studentUserId}")
@ApiOperation("教师维护名单模式-编辑学生档案")
@AnonymousAccess
public ResultEntity updateTeacherRosterStudent(@PathVariable String studentUserId,
@RequestParam String name,
@RequestParam String userName,
@RequestParam String teachingClassId,
@RequestParam String operatorId) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
Userinfo existingStudent = userinfoMapper.selectByPrimaryKey(studentUserId);
if (!isSchoolTeacher(operator) || !isTeacherRosterMode(operator.getSchoolId())
|| existingStudent == null || !Integer.valueOf(4).equals(existingStudent.getRole())
|| !StringUtils.equals(operator.getSchoolId(), existingStudent.getSchoolId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权维护该学生名单");
}
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (!canManageTeachingClass(operator, teachingClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能选择可维护的教学班");
}
if (StringUtils.isAnyBlank(StringUtils.trimToNull(name), StringUtils.trimToNull(userName))) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生姓名和学号不能为空");
}
String normalizedUserName = StringUtils.trim(userName);
if (!StringUtils.equals(normalizedUserName, existingStudent.getUsername())
&& userInfoService.existsByUserName(normalizedUserName)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在");
}
Userinfo update = new Userinfo();
update.setUserId(studentUserId);
update.setName(StringUtils.trim(name));
update.setUsername(normalizedUserName);
if (userinfoMapper.updateByPrimaryKeySelective(update) <= 0) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "编辑学生失败");
}
teachingClassStudentMapper.exitActiveByStudentUserIdExceptClass(studentUserId, teachingClassId);
upsertActiveTeachingClassMember(teachingClassId, existingStudent, null, "TEACHER_ROSTER_MANUAL");
return new ResultEntity<>(HttpStatus.OK, "编辑学生成功");
}
//查询
ResultEntity<PageInfo<Userinfo>> selectStudent(String schoolId,
String schoolClassId,
String name,
String userName,
Integer index,
Integer size) {
return selectStudent(schoolId, schoolClassId, name, userName, index, size, null);
}
@PostMapping("/selectStudent")
@ApiOperation("学生管理-查询学生账号信息")
1 year ago
@AnonymousAccess
public ResultEntity<PageInfo<Userinfo>> selectStudent(@ApiParam("学校ID") @RequestParam(required = false) String schoolId,
@ApiParam("班级ID") @RequestParam(required = false) String schoolClassId,
@ApiParam("学生姓名") @RequestParam(required = false) String name,
@ApiParam("学生学号") @RequestParam(required = false) String userName,
@RequestParam Integer index,
@RequestParam Integer size,
@RequestParam(required = false) String operatorId) {
Userinfo operator = StringUtils.isBlank(operatorId) ? null : userinfoMapper.selectByPrimaryKey(operatorId);
boolean teacherRosterScope = isSchoolTeacher(operator) && isTeacherRosterMode(operator.getSchoolId());
if (teacherRosterScope) {
schoolId = operator.getSchoolId();
}
PageHelper.startPage(index, size);
UserinfoExample userInfoExample = new UserinfoExample();
UserinfoExample.Criteria criteria = userInfoExample.createCriteria();
School school = new School();
SchoolClass schoolClass = new SchoolClass();
if (StringUtils.isNotBlank(schoolId)) {
school = schoolMapper.selectByPrimaryKey(schoolId);
criteria.andSchoolIdEqualTo(schoolId);
}
if (StringUtils.isNotBlank(name)) {
criteria.andNameEqualTo(name);
}
if (StringUtils.isNotBlank(userName)) {
criteria.andUsernameEqualTo(userName);
}
if (teacherRosterScope) {
List<String> managedStudentIds = resolveManagedRosterStudentIds(operator, schoolClassId);
if (managedStudentIds == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权查看该教学班内的学生");
}
criteria.andUserIdIn(managedStudentIds.isEmpty() ? Collections.singletonList("__empty__") : managedStudentIds);
}
if (StringUtils.isNotBlank(schoolClassId)) {
schoolClass = schoolClassMapper.selectByPrimaryKey(schoolClassId);
if (schoolClass != null && "TEACHING".equals(schoolClass.getClassType()) && teachingClassStudentMapper != null) {
List<TeachingClassStudent> members = teachingClassStudentMapper.selectByTeachingClassId(schoolClassId);
List<String> studentIds = new ArrayList<>();
for (TeachingClassStudent member : members) {
studentIds.add(member.getStudentUserId());
}
criteria.andUserIdIn(studentIds.isEmpty() ? Collections.singletonList("__empty__") : studentIds);
} else {
criteria.andSchoolClassIdEqualTo(schoolClassId);
}
}
criteria.andRoleEqualTo(4);
List<Userinfo> userInfoList = userinfoMapper.selectByExample(userInfoExample);
for (int i = 0; i < userInfoList.size(); i++) {
if (StringUtils.isNotBlank(schoolId)) {
userInfoList.get(i).setSchoolName(school.getSchoolName());
if (StringUtils.isNotBlank(schoolClassId)) {
userInfoList.get(i).setClassName(schoolClass.getClassName());
} else {
Userinfo student = userInfoList.get(i);
if (!populateTeacherRosterTeachingClass(student, schoolId)) {
student.setClassName(safeClassName(student.getSchoolClassId()));
}
}
} else {
String schoolId1 = userInfoList.get(i).getSchoolId();
school = schoolMapper.selectByPrimaryKey(schoolId1);
userInfoList.get(i).setSchoolName(school.getSchoolName());
if (StringUtils.isNotBlank(schoolClassId)) {
userInfoList.get(i).setClassName(schoolClass.getClassName());
} else {
Userinfo student = userInfoList.get(i);
if (!populateTeacherRosterTeachingClass(student, schoolId1)) {
student.setClassName(safeClassName(student.getSchoolClassId()));
}
1 year ago
}
}
}
PageInfo<Userinfo> pageInfo = new PageInfo<>(userInfoList);
return new ResultEntity<>(HttpStatus.OK, "查询学生账号信息成功!", pageInfo);
}
//编辑
private List<String> resolveManagedRosterStudentIds(Userinfo operator, String teachingClassId) {
if (!isSchoolTeacher(operator) || teachingClassStudentMapper == null) {
return Collections.emptyList();
}
List<SchoolClass> teachingClasses;
if (StringUtils.isNotBlank(teachingClassId)) {
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (!canManageTeachingClass(operator, teachingClass)) {
return null;
}
teachingClasses = Collections.singletonList(teachingClass);
} else {
SchoolClassExample example = new SchoolClassExample();
SchoolClassExample.Criteria criteria = example.createCriteria()
.andSchoolIdEqualTo(operator.getSchoolId())
.andClassTypeEqualTo("TEACHING");
if (!isTeacherAdmin(operator)) {
criteria.andCreatedByEqualTo(operator.getUserId());
}
teachingClasses = schoolClassMapper.selectByExample(example);
}
Set<String> studentIds = new LinkedHashSet<>();
for (SchoolClass teachingClass : teachingClasses == null ? Collections.<SchoolClass>emptyList() : teachingClasses) {
List<TeachingClassStudent> members = teachingClassStudentMapper.selectByTeachingClassId(teachingClass.getSchoolClassId());
for (TeachingClassStudent member : members == null ? Collections.<TeachingClassStudent>emptyList() : members) {
if (member != null && StringUtils.isNotBlank(member.getStudentUserId())) {
studentIds.add(member.getStudentUserId());
}
}
}
return new ArrayList<>(studentIds);
}
@PostMapping("/updateStudent")
@ApiOperation("学生管理-编辑学生账号信息")
@AnonymousAccess
public ResultEntity updateStudent(@RequestBody Userinfo userInfo,
@RequestParam(required = false) String operatorId,
@RequestParam(required = false) String teachingClassId) {
String targetClassId = userInfo.getSchoolClassId();
if (StringUtils.isBlank(targetClassId) && StringUtils.isNotBlank(userInfo.getUserId())) {
Userinfo existing = userinfoMapper.selectByPrimaryKey(userInfo.getUserId());
targetClassId = existing == null ? null : existing.getSchoolClassId();
}
boolean canOperate = StringUtils.isNotBlank(teachingClassId)
? canOperateStudent(operatorId, userInfo.getUserId(), teachingClassId)
: canOperateClass(operatorId, targetClassId);
if (!canOperate) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能维护自己创建班级的学生");
}
userInfo.setRole(4);
userInfo.setTeacherAdmin(false);
int i = userinfoMapper.updateByPrimaryKey(userInfo);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "编辑学生账号信息成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "编辑学生账号信息失败!");
}
//删除
@PostMapping("/deleteStudent")
@ApiOperation("学生管理-删除")
@AnonymousAccess
public ResultEntity deleteStudent(@RequestParam String userId,
@RequestParam(required = false) String operatorId,
@RequestParam(required = false) String teachingClassId) {
if (!canOperateStudent(operatorId, userId, teachingClassId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能维护自己创建班级的学生");
}
if (StringUtils.isNotBlank(teachingClassId)) {
int removed = teachingClassStudentMapper.deleteByStudentUserIdAndTeachingClassId(userId, teachingClassId);
if (removed >= 1) {
return new ResultEntity<>(HttpStatus.OK, "删除成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "删除失败!");
}
int i = userinfoMapper.deleteByPrimaryKey(userId);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "删除成功!");
1 year ago
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "删除失败!");
}
1 year ago
//初始化密码
@PostMapping("/updateStudentPassword")
@ApiOperation("学生管理-初始化密码")
@AnonymousAccess
public ResultEntity updateStudentPassword(@RequestParam String userId,
@RequestParam(required = false) String operatorId,
@RequestParam(required = false) String teachingClassId) {
if (!canOperateStudent(operatorId, userId, teachingClassId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能维护自己创建班级的学生");
}
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
userInfo.setPassword("123qwe");
int i = userinfoMapper.updateByPrimaryKey(userInfo);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "初始化密码成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "初始化密码失败!");
1 year ago
}
@PostMapping("/initializeTeachingClassTrainingData")
@ApiOperation("教学班-全班实训数据初始化")
@AnonymousAccess
public ResultEntity initializeTeachingClassTrainingData(@RequestParam String teachingClassId,
@RequestParam String operatorId) {
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!canManageTeachingClass(operator, schoolClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权初始化该教学班");
}
List<TeachingClassStudent> members = teachingClassStudentMapper.selectByTeachingClassId(teachingClassId);
if (members == null) {
members = Collections.emptyList();
}
for (TeachingClassStudent member : members) {
if (member != null && StringUtils.isNotBlank(member.getStudentUserId())) {
cptfController.restartByUserId(member.getStudentUserId());
}
}
return new ResultEntity<>(HttpStatus.OK, "教学班实训数据初始化成功");
}
@PostMapping("/initializeTeachingClassStudentTrainingData")
@ApiOperation("教学班-单个学生实训数据初始化")
@AnonymousAccess
public ResultEntity initializeTeachingClassStudentTrainingData(@RequestParam String teachingClassId,
@RequestParam String studentUserId,
@RequestParam String operatorId) {
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!canManageTeachingClass(operator, schoolClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权初始化该教学班内的学生");
}
if (teachingClassStudentMapper != null
&& teachingClassStudentMapper.countByStudentUserIdAndTeachingClassId(studentUserId, teachingClassId) <= 0) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生不属于该教学班");
}
cptfController.restartByUserId(studentUserId);
return new ResultEntity<>(HttpStatus.OK, "学生实训数据初始化成功");
}
@PostMapping("/uploadTeachingClassStudentMembers")
@ApiOperation("教学班-导入学生成员")
@AnonymousAccess
public ResultEntity uploadTeachingClassStudentMembers(@RequestParam MultipartFile file,
@RequestParam String teachingClassId,
@RequestParam String operatorId,
@RequestParam(required = false, defaultValue = "false") Boolean confirmMultiTeachingClass) {
if (file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "上传文件不能为空!");
}
String originalFilename = file.getOriginalFilename();
if (StringUtils.isBlank(originalFilename)
|| (!originalFilename.endsWith(".xls") && !originalFilename.endsWith(".xlsx"))) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请上传Excel文件");
}
if (file.getSize() > 10 * 1024 * 1024) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "文件大小不能超过10MB");
}
try (InputStream inputStream = file.getInputStream()) {
List<TeachingClassStudentImportDTO> rows = EasyExcel.read(inputStream)
.head(TeachingClassStudentImportDTO.class)
.sheet()
.doReadSync();
return importTeachingClassStudentRows(rows, teachingClassId, operatorId, confirmMultiTeachingClass);
} catch (Exception e) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", e.getMessage());
}
}
@PostMapping("/importTeacherStudents")
@ApiOperation("教师端-批量导入学生账号")
@AnonymousAccess
@Transactional(rollbackFor = Exception.class)
public ResultEntity importTeacherStudents(@RequestParam MultipartFile file,
@RequestParam String operatorId) {
ResultEntity fileError = validateTeacherStudentImportFile(file);
if (fileError != null) {
return fileError;
}
try (InputStream inputStream = file.getInputStream()) {
List<SchoolAdminStudentImportDTO> rows = EasyExcel.read(inputStream)
.head(SchoolAdminStudentImportDTO.class)
.sheet()
.doReadSync();
return importTeacherStudentRows(rows, operatorId);
} catch (Exception e) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败:", e.getMessage());
}
}
ResultEntity importTeacherStudentRows(List<SchoolAdminStudentImportDTO> rows, String operatorId) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!isSchoolTeacher(operator)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "权限不足");
}
List<String> errors = new ArrayList<>();
List<Userinfo> students = buildTeacherImportStudents(rows, operator, errors);
if (!errors.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败", errors);
}
if (students.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "未读取到可导入的学生数据");
}
for (Userinfo student : students) {
int inserted = userinfoMapper.insertSelective(student);
if (inserted <= 0) {
throw new IllegalStateException("导入失败");
}
}
return new ResultEntity<>(HttpStatus.OK, "导入成功,共 " + students.size() + " 条");
}
ResultEntity importTeacherRosterRows(List<TeacherRosterStudentImportDTO> rows,
String teachingClassId,
String operatorId) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (!isSchoolTeacher(operator) || !schoolProductConfigService.isTeacherRosterManaged(operator.getSchoolId())) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权维护该教学班名单");
}
if (rows == null || rows.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "未读取到可导入的学生数据");
}
Map<String, SchoolClass> managedClassesByName = new HashMap<>();
if (StringUtils.isNotBlank(teachingClassId)) {
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (!canManageTeachingClass(operator, teachingClass)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "无权维护该教学班名单");
}
managedClassesByName.put(teachingClass.getClassName(), teachingClass);
} else {
SchoolClassExample example = new SchoolClassExample();
SchoolClassExample.Criteria criteria = example.createCriteria()
.andSchoolIdEqualTo(operator.getSchoolId())
.andClassTypeEqualTo("TEACHING");
if (!isTeacherAdmin(operator)) {
criteria.andCreatedByEqualTo(operator.getUserId());
}
List<SchoolClass> teachingClasses = schoolClassMapper.selectByExample(example);
for (SchoolClass teachingClass : teachingClasses == null ? Collections.<SchoolClass>emptyList() : teachingClasses) {
managedClassesByName.put(teachingClass.getClassName(), teachingClass);
}
}
List<TeacherRosterImportRecord> importRecords = new ArrayList<>();
Set<String> usernames = new HashSet<>();
for (TeacherRosterStudentImportDTO row : rows) {
String name = row == null ? "" : StringUtils.trimToEmpty(row.getName());
String username = row == null ? "" : StringUtils.trimToEmpty(row.getUsername());
String className = row == null ? "" : StringUtils.trimToEmpty(row.getClassName());
if (StringUtils.isBlank(name) || StringUtils.isBlank(username) || (StringUtils.isBlank(teachingClassId) && StringUtils.isBlank(className))) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生姓名或学号无效");
}
SchoolClass targetClass = StringUtils.isNotBlank(teachingClassId)
? managedClassesByName.values().iterator().next()
: managedClassesByName.get(className);
if (targetClass == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级不存在或无管理权限:" + className);
}
if (!usernames.add(username)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "导入文件中学号重复:" + username);
}
Userinfo existingStudent = userinfoMapper.selectBySchoolIdAndUsername(operator.getSchoolId(), username);
if (existingStudent != null) {
if (!Integer.valueOf(4).equals(existingStudent.getRole()) || !StringUtils.equals(existingStudent.getName(), name)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学号与已有学生信息冲突");
}
importRecords.add(new TeacherRosterImportRecord(targetClass.getSchoolClassId(), existingStudent, false));
continue;
}
if (userInfoService.existsByUserName(username)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学号已被其他学校使用");
}
Userinfo student = new Userinfo();
student.setUserId(UUID.randomUUID().toString());
student.setName(name);
student.setUsername(username);
student.setPassword("123qwe");
student.setRole(4);
student.setTeacherAdmin(false);
student.setSchoolId(operator.getSchoolId());
student.setCreateTime(new Date());
student.setCodeFrom("教师教学班导入");
importRecords.add(new TeacherRosterImportRecord(targetClass.getSchoolClassId(), student, true));
}
for (TeacherRosterImportRecord record : importRecords) {
Userinfo student = record.student;
if (record.needsInsert && userinfoMapper.insertSelective(student) <= 0) {
throw new IllegalStateException("学生导入失败");
}
upsertActiveTeachingClassMember(record.teachingClassId, student, null, "TEACHER_ROSTER_IMPORT");
}
return new ResultEntity<>(HttpStatus.OK, "导入成功");
}
private static class TeacherRosterImportRecord {
private final String teachingClassId;
private final Userinfo student;
private final boolean needsInsert;
private TeacherRosterImportRecord(String teachingClassId, Userinfo student, boolean needsInsert) {
this.teachingClassId = teachingClassId;
this.student = student;
this.needsInsert = needsInsert;
}
}
@PostMapping("/teaching-classes/{teachingClassId}/students/import")
@ApiOperation("教师教学班-导入学生名单")
@Transactional(rollbackFor = Exception.class)
public ResultEntity importTeacherRoster(@PathVariable String teachingClassId,
@RequestParam MultipartFile file,
HttpServletRequest request) {
JwtUser user = TokenProvider.getJWTUser(request);
if (user == null || StringUtils.isBlank(user.getUserId())) {
return new ResultEntity<>(HttpStatus.UNAUTHORIZED, "请先登录");
}
if (file == null || file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请选择要导入的Excel文件");
}
try (InputStream inputStream = file.getInputStream()) {
List<TeacherRosterStudentImportDTO> rows = EasyExcel.read(inputStream)
.head(TeacherRosterStudentImportDTO.class).sheet().doReadSync();
return importTeacherRosterRows(rows, teachingClassId, user.getUserId());
} catch (Exception exception) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败", exception.getMessage());
}
}
@PostMapping("/teaching-classes/students/import")
@ApiOperation("教师教学班-按班级名称导入学生名单")
@Transactional(rollbackFor = Exception.class)
public ResultEntity importTeacherRosterByClassName(@RequestParam MultipartFile file,
HttpServletRequest request) {
JwtUser user = TokenProvider.getJWTUser(request);
if (user == null || StringUtils.isBlank(user.getUserId())) {
return new ResultEntity<>(HttpStatus.UNAUTHORIZED, "请先登录");
}
if (file == null || file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请选择要导入的Excel文件");
}
try (InputStream inputStream = file.getInputStream()) {
List<TeacherRosterStudentImportDTO> rows = EasyExcel.read(inputStream)
.head(TeacherRosterStudentImportDTO.class).sheet().doReadSync();
return importTeacherRosterRows(rows, null, user.getUserId());
} catch (Exception exception) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败", exception.getMessage());
}
}
ResultEntity addSchoolClass(String schoolId,
String schoolFacultyId,
String schoolMajorId,
String className,
String userId,
String classType,
String sourceClassIds) {
return addSchoolClass(schoolId, schoolFacultyId, schoolMajorId, className,
userId, classType, sourceClassIds, false);
}
@PostMapping("/uploadTeachingClassByStudentMembers")
@ApiOperation("教学班-导入名单创建教学班")
@AnonymousAccess
public ResultEntity uploadTeachingClassByStudentMembers(@RequestParam MultipartFile file,
@RequestParam String schoolId,
@RequestParam String schoolFacultyId,
@RequestParam String schoolMajorId,
@RequestParam String className,
@RequestParam String operatorId,
@RequestParam(required = false) String sourceClassIds,
@RequestParam(required = false, defaultValue = "false") Boolean confirmMultiTeachingClass) {
if (file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "上传文件不能为空!");
}
String originalFilename = file.getOriginalFilename();
if (StringUtils.isBlank(originalFilename)
|| (!originalFilename.endsWith(".xls") && !originalFilename.endsWith(".xlsx"))) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请上传Excel文件");
}
if (file.getSize() > 10 * 1024 * 1024) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "文件大小不能超过10MB");
}
try (InputStream inputStream = file.getInputStream()) {
List<TeachingClassStudentImportDTO> rows = EasyExcel.read(inputStream)
.head(TeachingClassStudentImportDTO.class)
.sheet()
.doReadSync();
return createTeachingClassByImportRows(rows, schoolId, schoolFacultyId, schoolMajorId, className, operatorId, sourceClassIds, confirmMultiTeachingClass);
} catch (Exception e) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", e.getMessage());
}
}
ResultEntity importTeachingClassStudentRows(List<TeachingClassStudentImportDTO> rows,
String teachingClassId,
String operatorId) {
return importTeachingClassStudentRows(rows, teachingClassId, operatorId, false);
}
ResultEntity importTeachingClassStudentRows(List<TeachingClassStudentImportDTO> rows,
String teachingClassId,
String operatorId,
Boolean confirmMultiTeachingClass) {
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (!isOwnedTeachingClass(teachingClass, operatorId)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "只能导入自己创建教学班的学生");
}
List<String> sourceClassIds = parseSourceClassIds(teachingClass.getSourceClassIds());
SchoolMajor teachingMajor = schoolMajorMapper.selectByPrimaryKey(teachingClass.getSchoolMajorId());
String teachingFacultyId = teachingMajor == null ? null : teachingMajor.getSchoolFacultyId();
List<String> errors = sourceClassIds.isEmpty()
? validateTeachingClassImportRowsByMajor(rows, teachingClass.getSchoolId(), teachingFacultyId, teachingClass.getSchoolMajorId())
: validateTeachingClassStudentRows(rows, teachingClass, sourceClassIds);
if (!errors.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", errors);
}
List<Userinfo> studentsToAdd = new ArrayList<>();
for (TeachingClassStudentImportDTO row : rows) {
Userinfo student = sourceClassIds.isEmpty()
? findAdminClassStudent(row, teachingClass.getSchoolId(), teachingFacultyId, teachingClass.getSchoolMajorId())
: findAdminClassStudent(row, teachingClass, sourceClassIds);
if (student == null) {
continue;
}
studentsToAdd.add(student);
}
for (Userinfo student : studentsToAdd) {
upsertActiveTeachingClassMember(teachingClassId, student, student.getSchoolClassId(), "IMPORT");
}
return new ResultEntity<>(HttpStatus.OK, "导入成功!");
}
ResultEntity createTeachingClassByImportRows(List<TeachingClassStudentImportDTO> rows,
String schoolId,
String schoolFacultyId,
String schoolMajorId,
String className,
String operatorId) {
return createTeachingClassByImportRows(rows, schoolId, schoolFacultyId, schoolMajorId, className, operatorId, false);
}
ResultEntity createTeachingClassByImportRows(List<TeachingClassStudentImportDTO> rows,
String schoolId,
String schoolFacultyId,
String schoolMajorId,
String className,
String operatorId,
Boolean confirmMultiTeachingClass) {
return createTeachingClassByImportRows(rows, schoolId, schoolFacultyId, schoolMajorId, className, operatorId, null, confirmMultiTeachingClass);
}
ResultEntity createTeachingClassByImportRows(List<TeachingClassStudentImportDTO> rows,
String schoolId,
String schoolFacultyId,
String schoolMajorId,
String className,
String operatorId,
String selectedSourceClassIds,
Boolean confirmMultiTeachingClass) {
School school = schoolMapper.selectByPrimaryKey(schoolId);
if (school == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该学校不存在");
}
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
if (schoolFaculty == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该院系不存在");
}
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
if (schoolMajor == null) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "该专业不存在");
}
if (StringUtils.isBlank(className)) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级名称不能为空");
}
SchoolClassExample duplicateExample = new SchoolClassExample();
duplicateExample.createCriteria().andSchoolIdEqualTo(schoolId).andClassNameEqualTo(className);
if (!schoolClassMapper.selectByExample(duplicateExample).isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级名称重复");
}
List<String> selectedSourceClassIdList = parseSourceClassIds(selectedSourceClassIds);
List<String> errors = selectedSourceClassIdList.isEmpty()
? validateTeachingClassImportRowsByMajor(rows, schoolId, schoolFacultyId, schoolMajorId)
: validateTeachingClassImportRowsBySourceClasses(rows, schoolId, schoolFacultyId, schoolMajorId, selectedSourceClassIdList);
if (!errors.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", errors);
}
List<Userinfo> importedStudents = new ArrayList<>();
LinkedHashSet<String> sourceClassIds = new LinkedHashSet<>();
SchoolClass importScope = new SchoolClass();
importScope.setSchoolId(schoolId);
for (TeachingClassStudentImportDTO row : rows) {
Userinfo student = selectedSourceClassIdList.isEmpty()
? findAdminClassStudent(row, schoolId, schoolFacultyId, schoolMajorId)
: findAdminClassStudent(row, importScope, selectedSourceClassIdList);
if (student == null) {
continue;
}
importedStudents.add(student);
if (StringUtils.isNotBlank(student.getSchoolClassId())) {
sourceClassIds.add(student.getSchoolClassId());
}
}
if (!selectedSourceClassIdList.isEmpty()) {
sourceClassIds.clear();
sourceClassIds.addAll(selectedSourceClassIdList);
}
SchoolClass teachingClass = new SchoolClass();
teachingClass.setSchoolClassId(UUID.randomUUID().toString());
teachingClass.setSchoolId(schoolId);
teachingClass.setSchoolMajorId(schoolMajorId);
teachingClass.setClassName(className);
teachingClass.setClassSn(pinyin4jUtil.convertToPinyin(school.getSchoolName()) + "_" + pinyin4jUtil.convertToPinyin(className));
teachingClass.setCreateTime(new Date());
teachingClass.setCreatedBy(operatorId);
teachingClass.setClassType("TEACHING");
teachingClass.setDataSource("LOCAL");
teachingClass.setSourceClassIds(String.join(",", sourceClassIds));
int insert = schoolClassMapper.insert(teachingClass);
if (insert != 1) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "新增班级失败");
}
for (Userinfo student : importedStudents) {
upsertActiveTeachingClassMember(teachingClass.getSchoolClassId(), student, student.getSchoolClassId(), "IMPORT_CREATE");
}
return new ResultEntity<>(HttpStatus.OK, "导入创建教学班成功");
}
//微信绑定*****
//导入 ***** 创建资金账户
@PostMapping("/uploadStudentUserInfo")
@ApiOperation("学生管理-导入学生账号")
@AnonymousAccess
public ResultEntity uploadStudentUserInfo(@RequestParam MultipartFile file) {
// 基本校验
if (file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "上传文件不能为空!");
}
String originalFilename = file.getOriginalFilename();
if (!originalFilename.endsWith(".xls") && !originalFilename.endsWith(".xlsx")) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请上传Excel文件");
}
if (file.getSize() > 10 * 1024 * 1024) { // 10MB限制
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "文件大小不能超过10MB");
}
1 year ago
try (InputStream inputStream = file.getInputStream()) {
// 解析Excel
List<StudentImportDTO> studentList = EasyExcel.read(inputStream)
.head(StudentImportDTO.class)
.sheet()
.doReadSync();
// 数据校验
List<String> errorMessages = validateService.validateStudentData(studentList);
if (!errorMessages.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", errorMessages);
}
// 异步处理导入*****
importService.processStudentImport(studentList);
return new ResultEntity<>(HttpStatus.OK, "导入成功!");
} catch (Exception e) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "数据校验失败!", e.getMessage());
}
}
//导出
@PostMapping("/exportStudentUserInfo")
@ApiOperation("学生管理-导出")
@AnonymousAccess
public void exportStudentUserInfo(HttpServletResponse response,
@RequestParam String schoolId,
@RequestParam(required = false) String operatorId,
@RequestParam(required = false) String schoolClassId) {
Userinfo operator = StringUtils.isBlank(operatorId) ? null : userinfoMapper.selectByPrimaryKey(operatorId);
boolean teacherRosterScope = isSchoolTeacher(operator) && isTeacherRosterMode(operator.getSchoolId());
if (teacherRosterScope) {
schoolId = operator.getSchoolId();
}
if (StringUtils.isNotBlank(schoolId)) {
UserinfoExample userInfoExample = new UserinfoExample();
userInfoExample.createCriteria().andSchoolIdEqualTo(schoolId).andRoleEqualTo(4);
if (teacherRosterScope) {
List<String> managedStudentIds = resolveManagedRosterStudentIds(operator, schoolClassId);
if (managedStudentIds == null) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
return;
}
userInfoExample.getOredCriteria().get(0)
.andUserIdIn(managedStudentIds.isEmpty() ? Collections.singletonList("__empty__") : managedStudentIds);
}
List<Userinfo> list = userinfoMapper.selectByExample(userInfoExample);
//导出的表名
String title = "学生账号汇总";
//表中第一行表头字段
String[] headers = {"姓名", "学号", "性别", "手机号", "邮箱"};
//具体需要写入excel需要哪些字段这些字段取自UserReward类也就是上面的实际数据结果集的泛型
List<String> listColumn = Arrays.asList("name", "username", "sex", "phone", "email");
try {
FilePortUtil.exportExcel(response, title, headers, list, listColumn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1 year ago
//修改密码
@PostMapping("/updatePassword")
@ApiOperation("个人中心-修改密码")
@AnonymousAccess
public ResultEntity updatePassword(@RequestParam String userId, @RequestParam String password) {
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
userInfo.setPassword(password);
int i = userinfoMapper.updateByPrimaryKey(userInfo);
if (i == 1) {
return new ResultEntity<>(HttpStatus.OK, "修改密码成功!");
}
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "修改密码失败!");
}
@PostMapping("/selectPersonInfo")
@ApiOperation("个人中心-查看用户数据")
@AnonymousAccess
public ResultEntity<Userinfo> selectPersonInfo(@RequestParam String userId) {
Userinfo userInfo = userinfoMapper.selectByPrimaryKey(userId);
String schoolId = userInfo.getSchoolId();
String schoolFacultyId = userInfo.getSchoolFacultyId();
String schoolMajorId = userInfo.getSchoolMajorId();
String schoolName = safeSchoolName(schoolId);
String schoolFacultyName = safeFacultyName(schoolFacultyId);
String schoolMajorName = safeMajorName(schoolMajorId);
userInfo.setSchoolId(schoolName);
userInfo.setSchoolName(schoolName);
userInfo.setSchoolFacultyId(schoolFacultyName);
userInfo.setSchoolMajorId(schoolMajorName);
if (Integer.valueOf(4).equals(userInfo.getRole())) { //查看学生信息
String schoolClassId = userInfo.getSchoolClassId();
String className = safeClassName(schoolClassId);
userInfo.setSchoolClassId(className);
userInfo.setClassName(className);
}
return new ResultEntity<>(HttpStatus.OK, "个人中心-查看用户数据成功!",userInfo);
}
private String safeSchoolName(String schoolId) {
if (StringUtils.isBlank(schoolId)) {
return "";
}
String schoolName = schoolMapper.selectSchoolNameById(schoolId);
return schoolName == null ? "" : schoolName;
}
private String safeFacultyName(String schoolFacultyId) {
if (StringUtils.isBlank(schoolFacultyId)) {
return "";
}
SchoolFaculty schoolFaculty = schoolFacultyMapper.selectByPrimaryKey(schoolFacultyId);
return schoolFaculty == null ? "" : schoolFaculty.getSchoolFacultyName();
}
private String safeMajorName(String schoolMajorId) {
if (StringUtils.isBlank(schoolMajorId)) {
return "";
}
SchoolMajor schoolMajor = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
return schoolMajor == null ? "" : schoolMajor.getSchoolMajorName();
}
private String safeClassName(String schoolClassId) {
if (StringUtils.isBlank(schoolClassId)) {
return "";
}
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(schoolClassId);
return schoolClass == null ? "" : schoolClass.getClassName();
}
private boolean populateTeacherRosterTeachingClass(Userinfo student, String schoolId) {
if (!isTeacherRosterMode(schoolId) || teachingClassStudentMapper == null || student == null) {
return false;
}
TeachingClassStudent membership = teachingClassStudentMapper.selectActiveByStudentUserId(student.getUserId());
if (membership == null || StringUtils.isBlank(membership.getTeachingClassId())) {
return false;
}
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(membership.getTeachingClassId());
if (teachingClass == null || !"TEACHING".equals(teachingClass.getClassType())) {
return false;
}
student.setTeachingClassId(teachingClass.getSchoolClassId());
student.setClassName(teachingClass.getClassName());
return true;
}
private boolean hasMajorUnderFaculty(String schoolFacultyId) {
SchoolMajorExample example = new SchoolMajorExample();
example.createCriteria().andSchoolFacultyIdEqualTo(schoolFacultyId);
return !schoolMajorMapper.selectByExample(example).isEmpty();
}
private boolean hasClassUnderMajor(String schoolMajorId) {
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andSchoolMajorIdEqualTo(schoolMajorId);
return !schoolClassMapper.selectByExample(example).isEmpty();
}
private boolean classHasStudents(SchoolClass schoolClass) {
if (schoolClass == null) {
return false;
}
if ("TEACHING".equals(schoolClass.getClassType()) && teachingClassStudentMapper != null) {
return teachingClassStudentMapper.countByTeachingClassId(schoolClass.getSchoolClassId()) > 0;
}
UserinfoExample example = new UserinfoExample();
example.createCriteria().andSchoolClassIdEqualTo(schoolClass.getSchoolClassId()).andRoleEqualTo(4);
return !userinfoMapper.selectByExample(example).isEmpty();
}
private String resolveAdminClassIdForTeachingClass(SchoolClass teachingClass) {
if (StringUtils.isBlank(teachingClass.getSourceClassIds())) {
return teachingClass.getSchoolClassId();
}
String sourceClassIds = teachingClass.getSourceClassIds()
.replace("[", "")
.replace("]", "")
.replace("\"", "");
String[] ids = sourceClassIds.split(",");
return StringUtils.trimToEmpty(ids[0]);
}
private boolean isOwnedTeachingClass(SchoolClass schoolClass, String operatorId) {
return schoolClass != null
&& "TEACHING".equals(schoolClass.getClassType())
&& isClassOwner(schoolClass, operatorId);
}
private boolean canManageTeachingClass(Userinfo operator, SchoolClass teachingClass) {
return isSchoolTeacher(operator)
&& teachingClass != null
&& "TEACHING".equals(teachingClass.getClassType())
&& StringUtils.equals(operator.getSchoolId(), teachingClass.getSchoolId())
&& (isTeacherAdmin(operator) || isClassOwner(teachingClass, operator.getUserId()));
}
private boolean isClassOwner(SchoolClass schoolClass, String userId) {
return schoolClass != null
&& StringUtils.isNotBlank(userId)
&& StringUtils.equals(schoolClass.getCreatedBy(), userId);
}
private boolean isAdminClass(SchoolClass schoolClass) {
return schoolClass != null
&& ("ADMIN".equals(schoolClass.getClassType())
|| (StringUtils.isBlank(schoolClass.getClassType()) && StringUtils.isBlank(schoolClass.getCreatedBy())));
}
private void upsertActiveTeachingClassMember(String teachingClassId,
Userinfo student,
String adminClassId,
String joinReason) {
if (teachingClassStudentMapper == null
|| StringUtils.isBlank(teachingClassId)
|| student == null
|| StringUtils.isBlank(student.getUserId())) {
return;
}
TeachingClassStudent existing = teachingClassStudentMapper
.selectByStudentUserIdAndTeachingClassId(student.getUserId(), teachingClassId);
if (existing != null) {
teachingClassStudentMapper.updateMembershipToActive(
student.getUserId(),
teachingClassId,
adminClassId,
joinReason);
return;
}
TeachingClassStudent member = new TeachingClassStudent();
Date now = new Date();
member.setId(UUID.randomUUID().toString());
member.setTeachingClassId(teachingClassId);
member.setStudentUserId(student.getUserId());
member.setAdminClassId(adminClassId);
member.setStatus("IN_PROGRESS");
member.setJoinReason(joinReason);
member.setJoinTime(now);
member.setCreateTime(now);
teachingClassStudentMapper.insertSelective(member);
}
private boolean canModifySchoolClass(Userinfo operator, SchoolClass schoolClass) {
if (operator == null || schoolClass == null) {
return false;
}
if ("ZHIYUN".equals(schoolClass.getDataSource())) {
return false;
}
if (isPlatformAdmin(operator)) {
return true;
}
if (!Integer.valueOf(3).equals(operator.getRole())) {
return false;
}
if (isAdminClass(schoolClass)) {
return canManageAdminClass(operator, schoolClass);
}
return isClassOwner(schoolClass, operator.getUserId());
}
private ResultEntity buildMultiTeachingClassConflict(List<Userinfo> students, String targetTeachingClassId) {
if (students == null || students.isEmpty()) {
return null;
}
List<String> conflicts = new ArrayList<>();
Set<String> studentIds = new HashSet<>();
for (Userinfo student : students) {
if (student == null || StringUtils.isBlank(student.getUserId()) || !studentIds.add(student.getUserId())) {
continue;
}
if (teachingClassStudentMapper.countByStudentUserIdExcludingTeachingClass(
student.getUserId(), StringUtils.trimToEmpty(targetTeachingClassId)) > 0) {
conflicts.add(formatStudentConflict(student));
}
}
if (conflicts.isEmpty()) {
return null;
}
return new ResultEntity<>(HttpStatus.CONFLICT, "部分学生已在其他教学班,确认后可继续操作", conflicts);
}
private String formatStudentConflict(Userinfo student) {
String name = StringUtils.defaultIfBlank(student.getName(), "未命名学生");
String username = StringUtils.defaultIfBlank(student.getUsername(), "-");
return name + "(" + username + ")";
}
private List<Userinfo> findStudentsByAdminClassIds(List<String> sourceClassIds) {
if (sourceClassIds == null || sourceClassIds.isEmpty()) {
return Collections.emptyList();
}
UserinfoExample example = new UserinfoExample();
example.createCriteria()
.andRoleEqualTo(4)
.andSchoolClassIdIn(sourceClassIds);
List<Userinfo> students = userinfoMapper.selectByExample(example);
return students == null ? Collections.emptyList() : students;
}
private void createTeachingClassMembersFromSourceClasses(SchoolClass teachingClass) {
if (teachingClassStudentMapper == null
|| teachingClass == null
|| !"TEACHING".equals(teachingClass.getClassType())
|| StringUtils.isBlank(teachingClass.getSourceClassIds())) {
return;
}
List<String> sourceClassIds = parseSourceClassIds(teachingClass.getSourceClassIds());
if (sourceClassIds.isEmpty()) {
return;
}
List<Userinfo> students = findStudentsByAdminClassIds(sourceClassIds);
for (Userinfo student : students) {
if (student == null || StringUtils.isBlank(student.getUserId())) {
continue;
}
upsertActiveTeachingClassMember(teachingClass.getSchoolClassId(), student, student.getSchoolClassId(), "ADMIN_CLASS_MERGE");
}
}
private List<String> validateTeachingClassStudentRows(List<TeachingClassStudentImportDTO> rows,
SchoolClass teachingClass,
List<String> sourceClassIds) {
List<String> errors = new ArrayList<>();
if (rows == null || rows.isEmpty()) {
errors.add("Excel中没有数据");
return errors;
}
Set<String> rowKeys = new HashSet<>();
for (int i = 0; i < rows.size(); i++) {
TeachingClassStudentImportDTO row = rows.get(i);
int rowNum = i + 2;
String studentName = row == null ? "" : StringUtils.trimToEmpty(row.getStudentName());
String userName = row == null ? "" : StringUtils.trimToEmpty(row.getUserName());
if (StringUtils.isBlank(studentName)) {
errors.add("第" + rowNum + "行 学生姓名不能为空");
}
if (StringUtils.isBlank(userName)) {
errors.add("第" + rowNum + "行 学号不能为空");
}
if (StringUtils.isBlank(studentName) || StringUtils.isBlank(userName)) {
continue;
}
String rowKey = studentName + "#" + userName;
if (!rowKeys.add(rowKey)) {
errors.add("第" + rowNum + "行 学生姓名和学号重复");
continue;
}
Userinfo student = findAdminClassStudent(row, teachingClass, sourceClassIds);
if (student == null) {
errors.add("第" + rowNum + "行 学生姓名与学号未匹配到来源行政班学生");
}
}
return errors;
}
private Userinfo findAdminClassStudent(TeachingClassStudentImportDTO row,
SchoolClass teachingClass,
List<String> sourceClassIds) {
if (row == null || teachingClass == null || sourceClassIds == null || sourceClassIds.isEmpty()) {
return null;
}
UserinfoExample example = new UserinfoExample();
example.createCriteria()
.andRoleEqualTo(4)
.andSchoolIdEqualTo(teachingClass.getSchoolId())
.andNameEqualTo(StringUtils.trimToEmpty(row.getStudentName()))
.andUsernameEqualTo(StringUtils.trimToEmpty(row.getUserName()))
.andSchoolClassIdIn(sourceClassIds);
List<Userinfo> students = userinfoMapper.selectByExample(example);
if (students == null || students.isEmpty()) {
return null;
}
return students.get(0);
}
private List<String> validateTeachingClassImportRowsByMajor(List<TeachingClassStudentImportDTO> rows,
String schoolId,
String schoolFacultyId,
String schoolMajorId) {
List<String> errors = new ArrayList<>();
if (rows == null || rows.isEmpty()) {
errors.add("Excel中没有数据");
return errors;
}
Set<String> rowKeys = new HashSet<>();
for (int i = 0; i < rows.size(); i++) {
TeachingClassStudentImportDTO row = rows.get(i);
int rowNum = i + 2;
String studentName = row == null ? "" : StringUtils.trimToEmpty(row.getStudentName());
String userName = row == null ? "" : StringUtils.trimToEmpty(row.getUserName());
if (StringUtils.isBlank(studentName)) {
errors.add("第" + rowNum + "行 学生姓名不能为空");
}
if (StringUtils.isBlank(userName)) {
errors.add("第" + rowNum + "行 学号不能为空");
}
if (StringUtils.isBlank(studentName) || StringUtils.isBlank(userName)) {
continue;
}
String rowKey = studentName + "#" + userName;
if (!rowKeys.add(rowKey)) {
errors.add("第" + rowNum + "行 学生姓名和学号重复");
continue;
}
if (StringUtils.isNotBlank(row.getSchoolClassName())) {
SchoolClass adminClass = findTeacherImportClass(schoolId, schoolMajorId, StringUtils.trimToEmpty(row.getSchoolClassName()));
if (adminClass == null || !"ADMIN".equals(adminClass.getClassType())) {
errors.add("第" + rowNum + "行 未匹配到行政班:" + row.getSchoolClassName());
continue;
}
}
Userinfo student = findAdminClassStudent(row, schoolId, schoolFacultyId, schoolMajorId);
if (student == null) {
errors.add("第" + rowNum + "行 学生姓名与学号未匹配到该专业下的行政班学生");
}
}
return errors;
}
private List<String> validateTeachingClassImportRowsBySourceClasses(List<TeachingClassStudentImportDTO> rows,
String schoolId,
String schoolFacultyId,
String schoolMajorId,
List<String> sourceClassIds) {
List<String> errors = new ArrayList<>();
if (sourceClassIds == null || sourceClassIds.isEmpty()) {
errors.add("请选择来源行政班");
return errors;
}
for (String sourceClassId : sourceClassIds) {
SchoolClass sourceClass = schoolClassMapper.selectByPrimaryKey(sourceClassId);
if (sourceClass == null) {
errors.add("来源行政班不存在");
continue;
}
if (!"ADMIN".equals(sourceClass.getClassType())
|| !schoolId.equals(sourceClass.getSchoolId())
|| !schoolMajorId.equals(sourceClass.getSchoolMajorId())) {
errors.add("来源行政班不属于当前学校和专业");
}
}
if (!errors.isEmpty()) {
return errors;
}
SchoolClass importScope = new SchoolClass();
importScope.setSchoolId(schoolId);
List<String> rowErrors = validateTeachingClassStudentRows(rows, importScope, sourceClassIds);
for (String rowError : rowErrors) {
errors.add(rowError.replace("来源行政班学生", "所选来源行政班学生"));
}
return errors;
}
private Userinfo findAdminClassStudent(TeachingClassStudentImportDTO row,
String schoolId,
String schoolFacultyId,
String schoolMajorId) {
if (row == null) {
return null;
}
UserinfoExample example = new UserinfoExample();
UserinfoExample.Criteria criteria = example.createCriteria()
.andRoleEqualTo(4)
.andSchoolIdEqualTo(schoolId)
.andSchoolFacultyIdEqualTo(schoolFacultyId)
.andSchoolMajorIdEqualTo(schoolMajorId)
.andNameEqualTo(StringUtils.trimToEmpty(row.getStudentName()))
.andUsernameEqualTo(StringUtils.trimToEmpty(row.getUserName()));
if (StringUtils.isNotBlank(row.getSchoolClassName())) {
SchoolClass adminClass = findTeacherImportClass(schoolId, schoolMajorId, StringUtils.trimToEmpty(row.getSchoolClassName()));
criteria.andSchoolClassIdEqualTo(adminClass == null ? "__missing__" : adminClass.getSchoolClassId());
}
List<Userinfo> students = userinfoMapper.selectByExample(example);
if (students == null || students.isEmpty()) {
return null;
}
return students.get(0);
}
private ResultEntity validateTeacherStudentImportFile(MultipartFile file) {
if (file == null || file.isEmpty()) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请选择要导入的Excel文件");
}
String filename = StringUtils.defaultString(file.getOriginalFilename());
if (!StringUtils.endsWithIgnoreCase(filename, ".xls") && !StringUtils.endsWithIgnoreCase(filename, ".xlsx")) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "仅支持xls或xlsx格式文件");
}
if (file.getSize() > 10 * 1024 * 1024) {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "文件大小不能超过10MB");
}
return null;
}
private List<Userinfo> buildTeacherImportStudents(List<SchoolAdminStudentImportDTO> rows,
Userinfo operator,
List<String> errors) {
List<Userinfo> students = new ArrayList<>();
Set<String> usernames = new HashSet<>();
if (rows == null) {
return students;
}
for (int i = 0; i < rows.size(); i++) {
SchoolAdminStudentImportDTO row = rows.get(i);
int rowNumber = i + 2;
if (isBlankTeacherStudentImportRow(row)) {
continue;
}
String name = StringUtils.trimToEmpty(row.getName());
String username = StringUtils.trimToEmpty(row.getUsername());
String facultyName = StringUtils.trimToEmpty(row.getSchoolFacultyName());
String majorName = StringUtils.trimToEmpty(row.getSchoolMajorName());
String className = StringUtils.trimToEmpty(row.getSchoolClassName());
String sex = normalizeTeacherImportSex(row.getSex());
if (StringUtils.isBlank(name)) {
errors.add("第" + rowNumber + "行:姓名不能为空");
}
if (StringUtils.isBlank(username)) {
errors.add("第" + rowNumber + "行:学号不能为空");
} else if (!usernames.add(username)) {
errors.add("第" + rowNumber + "行:学号在导入文件中重复");
} else if (userInfoService.existsByUserName(username)) {
errors.add("第" + rowNumber + "行:账号已存在");
}
if (StringUtils.isNotBlank(row.getSex()) && sex == null) {
errors.add("第" + rowNumber + "行:性别请填写男或女");
}
if (StringUtils.isBlank(facultyName)) {
errors.add("第" + rowNumber + "行:所属院系不能为空");
}
if (StringUtils.isBlank(majorName)) {
errors.add("第" + rowNumber + "行:所属专业不能为空");
}
if (StringUtils.isBlank(className)) {
errors.add("第" + rowNumber + "行:所属班级不能为空");
}
SchoolFaculty faculty = StringUtils.isBlank(facultyName) ? null : findTeacherImportFaculty(operator.getSchoolId(), facultyName);
SchoolMajor major = null;
SchoolClass schoolClass = null;
if (StringUtils.isNotBlank(facultyName) && faculty == null) {
errors.add("第" + rowNumber + "行:未找到院系“" + facultyName + "”");
}
if (faculty != null && StringUtils.isNotBlank(majorName)) {
major = findTeacherImportMajor(faculty.getSchoolFacultyId(), majorName);
if (major == null) {
errors.add("第" + rowNumber + "行:院系“" + facultyName + "”下未找到专业“" + majorName + "”");
}
}
if (major != null && StringUtils.isNotBlank(className)) {
schoolClass = findTeacherImportClass(operator.getSchoolId(), major.getSchoolMajorId(), className);
if (schoolClass == null) {
errors.add("第" + rowNumber + "行:专业“" + majorName + "”下未找到班级“" + className + "”");
} else if (!isAdminClass(schoolClass)) {
errors.add("第" + rowNumber + "行:学生账号只能导入行政班");
} else if (!canManageAdminClass(operator, schoolClass)) {
errors.add("第" + rowNumber + "行:只能导入本校行政班");
}
}
if (!hasTeacherImportRowError(errors, rowNumber)) {
Userinfo student = new Userinfo();
student.setUserId(UUID.randomUUID().toString());
student.setName(name);
student.setUsername(username);
student.setPassword("123qwe");
student.setSex(StringUtils.defaultString(sex));
student.setPhone(StringUtils.trimToEmpty(row.getPhone()));
student.setEmail(StringUtils.trimToEmpty(row.getEmail()));
student.setRole(4);
student.setTeacherAdmin(false);
student.setSchoolId(operator.getSchoolId());
student.setSchoolFacultyId(faculty.getSchoolFacultyId());
student.setSchoolMajorId(major.getSchoolMajorId());
student.setSchoolClassId(schoolClass.getSchoolClassId());
student.setCreateTime(new Date());
student.setCodeFrom("Excel导入");
students.add(student);
}
}
return students;
}
private boolean isBlankTeacherStudentImportRow(SchoolAdminStudentImportDTO row) {
if (row == null) {
return true;
}
return StringUtils.isBlank(row.getName())
&& StringUtils.isBlank(row.getUsername())
&& StringUtils.isBlank(row.getSex())
&& StringUtils.isBlank(row.getSchoolFacultyName())
&& StringUtils.isBlank(row.getSchoolMajorName())
&& StringUtils.isBlank(row.getSchoolClassName())
&& StringUtils.isBlank(row.getPhone())
&& StringUtils.isBlank(row.getEmail());
}
private String normalizeTeacherImportSex(String sex) {
String value = StringUtils.trimToEmpty(sex);
if (StringUtils.isBlank(value)) {
return "";
}
if ("1".equals(value) || "男".equals(value) || "男性".equals(value)) {
return "男";
}
if ("2".equals(value) || "女".equals(value) || "女性".equals(value)) {
return "女";
}
return null;
}
private boolean hasTeacherImportRowError(List<String> errors, int rowNumber) {
String prefix = "第" + rowNumber + "行:";
for (String error : errors) {
if (error.startsWith(prefix)) {
return true;
}
}
return false;
}
private SchoolFaculty findTeacherImportFaculty(String schoolId, String facultyName) {
SchoolFacultyExample example = new SchoolFacultyExample();
example.createCriteria()
.andSchoolIdEqualTo(schoolId)
.andSchoolFacultyNameEqualTo(facultyName);
List<SchoolFaculty> faculties = schoolFacultyMapper.selectByExample(example);
return faculties.isEmpty() ? null : faculties.get(0);
}
private SchoolMajor findTeacherImportMajor(String facultyId, String majorName) {
SchoolMajorExample example = new SchoolMajorExample();
example.createCriteria()
.andSchoolFacultyIdEqualTo(facultyId)
.andSchoolMajorNameEqualTo(majorName);
List<SchoolMajor> majors = schoolMajorMapper.selectByExample(example);
return majors.isEmpty() ? null : majors.get(0);
}
private SchoolClass findTeacherImportClass(String schoolId, String majorId, String className) {
SchoolClassExample example = new SchoolClassExample();
example.createCriteria()
.andSchoolIdEqualTo(schoolId)
.andSchoolMajorIdEqualTo(majorId)
.andClassNameEqualTo(className);
List<SchoolClass> classes = schoolClassMapper.selectByExample(example);
return classes.isEmpty() ? null : classes.get(0);
}
private List<String> parseSourceClassIds(String sourceClassIds) {
List<String> ids = new ArrayList<>();
if (StringUtils.isBlank(sourceClassIds)) {
return ids;
}
for (String sourceClassId : sourceClassIds.split(",")) {
String trimmed = StringUtils.trimToEmpty(sourceClassId);
if (StringUtils.isNotBlank(trimmed) && !ids.contains(trimmed)) {
ids.add(trimmed);
}
}
return ids;
}
private ResultEntity noManagePermission() {
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "权限不足");
}
private boolean isPlatformAdmin(Userinfo userInfo) {
return userInfo != null && Integer.valueOf(1).equals(userInfo.getRole());
}
private boolean canCreateSchoolClass(String operatorId, String schoolId, String classType) {
if (StringUtils.isAnyBlank(operatorId, schoolId, classType)) {
return false;
}
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (isPlatformAdmin(operator)) {
return !"ADMIN".equals(classType) || isAdminClassManagementEnabled(schoolId);
}
if (!Integer.valueOf(3).equals(operator == null ? null : operator.getRole())
|| !StringUtils.equals(operator.getSchoolId(), schoolId)) {
return false;
}
if ("TEACHING".equals(classType)) {
return true;
}
if ("ADMIN".equals(classType)) {
return isAdminClassManagementEnabled(schoolId);
}
return false;
}
private boolean isTeacherAdmin(Userinfo userInfo) {
return userInfo != null
&& Integer.valueOf(3).equals(userInfo.getRole())
&& Boolean.TRUE.equals(userInfo.getTeacherAdmin());
}
private boolean isSchoolTeacher(Userinfo userInfo) {
return userInfo != null
&& Integer.valueOf(3).equals(userInfo.getRole())
&& StringUtils.isNotBlank(userInfo.getSchoolId());
}
private boolean canManageAdminClass(Userinfo operator, SchoolClass schoolClass) {
if (operator == null || !isAdminClass(schoolClass)) {
return false;
}
if (isPlatformAdmin(operator)) {
return isAdminClassManagementEnabled(schoolClass.getSchoolId());
}
return isSchoolTeacher(operator)
&& StringUtils.equals(operator.getSchoolId(), schoolClass.getSchoolId())
&& isAdminClassManagementEnabled(schoolClass.getSchoolId());
}
private boolean canManageSchoolStructure(String operatorId, String schoolId) {
if (StringUtils.isAnyBlank(operatorId, schoolId)) {
return false;
}
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (isPlatformAdmin(operator)) {
return true;
}
return isTeacherAdmin(operator)
&& StringUtils.equals(operator.getSchoolId(), schoolId)
&& !isTeacherRosterMode(schoolId);
}
private boolean canManageFaculty(String operatorId, String schoolId) {
return hasSchoolStructureAuthority(operatorId, schoolId) && isFacultyManagementEnabled(schoolId);
}
private boolean canManageMajorStructure(String operatorId, String schoolId) {
return hasSchoolStructureAuthority(operatorId, schoolId) && isMajorManagementEnabled(schoolId);
}
private boolean hasSchoolStructureAuthority(String operatorId, String schoolId) {
if (StringUtils.isAnyBlank(operatorId, schoolId)) {
return false;
}
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
return isPlatformAdmin(operator)
|| (isTeacherAdmin(operator) && StringUtils.equals(operator.getSchoolId(), schoolId));
}
private boolean isFacultyManagementEnabled(String schoolId) {
return schoolProductConfigService != null && schoolProductConfigService.isFacultyManagementEnabled(schoolId);
}
private boolean isMajorManagementEnabled(String schoolId) {
return schoolProductConfigService != null && schoolProductConfigService.isMajorManagementEnabled(schoolId);
}
private boolean isAdminClassManagementEnabled(String schoolId) {
return schoolProductConfigService != null && schoolProductConfigService.isAdminClassManagementEnabled(schoolId);
}
private boolean isTeacherRosterMode(String schoolId) {
return schoolProductConfigService != null
&& schoolProductConfigService.isTeacherRosterManaged(schoolId);
}
private boolean canManageMajor(String operatorId, String schoolMajorId) {
if (StringUtils.isBlank(schoolMajorId)) {
return false;
}
SchoolMajor major = schoolMajorMapper.selectByPrimaryKey(schoolMajorId);
if (major == null || StringUtils.isBlank(major.getSchoolFacultyId())) {
return false;
}
SchoolFaculty faculty = schoolFacultyMapper.selectByPrimaryKey(major.getSchoolFacultyId());
return faculty != null && canManageMajorStructure(operatorId, faculty.getSchoolId());
}
private boolean teacherHasCreatedClass(String teacherId) {
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andCreatedByEqualTo(teacherId);
List<SchoolClass> classes = schoolClassMapper.selectByExample(example);
return classes != null && !classes.isEmpty();
}
private void markTeachersWithCreatedClasses(List<Userinfo> teachers) {
if (teachers == null || teachers.isEmpty()) {
return;
}
List<String> teacherIds = teachers.stream()
.map(Userinfo::getUserId)
.filter(StringUtils::isNotBlank)
.collect(java.util.stream.Collectors.toList());
if (teacherIds.isEmpty()) {
return;
}
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andCreatedByIn(teacherIds);
Set<String> 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())));
}
private boolean canOperateClass(String operatorId, String schoolClassId) {
Userinfo operator = userinfoMapper.selectByPrimaryKey(operatorId);
if (operator == null) {
return false;
}
if (Integer.valueOf(1).equals(operator.getRole())) {
return true;
}
if (!Integer.valueOf(3).equals(operator.getRole())) {
return false;
}
SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(schoolClassId);
if (canManageTeachingClass(operator, schoolClass)) {
return true;
}
if (canManageAdminClass(operator, schoolClass)) {
return true;
}
return isClassOwner(schoolClass, operatorId);
}
private boolean canOperateStudent(String operatorId, String studentId) {
return canOperateStudent(operatorId, studentId, null);
}
private boolean canOperateStudent(String operatorId, String studentId, String teachingClassId) {
Userinfo student = userinfoMapper.selectByPrimaryKey(studentId);
if (student == null || !Integer.valueOf(4).equals(student.getRole())) {
return false;
}
if (StringUtils.isNotBlank(teachingClassId)) {
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
return "TEACHING".equals(teachingClass == null ? null : teachingClass.getClassType())
&& canOperateClass(operatorId, teachingClassId)
&& teachingClassStudentMapper != null
&& teachingClassStudentMapper.countByStudentUserIdAndTeachingClassId(studentId, teachingClassId) > 0;
}
return canOperateClass(operatorId, student.getSchoolClassId());
}
@PostMapping("/selectCurrentTeachingClass")
@ApiOperation("学生-查询当前在读教学班")
@AnonymousAccess
public ResultEntity<SchoolClass> selectCurrentTeachingClass(@RequestParam String userId, HttpServletRequest request) {
try {
JwtUser currentUser = TokenProvider.getJWTUser(request);
if (currentUser != null && currentUser.getRoleId() == 4 && studentTeachingClassResolver != null) {
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(studentTeachingClassResolver.resolveRequired(currentUser));
return new ResultEntity<>(HttpStatus.OK, "查询成功", teachingClass);
}
} catch (RuntimeException ignored) {
// 保留旧版匿名调用的兼容路径。
}
TeachingClassStudent member = teachingClassStudentMapper == null
? null
: teachingClassStudentMapper.selectActiveByStudentUserId(userId);
if (member == null || StringUtils.isBlank(member.getTeachingClassId())) {
return new ResultEntity<>(HttpStatus.OK, "当前学生未分配在读教学班");
}
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(member.getTeachingClassId());
return new ResultEntity<>(HttpStatus.OK, "查询成功", teachingClass);
}
@ApiOperation("开放接口,自动同步学生信息")
@PostMapping("synchronizationStudentInfoByAuto")
@AnonymousAccess
public String synchronizationStudentInfoByAuto(@RequestBody List<ZYUserInfo> studentList) {
// JwtUser user = TokenProvider.getJWTUser(request);
return userInfoService.insertAllByAuto(studentList);
//return new ResultDataEntity(HttpStatus.OK);
}
1 year ago
}