This commit is contained in:
2026-08-25 11:56:38 +08:00
parent 505a47d048
commit da148823a7
6 changed files with 150 additions and 33 deletions
@@ -63,12 +63,12 @@ public class BaseYearTermService implements IBaseYearTermService {
Date now = new Date();
List<BaseYearTerm> yearTermList = getAllYearTerm();
if (yearTermList == null || yearTermList.isEmpty()) {
return null;
throw new DException("获取学年失败,当前时间不在当学年时间范围");
}
return yearTermList.stream()
.filter(s -> s.getYearStartDate().compareTo(now) <= 0 && s.getYearEndDate().compareTo(now) >= 0)
.findFirst()
.orElse(null);
.orElseThrow(() -> new DException("获取学年失败,当前时间不在当学年时间范围"));
}
@@ -7,13 +7,12 @@ import com.yunhai.bschclassmanage.enums.AcademicStage;
import com.yunhai.bschclassmanage.enums.NodeType;
import com.yunhai.bschclassmanage.enums.SchType;
import com.yunhai.bschclassmanage.model.entityField.EntityFieldNames;
import com.yunhai.bschclassmanage.model.tool.YearTerm;
import com.yunhai.bschclassmanage.model.vo.AcademicStageSchsystemVO;
import com.yunhai.bschclassmanage.model.vo.SchSystemVO;
import com.yunhai.bschclassmanage.model.vo.SelectIntVO;
import com.yunhai.bschclassmanage.model.vo.TreeSelectVO;
import com.yunhai.bschclassmanage.service.IBaseSchsystemService;
import com.yunhai.bschclassmanage.service.ISchBinSchsystemService;
import com.yunhai.bschclassmanage.service.ISendUserBaseService;
import com.yunhai.bschclassmanage.service.*;
import com.yunhai.bschclassmanage.utils.RedisConstants;
import com.yunhai.bschclassmanage.utils.RedisUtil;
import com.yunhai.platform.utils.exception.DException;
@@ -40,6 +39,10 @@ public class SchBinSchsystemService implements ISchBinSchsystemService {
@Autowired
private ISendUserBaseService sendUserBaseService;
@Autowired
private IBaseSchsystemGradeService baseSchsystemGradeService;
@Autowired
private RedisUtil redisUtil;
@@ -252,12 +255,13 @@ public class SchBinSchsystemService implements ISchBinSchsystemService {
//获取学段
List<Integer> schsystemIds= getSchBinSchsystemIds(schId);
//List<BaseSchsystem> baseSchsystems=baseSchsystemService.getSchsystemList().stream().filter(s->schsystemIds.contains(s.getId())).collect(Collectors.toList());
List<SchBinSchsystem> schBinSchsystemList= getSchBinSchsystemList(schId);
Integer stuParentId =stuGroup.getId();
Map<Integer,Integer> schsystemIdByAcademicStage=new HashMap<>();
if(newList.size()==1)
{
schsystemIdByAcademicStage.put(schsystemIds.get(0),stuParentId);
}else if(newList.size()>1)
{
Integer scort=1;
@@ -265,12 +269,43 @@ public class SchBinSchsystemService implements ISchBinSchsystemService {
String academicStageName= baseSchsystemService.getAcademicStageName(schsystem.getSchSystemId());
BoaGroup sectionGroup= sendUserBaseService.addGroup(academicStageName,stuGroup.getId(),scort,NodeType.SECTION,schId);
schsystem.setGroupId(sectionGroup.getId());
schsystemIdByAcademicStage.put(schsystem.getSchSystemId(),sectionGroup.getId());
scort++;
}
}else {
throw new DException("请选择学制!");
}
for (Integer schsystemId:schsystemIds)
{
stuParentId=schsystemIdByAcademicStage.get(schsystemId);
Set<Integer> years= baseSchsystemGradeService.getNowYearGradeMap(schId,schsystemId).keySet();
for (Integer year:years){
sendUserBaseService.addGroup(year.toString(),stuParentId,schsystemId,NodeType.GRADE,schId);
}
}
//
// if(schsystemIds.size()>1)
// {
// for (Integer schsystemId:schsystemIds){
// String academicStageName= baseSchsystemService.getAcademicStageName(schsystemId);
// List<BoaGroup> schAcademicStageList= comSchTreeService.getAcademicStageGroupList(schId);
// Optional<BoaGroup> academicStageFirst= schAcademicStageList.stream().filter(s->Objects.equals(s.getName(),academicStageName)).findFirst();
// if(!academicStageFirst.isPresent())
// {
// BoaGroup academicGroup= sendUserBaseService.addGroup(academicStageName,stuGroup.getId(),schsystemId,NodeType.SECTION,schId);
// stuParentId=academicGroup.getId();
// }else {
// stuParentId=academicStageFirst.get().getId();
// }
// schsystemIdByAcademicStage.put(schsystemId,stuParentId);
// }
// }else {
// schsystemIdByAcademicStage.put(schsystemIds.get(0),stuParentId);
// }
}
@@ -16,6 +16,7 @@ import com.yunhai.bschclassmanage.utils.UserContext;
import com.yunhai.bschclassmanage.utils.ValidationUtil;
import com.yunhai.platform.utils.exception.DException;
import com.yunhai.platform.utils.exception.ErrorCode;
import com.yunhai.platform.utils.model.BoaGroup;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -63,6 +64,12 @@ public class SchClassImportService {
@Autowired
private SchClassLogService logService;
@Autowired
private ISendUserBaseService sendUserBaseService;
@Autowired
private IBaseSchsystemService baseSchsystemService;
public void importClasses(UserContext.UserInfo user, MultipartFile file) {
List<ErrorExcelColumn> errorMsgArr = new ArrayList<>();
@@ -70,17 +77,41 @@ public class SchClassImportService {
params.setTitleRows(1);
params.setHeadRows(1);
Date now = new Date();
Integer schId = user.getSchId();
List<Integer> createdGroupIds = new ArrayList<>();
Map<Integer, List<SelectIntVO>> schGradeGroupMap = comSchTreeService.getSchGroupTypeList(user.getSchId(), NodeType.GRADE.getId());
if (schGradeGroupMap.isEmpty()) {
throw new DException("该学制下没有年级组,请先同步年级组数据!");
BoaGroup stuGroup= comSchTreeService.getStuTree(schId,false);
if(stuGroup==null){
throw new DException("学生组不存在!");
}
Integer stuParentId =stuGroup.getId();
Map<Integer,Integer> schsystemIdByAcademicStage=new HashMap<>();
List<Integer> schsystemIds= schBinSchsystemService.getSchBinSchsystemIds(schId);
//创建学段
if(schBinSchsystemService.getSchBinSchsystemIds(schId).size()==1)
{
schsystemIdByAcademicStage.put(schsystemIds.get(0),stuParentId);
}else {
for (Integer schsystemId:schsystemIds){
String academicStageName= baseSchsystemService.getAcademicStageName(schsystemId);
List<BoaGroup> schAcademicStageList= comSchTreeService.getAcademicStageGroupList(schId);
Optional<BoaGroup> academicStageFirst= schAcademicStageList.stream().filter(s->Objects.equals(s.getName(),academicStageName)).findFirst();
if(!academicStageFirst.isPresent())
{
BoaGroup academicGroup= sendUserBaseService.addGroup(academicStageName,stuGroup.getId(),schsystemId,NodeType.SECTION,schId);
createdGroupIds.add(academicGroup.getId());
stuParentId=academicGroup.getId();
}else {
stuParentId=academicStageFirst.get().getId();
}
schsystemIdByAcademicStage.put(schsystemId,stuParentId);
}
}
Map<Integer, List<SelectIntVO>> schClassGroupMap = comSchTreeService.getSchGroupTypeList(user.getSchId(), NodeType.CLASS.getId());
try (InputStream is = file.getInputStream()) {
List<SchTeacher> schTeacherList = schTeacherService.getSchTeacherList(user.getSchId());
List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(user.getSchId(), null, null);
List<SchClass> schClassList = cacheService.getSchClassCacheList(user.getSchId());
List<SchTeacher> schTeacherList = schTeacherService.getSchTeacherList(schId);
List<SelectIntVO> gradeList = baseSchsystemGradeService.getGradeSelect(schId, null, null);
List<SchClass> schClassList = cacheService.getSchClassCacheList(schId);
List<SchClassExcelColumn> list;
try {
@@ -94,7 +125,10 @@ public class SchClassImportService {
}
List<SchClass> saveClassList = new ArrayList<>();
int currentRow = params.getTitleRows() + params.getHeadRows() + 1;
Integer currentRow = params.getTitleRows() + params.getHeadRows() + 1;
// 同批导入时缓存已创建的年级组/班级组 ID,避免同一 Excel 多行重复推送平台组
Map<String, Integer> createdGradeCache = new HashMap<>();
Map<String, Integer> createdClassCache = new HashMap<>();
for (SchClassExcelColumn item : list) {
SchClass clazz = new SchClass();
// 年级
@@ -110,7 +144,12 @@ public class SchClassImportService {
clazz.setGradeId(gradeId);
Integer schsystemId = baseSchsystemGradeService.getSchsystemIdByGradeId(user.getSchId(), gradeId);
Map<Integer, Integer> nowYearGradeMap = baseSchsystemGradeService.getNowYearGradeMap(user.getSchId(), schsystemId);
Map<Integer, List<SelectIntVO>> schGradeGroupMap = comSchTreeService.getSchGroupTypeList(schId, NodeType.GRADE.getId());
Map<Integer, List<SelectIntVO>> schClassGroupMap = comSchTreeService.getSchGroupTypeList(schId, NodeType.CLASS.getId());
List<SelectIntVO> gradeGroupList = schGradeGroupMap.get(schsystemId);
List<SelectIntVO> classGroupList = schClassGroupMap.get(schsystemId);
@@ -132,22 +171,47 @@ public class SchClassImportService {
}
clazz.setCreateDate(now);
clazz.setCreateUserId(user.getUserId());
clazz.setSchId(user.getSchId());
clazz.setSchId(schId);
clazz.setSort(sort);
String code = year.toString() + String.format("%02d", sort);
clazz.setCode(code);
clazz.setName(clazzName);
clazz.setGraduate(false);
clazz.setEnrollYear(year);
clazz.setGroupId(0);
clazz.setClassId(0);
Map<String, Integer> gradeNameToIdMap = gradeGroupList.stream()
.collect(Collectors.toMap(SelectIntVO::getName, SelectIntVO::getId, (a, b) -> a));
Map<String, Integer> classNameToIdMap = classGroupList.stream()
.collect(Collectors.toMap(SelectIntVO::getName, SelectIntVO::getId, (a, b) -> a));
clazz.setGroupId(gradeNameToIdMap.getOrDefault(year.toString(), 0));
clazz.setClassId(classNameToIdMap.getOrDefault(clazz.getCode(), 0));
// 参考 addBaseSchClass:先定位年级组(parentId),缺失则推送平台创建;
// 优先查快照,再查本批已创建缓存,避免同一 Excel 多行重复创建同名组
Integer parentId = (gradeGroupList == null) ? null
: gradeGroupList.stream()
.filter(s -> Objects.equals(year.toString(), s.getName()))
.map(SelectIntVO::getId).findFirst().orElse(null);
if (parentId == null) {
parentId = createdGradeCache.get(schsystemId + "_" + year);
}
if (parentId == null || parentId == 0) {
BoaGroup gradeGroup = sendUserBaseService.addGroup(year.toString(), schsystemIdByAcademicStage.get(schsystemId), year, NodeType.GRADE, schId);
parentId = gradeGroup.getId();
createdGroupIds.add(parentId);
createdGradeCache.put(schsystemId + "_" + year, parentId);
}
clazz.setGroupId(parentId);
// 班级组推送平台,classId 取平台组 ID(与 addBaseSchClass 一致);同理防重复创建
Integer existClassId = (classGroupList == null) ? null
: classGroupList.stream()
.filter(s -> Objects.equals(code, s.getName()))
.map(SelectIntVO::getId).findFirst().orElse(null);
if (existClassId == null) {
existClassId = createdClassCache.get(code);
}
if (existClassId != null && existClassId > 0) {
clazz.setClassId(existClassId);
} else {
BoaGroup classGroup = sendUserBaseService.addGroup(code, parentId, sort, NodeType.CLASS, schId);
clazz.setClassId(classGroup.getId());
createdGroupIds.add(classGroup.getId());
createdClassCache.put(code, classGroup.getId());
}
}
clazz.setCname(item.getClazzCName());
@@ -205,12 +269,23 @@ public class SchClassImportService {
} catch (DException e) {
throw e;
} catch (Exception e) {
// 导入失败:回滚已成功推送到平台的班级组/年级组,避免孤儿组
for (Integer groupId : createdGroupIds) {
try {
sendUserBaseService.deleteGroup(groupId, schId);
} catch (Exception ignore) {
log.error("回滚平台组失败 groupId={}", groupId, ignore);
}
}
log.error("导入班级时发生系统异常,操作人:" + user.getUserName(), e);
throw new DException(ErrorCode.CUSTOM,"导入失败,请联系管理员",null,e);
}
}
public void importHeightClasses(UserContext.UserInfo user, MultipartFile file) {
List<ErrorExcelColumn> errorMsgArr = new ArrayList<>();
ImportParams params = new ImportParams();
@@ -146,6 +146,7 @@ public class SchClassInfoService {
LogContextHolder.setDescription(content);
}
// ---------- 编辑班级别名 ----------
public void editClassName(UserContext.UserInfo user, Integer id, String cname) {
Integer schId = user.getSchId();
@@ -974,7 +974,7 @@ public class ComSchTreeService implements IComSchTreeService {
//-------------
public SchSystemTreeVO getClassHistoryTree(Integer schId) {
if(schBinSchsystemService.getSchType(schId).equals(SchType.BASICEDUCATION.getKey()))
if(SchType.BASICEDUCATION.getKey().equals(schBinSchsystemService.getSchType(schId)))
{
return getGradeClassTreeWithFullName(schId);
}else {
@@ -1059,7 +1059,8 @@ public class ComSchTreeService implements IComSchTreeService {
int year = startYear + i;
if (year >= minYear && year <= currentYear) {
// 如果年级列表有该索引,使用名称;否则用默认
String name = (i < gradeNameList.size()) ? gradeNameList.get(i) : (i + 1) + "年级";
// gradeNameList 按 gradeId 倒序(最高年级在前),而年份从低到高,索引需反向取
String name = (i < gradeNameList.size()) ? gradeNameList.get(gradeNameList.size() - 1 - i) : (i + 1) + "年级";
yearToGradeName.put(year, name);
}
}
@@ -1149,6 +1150,12 @@ public class ComSchTreeService implements IComSchTreeService {
SchSystemTreeVO root = buildSchoolRoot(schId);
root.setExpand(true);
// 高职学制长度(按学校专业最大学制,与 getHigherSchGradeClassTree 保持一致;无则默认3)
Integer majorLeng = schDicMajorsRepository.findMaxSchsystemLengBySchId(schId).orElse(0);
if (majorLeng == null || majorLeng <= 0) {
majorLeng = 3;
}
// 2. 获取该校所有班级
List<SchClass> allClasses = schClassService.getSchAllClassCacheList(schId);
if (CollectionUtils.isEmpty(allClasses)) {
@@ -1175,12 +1182,10 @@ public class ComSchTreeService implements IComSchTreeService {
for (int year = currentYear; year >= minYear; year--) {
List<SchClass> classList = classByYear.getOrDefault(year, Collections.emptyList());
// 计算毕业状态(假设学制3年,可根据实际调整)
// 计算毕业状态(按学校高职学制长度,与 getHigherSchGradeClassTree 保持一致)
int graduation = 0;
if (year >0) {
Integer graduationYear = year + 3; // 3年制
graduation = (currentYear >= graduationYear) ? 1 : 0;
}
Integer graduationYear = year + majorLeng;
graduation = (currentYear >= graduationYear) ? 1 : 0;
// 构建年级节点
SchSystemTreeVO gradeNode = new SchSystemTreeVO();
@@ -22,6 +22,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
//SendUserBase