diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseYearTermService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseYearTermService.java index 726b07f..d4da674 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseYearTermService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseYearTermService.java @@ -63,12 +63,12 @@ public class BaseYearTermService implements IBaseYearTermService { Date now = new Date(); List 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("获取学年失败,当前时间不在当学年时间范围")); } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchBinSchsystemService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchBinSchsystemService.java index 967c688..de3373c 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchBinSchsystemService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchBinSchsystemService.java @@ -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 schsystemIds= getSchBinSchsystemIds(schId); - //List baseSchsystems=baseSchsystemService.getSchsystemList().stream().filter(s->schsystemIds.contains(s.getId())).collect(Collectors.toList()); - List schBinSchsystemList= getSchBinSchsystemList(schId); + + Integer stuParentId =stuGroup.getId(); + Map 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 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 schAcademicStageList= comSchTreeService.getAcademicStageGroupList(schId); +// Optional 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); +// } + + + } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassImportService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassImportService.java index 7c094d9..c699236 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassImportService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassImportService.java @@ -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 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 createdGroupIds = new ArrayList<>(); - Map> 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 schsystemIdByAcademicStage=new HashMap<>(); + List 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 schAcademicStageList= comSchTreeService.getAcademicStageGroupList(schId); + Optional 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> schClassGroupMap = comSchTreeService.getSchGroupTypeList(user.getSchId(), NodeType.CLASS.getId()); - try (InputStream is = file.getInputStream()) { - List schTeacherList = schTeacherService.getSchTeacherList(user.getSchId()); - List gradeList = baseSchsystemGradeService.getGradeSelect(user.getSchId(), null, null); - List schClassList = cacheService.getSchClassCacheList(user.getSchId()); + List schTeacherList = schTeacherService.getSchTeacherList(schId); + List gradeList = baseSchsystemGradeService.getGradeSelect(schId, null, null); + List schClassList = cacheService.getSchClassCacheList(schId); List list; try { @@ -94,7 +125,10 @@ public class SchClassImportService { } List saveClassList = new ArrayList<>(); - int currentRow = params.getTitleRows() + params.getHeadRows() + 1; + Integer currentRow = params.getTitleRows() + params.getHeadRows() + 1; + // 同批导入时缓存已创建的年级组/班级组 ID,避免同一 Excel 多行重复推送平台组 + Map createdGradeCache = new HashMap<>(); + Map 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 nowYearGradeMap = baseSchsystemGradeService.getNowYearGradeMap(user.getSchId(), schsystemId); + + Map> schGradeGroupMap = comSchTreeService.getSchGroupTypeList(schId, NodeType.GRADE.getId()); + Map> schClassGroupMap = comSchTreeService.getSchGroupTypeList(schId, NodeType.CLASS.getId()); + List gradeGroupList = schGradeGroupMap.get(schsystemId); List 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 gradeNameToIdMap = gradeGroupList.stream() - .collect(Collectors.toMap(SelectIntVO::getName, SelectIntVO::getId, (a, b) -> a)); - Map 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 errorMsgArr = new ArrayList<>(); ImportParams params = new ImportParams(); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassInfoService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassInfoService.java index d9582ad..a70f7a1 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassInfoService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassInfoService.java @@ -146,6 +146,7 @@ public class SchClassInfoService { LogContextHolder.setDescription(content); } + // ---------- 编辑班级别名 ---------- public void editClassName(UserContext.UserInfo user, Integer id, String cname) { Integer schId = user.getSchId(); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java index cb97153..3e4610e 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java @@ -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 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 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(); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/SendUserBaseService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/SendUserBaseService.java index fd6692d..0c552b2 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/SendUserBaseService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/SendUserBaseService.java @@ -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