学号等

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")
public PageVO<SchStudentVO> searchTransferOutStudent(@RequestParam(required = false) Integer schId,
@RequestParam(required = false) Integer gradeId,
public PageVO<SchStudentVO> searchTransferOutStudent(@RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer classId,
@RequestParam(required = false) String keyword,
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("示例:男");
stuList.add(column);
}
List<SelectIntVO> gradeList=baseSchsystemGradeService.getGradeSelect(schId,null,null)
.stream().collect(Collectors.toList());
@@ -234,7 +232,7 @@ public class SchStudentController extends BaseController {
@RequestParam(required = false) Integer schsystemId,
@RequestParam(required = false) Integer gradeId,
@RequestParam(required = false) Integer classId) {
schStudentService.importStudents(UserContext.getCurrentUser(),file);
schStudentService.importStudents(UserContext.getCurrentUser(),file,schsystemId,gradeId,classId);
}
@PostMapping("importStudentClassNo")
@@ -52,6 +52,13 @@ public interface ISchClassService {
String keyword,
Pageable pageable);
List<HigherSchClassVO> searcHigherSchClass(Integer schId,
Integer year,
Integer campusId,
Integer divisionId,
Integer majorsId,
String keyword);
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.SchInfo;
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.utils.UserContext;
import org.springframework.stereotype.Service;
@@ -21,4 +22,10 @@ public interface ISchInfoService {
SchInfoVO GetSchFirst(Integer schId);
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();
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);
@@ -93,6 +93,12 @@ public class SchClassService implements ISchClassService {
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
public List<SelectIntVO> getClassSelect(Integer schId, Integer 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.model.dto.SchInfoDto;
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.oa.SchInfoVO;
import com.yunhai.bschclassmanage.service.IComSchTreeService;
import com.yunhai.bschclassmanage.service.ISchInfoService;
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.OtherUtil;
import com.yunhai.bschclassmanage.utils.RedisUtil;
@@ -44,6 +46,9 @@ public class SchInfoService implements ISchInfoService {
@Autowired
private RedisUtil redisUtil;
@Autowired
private SchClassQueryService schClassQueryService;
public List<SchInfo> getSchList(){
return schInfoRepository.findAll();
}
@@ -161,4 +166,10 @@ public class SchInfoService implements ISchInfoService {
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)
@Override
public void importStudents(UserContext.UserInfo user, MultipartFile file) {
importService.importStudents(user, file);
public void importStudents(UserContext.UserInfo user, MultipartFile file, Integer schsystemId, Integer gradeId, Integer classId) {
importService.importStudents(user, file, schsystemId, gradeId, classId);
}
@Override
@@ -203,6 +203,28 @@ public class SchClassQueryService {
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) {
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.entity.SchClass;
import com.yunhai.bschclassmanage.entity.SchStudent;
import com.yunhai.bschclassmanage.enums.StuAbnormalStatus;
import com.yunhai.bschclassmanage.enums.TransferStatus;
import com.yunhai.bschclassmanage.enums.UserGender;
import com.yunhai.bschclassmanage.enums.UserStatus;
import com.yunhai.bschclassmanage.enums.*;
import com.yunhai.bschclassmanage.model.dto.SchStudentDTO;
import com.yunhai.bschclassmanage.model.excel.ErrorExcelColumn;
import com.yunhai.bschclassmanage.model.excel.StudentClassNoExcelColumn;
import com.yunhai.bschclassmanage.model.excel.StudentExcelColumn;
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.service.IBaseSchsystemGradeService;
import com.yunhai.bschclassmanage.service.IComSchTreeService;
import com.yunhai.bschclassmanage.service.ISchClassService;
import com.yunhai.bschclassmanage.service.ISendUserBaseService;
import com.yunhai.bschclassmanage.service.*;
import com.yunhai.bschclassmanage.utils.EasyPoiUtils;
import com.yunhai.bschclassmanage.utils.UserContext;
import com.yunhai.bschclassmanage.utils.ValidateUtil;
@@ -63,6 +58,8 @@ public class SchStudentImportService {
@Autowired
private IComSchTreeService comSchTreeService;
@Autowired
private ISchBinSchsystemService schBinSchsystemService;
@Autowired
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<>();
ImportParams params = new ImportParams();
params.setTitleRows(1);
@@ -91,7 +88,7 @@ public class SchStudentImportService {
// 使用 try-with-resources 确保流关闭
try (InputStream is = file.getInputStream()) {
// 1. 加载基础数据(放在 try 内,若加载失败也回滚)
List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(schId, null, null);
List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(schId, schsystemId, gradeId);
List<SchClass> schClassList = schClassService.getSchClassCacheList(schId);
Set<Integer> classIds = new HashSet<>();
@@ -161,7 +158,7 @@ public class SchStudentImportService {
}
}
Integer gradeId;
Integer gradeId2;
// 年级
{
Optional<Integer> gradeIdOpt = gradeList.stream()
@@ -170,7 +167,11 @@ public class SchStudentImportService {
.findFirst();
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 {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getGradeName(), StudentExcelColumn.GRADE_NAME + "不存在!"));
continue;
@@ -179,9 +180,13 @@ public class SchStudentImportService {
// 班级
{
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();
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.setGroupId(schClassOpt.get().getClassId());
} else {
@@ -397,18 +402,31 @@ public class SchStudentImportService {
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)
{
Optional<BaseSchClassVO> stuClassOpt= schClassdentList.stream()
.filter(s->s.getClassId().equals(stu.getClassId())).findFirst();
StudentClassNoExcelColumn column=new StudentClassNoExcelColumn();
column.setGradeName(stuClassOpt.isPresent()?stuClassOpt.get().getGradeName():"未知");
column.setClazzName(stuClassOpt.isPresent()?stuClassOpt.get().getName():"未知");
column.setGradeName(gradeNameMap.getOrDefault(stu.getClassId(), "未知"));
column.setClazzName(classNameMap.getOrDefault(stu.getClassId(), "未知"));
column.setStuName(stu.getName());
column.setAccount(stu.getAccount());
column.setClazzNo(stu.getStuClassNo());
@@ -531,30 +549,32 @@ public class SchStudentImportService {
}
}
// 班级
// 班级(按学校类型区分班级来源:基础教育走班级缓存,职业教育走高等教育班级查询)
{
Integer matchClassId = null;
Optional<SchClass> schClassOpt = schClassList.stream()
.filter(s -> gradeId2.equals(s.getGradeId()) && s.getName().equals(item.getClazzName()))
.findFirst();
if (schClassOpt.isPresent()) {
if(classId!=null){
if(!schClassOpt.get().getClassId().equals(classId)){
matchClassId = schClassOpt.get().getClassId();
}
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 + "参数班级与模板班级不一致!"));
currentRow++;
continue;
}
}
// 学生当前班级必须与模板班级一致,避免改错其他班级学生的学号
if (!Objects.equals(stu.getClassId(), schClassOpt.get().getClassId())) {
if (!Objects.equals(stu.getClassId(), matchClassId)) {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), "学生当前班级与模板班级不一致!"));
currentRow++;
continue;
}
} else {
errorMsgArr.add(new ErrorExcelColumn(currentRow, item.getClazzName(), StudentExcelColumn.CLAZZ_NAME + "不存在!"));
currentRow++;
continue;
}
}
// 学号(为空时保留原学号,避免误清空)