package com.yunhai.bschclassmanage.service.impl; import com.yunhai.bschclassmanage.Repository.SchBinSchsystemRepository; import com.yunhai.bschclassmanage.entity.BaseSchsystem; import com.yunhai.bschclassmanage.entity.SchBinSchsystem; 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.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.IBaseSchsystemGradeService; import com.yunhai.bschclassmanage.service.IBaseSchsystemService; import com.yunhai.bschclassmanage.service.ISchBinSchsystemService; import com.yunhai.bschclassmanage.service.ISyncUserBaseService; import com.yunhai.bschclassmanage.utils.RedisConstants; import com.yunhai.bschclassmanage.utils.RedisUtil; import com.yunhai.platform.utils.exception.DException; import com.yunhai.platform.utils.model.BoaGroup; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.persistence.criteria.Predicate; import java.lang.reflect.Array; import java.util.*; import java.util.stream.Collectors; @Service public class SchBinSchsystemService implements ISchBinSchsystemService { @Autowired private SchBinSchsystemRepository schBinSchsystemRepository; @Autowired private IBaseSchsystemService baseSchsystemService; @Autowired private ISyncUserBaseService syncUserBaseService; @Autowired private RedisUtil redisUtil; public List getSchBinSchsystemList(Integer schId){ Specification specification = (Specification) (root, criteriaQuery, criteriaBuilder) -> { List predicates = new ArrayList<>(); predicates.add(criteriaBuilder.equal(root.get(EntityFieldNames.schId),schId)); return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])); }; return schBinSchsystemRepository.findAll(specification); } public List getSchIds(){ return schBinSchsystemRepository.findAll().stream().map(s->s.getSchId()).distinct().collect(Collectors.toList()); } public List getSchBinSchsystemIds(Integer schId){ return getSchBinSchsystemList(schId).stream().map(s->s.getSchSystemId()).collect(Collectors.toList()); } /** * 获取学校关联的学段与学制映射(一个学段仅对应一个学制) * @param schId 学校ID * @return Map<学段ID, 学制ID> */ public Map getAcademicStageToSchsystemMap(Integer schId) { List schsystemIds = getSchBinSchsystemIds(schId); return baseSchsystemService.getSchsystemList().stream() .filter(s -> schsystemIds.contains(s.getId())) .collect(Collectors.toMap( BaseSchsystem::getAcademicStage, // key: 学段ID BaseSchsystem::getId, // value: 学制ID (existing, replacement) -> existing // 若有重复,保留第一个(理论上不会发生) )); } public List getAcademicStageSchsystemList(Integer schId) { List academicStageEnumList = AcademicStage.list(); List baseSchSystemList = baseSchsystemService.getSchsystemList(); Set checkedIdSet = new HashSet<>(getSchBinSchsystemIds(schId)); Map> groupByStage = baseSchSystemList.stream() .filter(s -> s.getAcademicStage() != null) .collect(Collectors.groupingBy(BaseSchsystem::getAcademicStage)); return academicStageEnumList.stream() .map(stageEnum -> { List stageSystems = groupByStage.getOrDefault(stageEnum.getKey(), Collections.emptyList()); List schSystemVOList = stageSystems.stream() .map(sys -> SchSystemVO.builder() .id(sys.getId()) .name(sys.getName()) .checked(checkedIdSet.contains(sys.getId())) .build()) .collect(Collectors.toList()); return AcademicStageSchsystemVO.builder() .academicStageId(stageEnum.getKey()) .academicStageName(stageEnum.getValue()) .academicStageList(schSystemVOList) .build(); }) .collect(Collectors.toList()); } @Transactional(rollbackFor = Exception.class) public void saveSchBinSchsystem(SchBinSchsystem entity, Integer[] schsystemIds) { Integer schId=entity.getSchId(); List existingList = getSchBinSchsystemList(schId); if (!existingList.isEmpty()) { schBinSchsystemRepository.deleteAll(existingList); } List newList = new ArrayList<>(schsystemIds.length); for (Integer systemId : schsystemIds) { if (systemId == null) { continue; } SchBinSchsystem newEntity = new SchBinSchsystem(); // ← 每次 new 一个新对象 // 如果需要复制 entity 的其他属性 BeanUtils.copyProperties(entity, newEntity); newEntity.setSchSystemId(systemId); newList.add(newEntity); } if (!newList.isEmpty()) { schBinSchsystemRepository.saveAll(newList); } String cacheKey = RedisConstants.SCHOOL_GRAGE+"_"+schId; SchGroupInitialization(schId); redisUtil.del(cacheKey); } //获取学校类型 public Integer getSchType(Integer schId) { Set schsystemIds = getSchBinSchsystemList(schId) .stream() .map(s -> s.getSchSystemId()) .collect(Collectors.toSet()); Set typeIds = baseSchsystemService.getSchsystemList() .stream() .filter(s -> schsystemIds.contains(s.getId())) .map(s -> s.getType()) .collect(Collectors.toSet()); // 校验:类型必须唯一 if (typeIds.isEmpty()) { throw new DException("该学校未绑定任何学制,请先绑定"); } if (typeIds.size() > 1) { throw new DException("该学校绑定了多种学制类型(" + typeIds + "),数据异常,请检查"); } // 此时 typeIds 仅有一个元素,直接获取 Integer typeId = typeIds.iterator().next(); if(typeId.equals(SchType.VOCATIONALEDUCATION.getKey())&&schsystemIds.size()>1){ throw new DException("该学校只能选择单个学制,请重新选择学制!"); } // 从枚举中匹配该 typeId return SchType.list().stream() .filter(s -> s.getKey().equals(typeId)) .findFirst() .orElseThrow(() -> new DException("未找到对应的学制类型,typeId=" + typeId)) .getKey(); } public List selectSchBinSchsystem(Integer schId) { // 1. 获取学校绑定的学制 ID 集合 List binList = getSchBinSchsystemList(schId); if (binList == null || binList.isEmpty()) { return Collections.emptyList(); } Set schsystemIds = binList.stream() .map(SchBinSchsystem::getSchSystemId) .collect(Collectors.toSet()); // 2. 获取全部学制并过滤出绑定的 List allSystems = baseSchsystemService.getSchsystemList(); if (allSystems == null || allSystems.isEmpty()) { return Collections.emptyList(); } // 3. 转换为 SchSystemVO 列表,checked 固定为 true return allSystems.stream() .filter(s -> schsystemIds.contains(s.getId())) .map(s -> { SelectIntVO vo = new SelectIntVO(); vo.setId(s.getId()); vo.setName(s.getName()); return vo; }) .collect(Collectors.toList()); } public Map getSchBinSchsystemMap(Integer schId) { List list= selectSchBinSchsystem(schId); return list.stream() .collect(Collectors.toMap( SelectIntVO::getId, // key SelectIntVO::getName, // value (oldVal, newVal) -> oldVal // 若key冲突,保留旧值(理论上不会冲突) )); } //学制树:第一层学段(value=学段id,title=学段名称),第二层学制(value=学制id,title=学制名称) public List selectSchsystemTree() { List cached = getAcademicStageSchsystemList(null); List list = new ArrayList<>(); for (AcademicStageSchsystemVO item : cached) { List children = new ArrayList<>(); if (item.getAcademicStageList() != null) { for (SchSystemVO sys : item.getAcademicStageList()) { children.add(TreeSelectVO.builder() .id(sys.getId()) .label(sys.getName()) .build()); } } list.add(TreeSelectVO.builder() .id(item.getAcademicStageId()) .label(item.getAcademicStageName()) .children(children) .build()); } return list; } private void SchGroupInitialization(Integer schId) { //添加学生组 BoaGroup teaGroup= syncUserBaseService.addGroup("教师组",schId,1,NodeType.TEACHER); BoaGroup stuGroup= syncUserBaseService.addGroup("学生组",schId,2,NodeType.STUDENT); //创建校长室 syncUserBaseService.addGroup("校长室", teaGroup.getId(),1,NodeType.NORMAL); //获取学制 List schsystemBinList=getSchBinSchsystemList(schId); Map schsystemMap=getSchBinSchsystemMap(schId); if(schsystemBinList.size()==1) { }else if(schsystemBinList.size()>1) { Integer scort=1; for (SchBinSchsystem schsystem:schsystemBinList) { //添加学段组 BoaGroup sectionGroup= syncUserBaseService.addGroup(schsystemMap.get(schsystem.getId()),stuGroup.getId(),scort,NodeType.SECTION); schsystem.setGroupId(sectionGroup.getId()); scort++; } }else { throw new DException("请选择学制!"); } } }