历史班级
This commit is contained in:
@@ -1089,9 +1089,11 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
}
|
||||
}
|
||||
|
||||
// 8. 生成所有年份节点
|
||||
// 8. 生成所有年份节点(上界取 max(当前学年, 最大入学年份),避免预建的未来届班级不出现在任何节点)
|
||||
List<SchSystemTreeVO> gradeNodes = new ArrayList<>();
|
||||
for (int year = currentYear ; year >=minYear ; year--) {
|
||||
int maxYear = classByYear.keySet().stream().mapToInt(Integer::intValue).max().orElse(currentYear);
|
||||
maxYear = Math.max(currentYear, maxYear);
|
||||
for (int year = maxYear; year >= minYear; year--) {
|
||||
List<SchClass> classList = classByYear.getOrDefault(year, Collections.emptyList());
|
||||
String gradeName = yearToGradeName.getOrDefault(year, year + "级");
|
||||
SchSystemTreeVO gradeNode = buildGradeNodeWithFullNameByYear(
|
||||
@@ -1110,7 +1112,8 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
List<SchClass> classList) {
|
||||
SchSystemTreeVO gradeNode = new SchSystemTreeVO();
|
||||
gradeNode.setId(enrollYear);
|
||||
gradeNode.setGradeId(enrollYear);
|
||||
// 年份节点表示"届"(入学年份),其所属年级取该届班级的真实年级ID(全班一致时有效),不再用年份冒充年级ID
|
||||
gradeNode.setGradeId(deriveCohortGradeId(classList));
|
||||
gradeNode.setEnrollYear(enrollYear);
|
||||
|
||||
// 计算毕业状态
|
||||
@@ -1126,7 +1129,11 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
if (graduation == 1) {
|
||||
displayName += "(已毕业)";
|
||||
} else {
|
||||
displayName += "(" + gradeName + ")";
|
||||
// 未推导出年级名(如未来届超出当前学年映射范围)时不再追加重复的"XX级"后缀
|
||||
boolean nameValid = StringUtils.isNotBlank(gradeName) && !gradeName.equals(enrollYear + "级");
|
||||
if (nameValid) {
|
||||
displayName += "(" + gradeName + ")";
|
||||
}
|
||||
}
|
||||
gradeNode.setName(displayName);
|
||||
gradeNode.setGraduation(graduation);
|
||||
@@ -1136,8 +1143,13 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
gradeNode.setExpand(true);
|
||||
|
||||
if (!CollectionUtils.isEmpty(classList)) {
|
||||
gradeNode.setChildren(classList.stream()
|
||||
.map(clazz -> buildClassNode(clazz, enrollYear, systemId, enrollYear))
|
||||
// 班级节点排序:按班级序号 sort 升序(班号顺序),与正常树一致;不依赖缓存列表(gradeId, sort)顺序
|
||||
List<SchClass> sortedClasses = classList.stream()
|
||||
.sorted(Comparator.comparing(SchClass::getSort, Comparator.nullsLast(Integer::compareTo)))
|
||||
.collect(Collectors.toList());
|
||||
// 班级节点 gradeId 传真实年级ID(clazz.getGradeId()),供前端按年级查学生/做操作
|
||||
gradeNode.setChildren(sortedClasses.stream()
|
||||
.map(clazz -> buildClassNode(clazz, clazz.getGradeId(), systemId, enrollYear))
|
||||
.collect(Collectors.toList()));
|
||||
} else {
|
||||
gradeNode.setChildren(Collections.emptyList());
|
||||
@@ -1145,6 +1157,22 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
return gradeNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 推导"届"节点(入学年份节点)的所属年级ID:
|
||||
* 取其下全部班级的真实年级ID,仅当所有班级一致时返回该值,否则返回 null(避免用年份冒充年级ID)
|
||||
*/
|
||||
private Integer deriveCohortGradeId(List<SchClass> classList) {
|
||||
if (CollectionUtils.isEmpty(classList)) {
|
||||
return null;
|
||||
}
|
||||
List<Integer> distinctGradeIds = classList.stream()
|
||||
.map(SchClass::getGradeId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
return distinctGradeIds.size() == 1 ? distinctGradeIds.get(0) : null;
|
||||
}
|
||||
|
||||
private SchSystemTreeVO buildVocationalTree(Integer schId) {
|
||||
// 1. 构建学校根节点
|
||||
SchSystemTreeVO root = buildSchoolRoot(schId);
|
||||
@@ -1183,10 +1211,12 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
return root;
|
||||
}
|
||||
|
||||
// 5. 生成年级节点(从 currentYear 倒序到 minYear)
|
||||
// 5. 生成年级节点(从最大年份倒序到 minYear;上界取 max(当前学年, 最大入学年份),避免预建的未来届班级丢失)
|
||||
List<SchSystemTreeVO> gradeNodes = new ArrayList<>();
|
||||
int maxYear = classByYear.keySet().stream().mapToInt(Integer::intValue).max().orElse(currentYear);
|
||||
maxYear = Math.max(currentYear, maxYear);
|
||||
// 职业教育学制通常为3年,但这里根据班级实际年份生成,毕业状态可按需计算
|
||||
for (int year = currentYear; year >= minYear; year--) {
|
||||
for (int year = maxYear; year >= minYear; year--) {
|
||||
List<SchClass> classList = classByYear.getOrDefault(year, Collections.emptyList());
|
||||
|
||||
// 计算毕业状态(按学校高职学制长度,与 getHigherSchGradeClassTree 保持一致)
|
||||
@@ -1197,7 +1227,8 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
// 构建年级节点
|
||||
SchSystemTreeVO gradeNode = new SchSystemTreeVO();
|
||||
gradeNode.setId(year);
|
||||
gradeNode.setGradeId(year);
|
||||
// 职业教育的年级模型即以入学年份作为年级ID,此处取班级真实 gradeId(与 enrollYear 一致),不再硬编码年份
|
||||
gradeNode.setGradeId(deriveCohortGradeId(classList));
|
||||
gradeNode.setEnrollYear(year);
|
||||
gradeNode.setName(year + "级");
|
||||
gradeNode.setGraduation(graduation);
|
||||
@@ -1207,9 +1238,12 @@ public class ComSchTreeService implements IComSchTreeService {
|
||||
|
||||
// 构建班级子节点(schsystemId 传 null,班级节点不依赖学制)
|
||||
if (!CollectionUtils.isEmpty(classList)) {
|
||||
Integer gradeYear=year;
|
||||
List<SchSystemTreeVO> classNodes = classList.stream()
|
||||
.map(clazz -> buildClassNode(clazz, gradeYear, null, gradeYear))
|
||||
// 班级节点排序:按班级序号 sort 升序(班号顺序)
|
||||
List<SchClass> sortedClasses = classList.stream()
|
||||
.sorted(Comparator.comparing(SchClass::getSort, Comparator.nullsLast(Integer::compareTo)))
|
||||
.collect(Collectors.toList());
|
||||
List<SchSystemTreeVO> classNodes = sortedClasses.stream()
|
||||
.map(clazz -> buildClassNode(clazz, clazz.getGradeId(), null, year))
|
||||
.collect(Collectors.toList());
|
||||
gradeNode.setChildren(classNodes);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user