You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
1 year ago
|
package cn.teammodel.service.impl;
|
||
|
|
||
1 year ago
|
import cn.teammodel.common.PK;
|
||
|
import cn.teammodel.dao.EvaluationRepository;
|
||
|
import cn.teammodel.model.dto.GetEvaluateTreeDto;
|
||
|
import cn.teammodel.model.entity.Evaluation;
|
||
1 year ago
|
import cn.teammodel.model.entity.EvaluationTreeNode;
|
||
1 year ago
|
import cn.teammodel.service.EvaluationService;
|
||
|
import org.apache.commons.lang3.ObjectUtils;
|
||
1 year ago
|
import org.apache.commons.lang3.StringUtils;
|
||
1 year ago
|
import org.springframework.stereotype.Service;
|
||
1 year ago
|
|
||
1 year ago
|
import javax.annotation.Resource;
|
||
1 year ago
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
|
||
|
/**
|
||
|
* @author winter
|
||
|
* @create 2023-11-20 17:47
|
||
|
*/
|
||
1 year ago
|
@Service
|
||
|
public class EvaluationServiceImpl implements EvaluationService {
|
||
|
@Resource
|
||
|
private EvaluationRepository evaluationRepository;
|
||
|
|
||
|
@Override
|
||
|
public List<EvaluationTreeNode> getTree(GetEvaluateTreeDto getEvaluateTreeDto) {
|
||
|
String schoolId = getEvaluateTreeDto.getSchoolId();
|
||
|
String periodId = getEvaluateTreeDto.getPeriodId();
|
||
|
periodId = StringUtils.isEmpty(periodId) ? "default" : periodId;
|
||
|
|
||
|
Evaluation evaluation = evaluationRepository.findBySchoolIdAndPeriodId(schoolId, periodId, PK.PK_SCHOOL);
|
||
|
List<EvaluationTreeNode> nodes = evaluation.getNodes();
|
||
|
List<EvaluationTreeNode> trees = this.buildTree(nodes);
|
||
|
evaluation.setNodes(trees);
|
||
|
return trees;
|
||
|
}
|
||
1 year ago
|
|
||
|
@Override
|
||
|
public List<EvaluationTreeNode> buildTree(List<EvaluationTreeNode> nodes) {
|
||
|
List<EvaluationTreeNode> parents = new ArrayList<>();
|
||
|
// pid 为 null 或者 "" 则为 parents
|
||
|
for (EvaluationTreeNode node : nodes) {
|
||
|
if (StringUtils.isBlank(node.getPid())) {
|
||
|
parents.add(node);
|
||
|
}
|
||
|
}
|
||
|
// 迭代构建孩子节点
|
||
|
for (EvaluationTreeNode parent : parents) {
|
||
|
buildChildren(parent, nodes);
|
||
|
}
|
||
|
return parents;
|
||
|
}
|
||
|
|
||
1 year ago
|
@Override
|
||
|
public void flattenTree(List<EvaluationTreeNode> trees, List<EvaluationTreeNode> nodes) {
|
||
|
// 递归结束条件
|
||
|
if (ObjectUtils.isEmpty(trees)) return;
|
||
|
|
||
|
// 这里的每个 tree 都是组装好的树,区别于单个节点
|
||
|
for (EvaluationTreeNode tree : trees) {
|
||
|
// 递归
|
||
|
flattenTree(tree.getChildren(), nodes);
|
||
|
// 回溯时删除 children,添加进列表
|
||
|
tree.setChildren(null);
|
||
|
nodes.add(tree);
|
||
|
}
|
||
|
}
|
||
|
|
||
1 year ago
|
/**
|
||
1 year ago
|
* 递归的构建父亲节点的孩子,以及孩子的孩子 (理论支持无极树,但应该考虑是否增加递归深度)
|
||
1 year ago
|
*/
|
||
|
private void buildChildren(EvaluationTreeNode parent, List<EvaluationTreeNode> nodes) {
|
||
|
List<EvaluationTreeNode> children = getChildren(parent, nodes);
|
||
1 year ago
|
if (children.size() == 0) return;
|
||
1 year ago
|
|
||
|
parent.setChildren(children);
|
||
|
for (EvaluationTreeNode child : children) {
|
||
|
// 如果子节点还有孩子的话,就继续递归构建
|
||
|
if (getChildren(child, nodes).size() > 0) {
|
||
|
buildChildren(child, nodes);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private List<EvaluationTreeNode> getChildren(EvaluationTreeNode parent, List<EvaluationTreeNode> nodes) {
|
||
|
List<EvaluationTreeNode> children = new ArrayList<>();
|
||
|
for (EvaluationTreeNode node : nodes) {
|
||
1 year ago
|
if (StringUtils.isNotBlank(node.getPid()) && node.getPid().equals(parent.getId())) {
|
||
1 year ago
|
children.add(node);
|
||
|
}
|
||
|
}
|
||
|
return children;
|
||
|
}
|
||
|
}
|