学号等

This commit is contained in:
2026-08-26 19:36:38 +08:00
parent 8226f36cb5
commit 13409be869
9 changed files with 117 additions and 46 deletions
@@ -145,12 +145,11 @@ public class SchStudentController extends BaseController {
} }
@GetMapping("searchTransferOut") @GetMapping("searchTransferOut")
public PageVO<SchStudentVO> searchTransferOutStudent(@RequestParam(required = false) Integer schId, public PageVO<SchStudentVO> searchTransferOutStudent(@RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer classId, @RequestParam(required = false) Integer classId,
@RequestParam(required = false) String keyword, @RequestParam(required = false) String keyword,
Pageable pageable) { Pageable pageable) {
return schStudentService.searchTransferOutStudent(schId,gradeId,classId,keyword,pageable); return schStudentService.searchTransferOutStudent(UserContext.getSchId(),gradeId,classId,keyword,pageable);
} }
@@ -172,7 +171,6 @@ public class SchStudentController extends BaseController {
column.setGender("示例:男"); column.setGender("示例:男");
stuList.add(column); stuList.add(column);
} }
List<SelectIntVO> gradeList=baseSchsystemGradeService.getGradeSelect(schId,null,null) List<SelectIntVO> gradeList=baseSchsystemGradeService.getGradeSelect(schId,null,null)
.stream().collect(Collectors.toList()); .stream().collect(Collectors.toList());
@@ -222,7 +220,7 @@ public class SchStudentController extends BaseController {
} }
@GetMapping("studentClassNoTemplate") @GetMapping("studentClassNoTemplate")
public void studentClassNoTemplate(HttpServletResponse response, Integer schId, public void studentClassNoTemplate(HttpServletResponse response,Integer schId,
@RequestParam(required = false) Integer schsystemId, @RequestParam(required = false) Integer schsystemId,
@RequestParam(required = false) Integer gradeId, @RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer classId){ @RequestParam(required = false) Integer classId){
@@ -234,7 +232,7 @@ public class SchStudentController extends BaseController {
@RequestParam(required = false) Integer schsystemId, @RequestParam(required = false) Integer schsystemId,
@RequestParam(required = false) Integer gradeId, @RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer classId) { @RequestParam(required = false) Integer classId) {
schStudentService.importStudents(UserContext.getCurrentUser(),file); schStudentService.importStudents(UserContext.getCurrentUser(),file,schsystemId,gradeId,classId);
} }
@PostMapping("importStudentClassNo") @PostMapping("importStudentClassNo")
@@ -52,6 +52,13 @@ public interface ISchClassService {
String keyword, String keyword,
Pageable pageable); Pageable pageable);
List<HigherSchClassVO> searcHigherSchClass(Integer schId,
Integer year,
Integer campusId,
Integer divisionId,
Integer majorsId,
String keyword);
void saveHigherSchClass(UserContext.UserInfo user, SchClass entity); void saveHigherSchClass(UserContext.UserInfo user, SchClass entity);
@@ -3,6 +3,7 @@ package com.yunhai.bschclassmanage.service;
import com.yunhai.bschclassmanage.entity.BaseDicGrade; import com.yunhai.bschclassmanage.entity.BaseDicGrade;
import com.yunhai.bschclassmanage.entity.SchInfo; import com.yunhai.bschclassmanage.entity.SchInfo;
import com.yunhai.bschclassmanage.model.dto.SchInfoDto; import com.yunhai.bschclassmanage.model.dto.SchInfoDto;
import com.yunhai.bschclassmanage.model.vo.HigherSchClassVO;
import com.yunhai.bschclassmanage.model.vo.oa.SchInfoVO; import com.yunhai.bschclassmanage.model.vo.oa.SchInfoVO;
import com.yunhai.bschclassmanage.utils.UserContext; import com.yunhai.bschclassmanage.utils.UserContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -21,4 +22,10 @@ public interface ISchInfoService {
SchInfoVO GetSchFirst(Integer schId); SchInfoVO GetSchFirst(Integer schId);
void addSchool(UserContext.UserInfo user, SchInfoDto dto); void addSchool(UserContext.UserInfo user, SchInfoDto dto);
/**
* 查询高等教育班级列表(返回全部匹配的 VO 列表)
*/
List<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId, String keyword);
} }
@@ -56,7 +56,7 @@ public interface ISchStudentService {
List<SelectIntVO> transferOutSchSelect(); List<SelectIntVO> transferOutSchSelect();
void importStudents(UserContext.UserInfo user,MultipartFile file); void importStudents(UserContext.UserInfo user, MultipartFile file, Integer schsystemId, Integer gradeId, Integer classId);
void studentClassNoTemplate(HttpServletResponse response, Integer schId, Integer systemId, Integer gradeId, Integer classId); void studentClassNoTemplate(HttpServletResponse response, Integer schId, Integer systemId, Integer gradeId, Integer classId);
@@ -93,6 +93,12 @@ public class SchClassService implements ISchClassService {
return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId,keyword, pageable); return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId,keyword, pageable);
} }
@Override
public List<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId,String keyword) {
return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId,keyword);
}
@Override @Override
public List<SelectIntVO> getClassSelect(Integer schId, Integer gradeId) { public List<SelectIntVO> getClassSelect(Integer schId, Integer gradeId) {
return queryService.getClassSelect(schId, gradeId); return queryService.getClassSelect(schId, gradeId);
@@ -6,11 +6,13 @@ import com.yunhai.bschclassmanage.entity.SchInfo;
import com.yunhai.bschclassmanage.enums.NodeType; import com.yunhai.bschclassmanage.enums.NodeType;
import com.yunhai.bschclassmanage.model.dto.SchInfoDto; import com.yunhai.bschclassmanage.model.dto.SchInfoDto;
import com.yunhai.bschclassmanage.model.entityField.EntityFieldNames; import com.yunhai.bschclassmanage.model.entityField.EntityFieldNames;
import com.yunhai.bschclassmanage.model.vo.HigherSchClassVO;
import com.yunhai.bschclassmanage.model.vo.SelectIntVO; import com.yunhai.bschclassmanage.model.vo.SelectIntVO;
import com.yunhai.bschclassmanage.model.vo.oa.SchInfoVO; import com.yunhai.bschclassmanage.model.vo.oa.SchInfoVO;
import com.yunhai.bschclassmanage.service.IComSchTreeService; import com.yunhai.bschclassmanage.service.IComSchTreeService;
import com.yunhai.bschclassmanage.service.ISchInfoService; import com.yunhai.bschclassmanage.service.ISchInfoService;
import com.yunhai.bschclassmanage.service.ISendUserBaseService; import com.yunhai.bschclassmanage.service.ISendUserBaseService;
import com.yunhai.bschclassmanage.service.impl.classes.SchClassQueryService;
import com.yunhai.bschclassmanage.utils.LogContextHolder; import com.yunhai.bschclassmanage.utils.LogContextHolder;
import com.yunhai.bschclassmanage.utils.OtherUtil; import com.yunhai.bschclassmanage.utils.OtherUtil;
import com.yunhai.bschclassmanage.utils.RedisUtil; import com.yunhai.bschclassmanage.utils.RedisUtil;
@@ -44,6 +46,9 @@ public class SchInfoService implements ISchInfoService {
@Autowired @Autowired
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Autowired
private SchClassQueryService schClassQueryService;
public List<SchInfo> getSchList(){ public List<SchInfo> getSchList(){
return schInfoRepository.findAll(); return schInfoRepository.findAll();
} }
@@ -161,4 +166,10 @@ public class SchInfoService implements ISchInfoService {
LogContextHolder.setDescription("添加学校" + dto.getName() + "(初始化)成功"); LogContextHolder.setDescription("添加学校" + dto.getName() + "(初始化)成功");
} }
@Override
public List<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId, String keyword) {
return schClassQueryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId, keyword);
}
} }
@@ -125,8 +125,8 @@ public class SchStudentService implements ISchStudentService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void importStudents(UserContext.UserInfo user, MultipartFile file) { public void importStudents(UserContext.UserInfo user, MultipartFile file, Integer schsystemId, Integer gradeId, Integer classId) {
importService.importStudents(user, file); importService.importStudents(user, file, schsystemId, gradeId, classId);
} }
@Override @Override
@@ -203,6 +203,28 @@ public class SchClassQueryService {
return vo; return vo;
} }
/**
* 查询高等教育班级列表(不传分页,返回全部匹配的 VO 列表)
*/
public List<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId, String keyword) {
List<Integer> years = new ArrayList<>();
if (year != null && year > 0) years.add(year);
years = years.isEmpty() ? null : years;
Page<SchClass> classPage = schClassRepository.findClassesByConditions(schId, campusId, divisionId, majorsId, years, keyword, Pageable.unpaged());
Map<Integer, String> campusNameMap = schDicCampusService.toIdAndNameMap(schId);
Map<Integer, String> divisionsNameMap = schDicDivisionService.toIdAndNameMap(schId);
Map<Integer, String> majorssNameMap = schDicMajorsService.toIdAndNameMap(schId);
Map<Integer, String> teacherNameMap = schTeacherService.toIdAndNameMap(schId);
return classPage.getContent().stream()
.map(clazz -> convertHigherSchClassToVO(clazz, campusNameMap, divisionsNameMap, majorssNameMap,teacherNameMap))
.collect(Collectors.toList());
}
// ---------- 下拉列表 ---------- // ---------- 下拉列表 ----------
public List<SelectIntVO> getClassSelect(Integer schId, Integer gradeId) { public List<SelectIntVO> getClassSelect(Integer schId, Integer gradeId) {
List<SchClass> schClassList = getSchClassCacheFilter(schId, gradeId, null); List<SchClass> schClassList = getSchClassCacheFilter(schId, gradeId, null);
@@ -8,20 +8,15 @@ import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.yunhai.bschclassmanage.Repository.SchStudentRepository; import com.yunhai.bschclassmanage.Repository.SchStudentRepository;
import com.yunhai.bschclassmanage.entity.SchClass; import com.yunhai.bschclassmanage.entity.SchClass;
import com.yunhai.bschclassmanage.entity.SchStudent; import com.yunhai.bschclassmanage.entity.SchStudent;
import com.yunhai.bschclassmanage.enums.StuAbnormalStatus; import com.yunhai.bschclassmanage.enums.*;
import com.yunhai.bschclassmanage.enums.TransferStatus;
import com.yunhai.bschclassmanage.enums.UserGender;
import com.yunhai.bschclassmanage.enums.UserStatus;
import com.yunhai.bschclassmanage.model.dto.SchStudentDTO; import com.yunhai.bschclassmanage.model.dto.SchStudentDTO;
import com.yunhai.bschclassmanage.model.excel.ErrorExcelColumn; import com.yunhai.bschclassmanage.model.excel.ErrorExcelColumn;
import com.yunhai.bschclassmanage.model.excel.StudentClassNoExcelColumn; import com.yunhai.bschclassmanage.model.excel.StudentClassNoExcelColumn;
import com.yunhai.bschclassmanage.model.excel.StudentExcelColumn; import com.yunhai.bschclassmanage.model.excel.StudentExcelColumn;
import com.yunhai.bschclassmanage.model.vo.BaseSchClassVO; import com.yunhai.bschclassmanage.model.vo.BaseSchClassVO;
import com.yunhai.bschclassmanage.model.vo.HigherSchClassVO;
import com.yunhai.bschclassmanage.model.vo.SelectIntVO; import com.yunhai.bschclassmanage.model.vo.SelectIntVO;
import com.yunhai.bschclassmanage.service.IBaseSchsystemGradeService; import com.yunhai.bschclassmanage.service.*;
import com.yunhai.bschclassmanage.service.IComSchTreeService;
import com.yunhai.bschclassmanage.service.ISchClassService;
import com.yunhai.bschclassmanage.service.ISendUserBaseService;
import com.yunhai.bschclassmanage.utils.EasyPoiUtils; import com.yunhai.bschclassmanage.utils.EasyPoiUtils;
import com.yunhai.bschclassmanage.utils.UserContext; import com.yunhai.bschclassmanage.utils.UserContext;
import com.yunhai.bschclassmanage.utils.ValidateUtil; import com.yunhai.bschclassmanage.utils.ValidateUtil;
@@ -63,6 +58,8 @@ public class SchStudentImportService {
@Autowired @Autowired
private IComSchTreeService comSchTreeService; private IComSchTreeService comSchTreeService;
@Autowired
private ISchBinSchsystemService schBinSchsystemService;
@Autowired @Autowired
private ISendUserBaseService sendUserBaseService; private ISendUserBaseService sendUserBaseService;
@@ -76,7 +73,7 @@ public class SchStudentImportService {
/** /**
* 导入学生数据 * 导入学生数据
*/ */
public void importStudents(UserContext.UserInfo user, MultipartFile file) { public void importStudents(UserContext.UserInfo user, MultipartFile file, Integer schsystemId, Integer gradeId, Integer classId) {
List<ErrorExcelColumn> errorMsgArr = new ArrayList<>(); List<ErrorExcelColumn> errorMsgArr = new ArrayList<>();
ImportParams params = new ImportParams(); ImportParams params = new ImportParams();
params.setTitleRows(1); params.setTitleRows(1);
@@ -91,7 +88,7 @@ public class SchStudentImportService {
// 使用 try-with-resources 确保流关闭 // 使用 try-with-resources 确保流关闭
try (InputStream is = file.getInputStream()) { try (InputStream is = file.getInputStream()) {
// 1. 加载基础数据(放在 try 内,若加载失败也回滚) // 1. 加载基础数据(放在 try 内,若加载失败也回滚)
List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(schId, null, null); List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(schId, schsystemId, gradeId);
List<SchClass> schClassList = schClassService.getSchClassCacheList(schId); List<SchClass> schClassList = schClassService.getSchClassCacheList(schId);
Set<Integer> classIds = new HashSet<>(); Set<Integer> classIds = new HashSet<>();
@@ -161,7 +158,7 @@ public class SchStudentImportService {
} }
} }
Integer gradeId; Integer gradeId2;
// 年级 // 年级
{ {
Optional<Integer> gradeIdOpt = gradeList.stream() Optional<Integer> gradeIdOpt = gradeList.stream()
@@ -170,7 +167,11 @@ public class SchStudentImportService {
.findFirst(); .findFirst();
if (gradeIdOpt.isPresent()) { if (gradeIdOpt.isPresent()) {
gradeId = gradeIdOpt.get(); gradeId2 = gradeIdOpt.get();
if (gradeId != null && !gradeId2.equals(gradeId)) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getGradeName(), StudentExcelColumn.GRADE_NAME + "参数年级与模板年级不一致!"));
continue;
}
} else { } else {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getGradeName(), StudentExcelColumn.GRADE_NAME + "不存在!")); errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getGradeName(), StudentExcelColumn.GRADE_NAME + "不存在!"));
continue; continue;
@@ -179,9 +180,13 @@ public class SchStudentImportService {
// 班级 // 班级
{ {
Optional<SchClass> schClassOpt = schClassList.stream() Optional<SchClass> schClassOpt = schClassList.stream()
.filter(s -> gradeId.equals(s.getGradeId()) && s.getName().equals(item.getClazzName())) .filter(s -> gradeId2.equals(s.getGradeId()) && s.getName().equals(item.getClazzName()))
.findFirst(); .findFirst();
if (schClassOpt.isPresent()) { if (schClassOpt.isPresent()) {
if (classId != null && !schClassOpt.get().getClassId().equals(classId)) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "参数班级与模板班级不一致!"));
continue;
}
stu.setClassId(schClassOpt.get().getClassId()); stu.setClassId(schClassOpt.get().getClassId());
stu.setGroupId(schClassOpt.get().getClassId()); stu.setGroupId(schClassOpt.get().getClassId());
} else { } else {
@@ -397,18 +402,31 @@ public class SchStudentImportService {
List<SchStudent> schStudentList= cacheService.getSchGradeClassStudentCacheList(schId,systemId,gradeId,classId); List<SchStudent> schStudentList= cacheService.getSchGradeClassStudentCacheList(schId,systemId,gradeId,classId);
List<BaseSchClassVO> schClassdentList= schClassService.searcBaseSchClass(schId,systemId,gradeId,classId); // 班级信息映射(classId -> 年级名 / 班级名),按学校类型区分基础教育与职业教育
Integer schType=schBinSchsystemService.getSchType(schId);
Map<Integer, String> gradeNameMap = new HashMap<>();
Map<Integer, String> classNameMap = new HashMap<>();
if(SchType.BASICEDUCATION.getKey().equals(schType))
{
List<BaseSchClassVO> schClassdentList= schClassService.searcBaseSchClass(schId,systemId,gradeId,classId);
for (BaseSchClassVO clazz : schClassdentList) {
gradeNameMap.put(clazz.getClassId(), clazz.getGradeName());
classNameMap.put(clazz.getClassId(), clazz.getName());
}
}else {
List<HigherSchClassVO> schHigherClassdentList=schClassService.searcHigherSchClass(schId,gradeId,null,null,null,null);
for (HigherSchClassVO clazz : schHigherClassdentList) {
gradeNameMap.put(clazz.getClassId(), clazz.getGradeName());
classNameMap.put(clazz.getClassId(), clazz.getName());
}
}
for (SchStudent stu: schStudentList) for (SchStudent stu: schStudentList)
{ {
Optional<BaseSchClassVO> stuClassOpt= schClassdentList.stream()
.filter(s->s.getClassId().equals(stu.getClassId())).findFirst();
StudentClassNoExcelColumn column=new StudentClassNoExcelColumn(); StudentClassNoExcelColumn column=new StudentClassNoExcelColumn();
column.setGradeName(stuClassOpt.isPresent()?stuClassOpt.get().getGradeName():"未知"); column.setGradeName(gradeNameMap.getOrDefault(stu.getClassId(), "未知"));
column.setClazzName(stuClassOpt.isPresent()?stuClassOpt.get().getName():"未知"); column.setClazzName(classNameMap.getOrDefault(stu.getClassId(), "未知"));
column.setStuName(stu.getName()); column.setStuName(stu.getName());
column.setAccount(stu.getAccount()); column.setAccount(stu.getAccount());
column.setClazzNo(stu.getStuClassNo()); column.setClazzNo(stu.getStuClassNo());
@@ -531,30 +549,32 @@ public class SchStudentImportService {
} }
} }
// 班级 // 班级(按学校类型区分班级来源:基础教育走班级缓存,职业教育走高等教育班级查询)
{ {
Integer matchClassId = null;
Optional<SchClass> schClassOpt = schClassList.stream() Optional<SchClass> schClassOpt = schClassList.stream()
.filter(s -> gradeId2.equals(s.getGradeId()) && s.getName().equals(item.getClazzName())) .filter(s -> gradeId2.equals(s.getGradeId()) && s.getName().equals(item.getClazzName()))
.findFirst(); .findFirst();
if (schClassOpt.isPresent()) { if (schClassOpt.isPresent()) {
if(classId!=null){ matchClassId = schClassOpt.get().getClassId();
if(!schClassOpt.get().getClassId().equals(classId)){ }
if (matchClassId == null) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "不存在!"));
currentRow++;
continue;
}
if (classId != null && !matchClassId.equals(classId)) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "参数班级与模板班级不一致!")); errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "参数班级与模板班级不一致!"));
currentRow++; currentRow++;
continue; continue;
} }
}
// 学生当前班级必须与模板班级一致,避免改错其他班级学生的学号 // 学生当前班级必须与模板班级一致,避免改错其他班级学生的学号
if (!Objects.equals(stu.getClassId(), schClassOpt.get().getClassId())) { if (!Objects.equals(stu.getClassId(), matchClassId)) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), "学生当前班级与模板班级不一致!")); errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), "学生当前班级与模板班级不一致!"));
currentRow++; currentRow++;
continue; continue;
} }
} else {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "不存在!"));
currentRow++;
continue;
}
} }
// 学号(为空时保留原学号,避免误清空) // 学号(为空时保留原学号,避免误清空)