--------一次查询所有,不是点一次查询一次
controller接口层
/*
* 获取树列表
* */
@GetMapping("/treeFacility")
public AjaxResult treeFacility(TxfOrgWeibaoFacility txfOrgWeibaoFacility) {
List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities = txfOrgWeibaoFacilityService.selectTxfOrgWeibaoFacilityList(txfOrgWeibaoFacility);
return AjaxResult.success(txfOrgWeibaoFacilityService.treeFacility(txfOrgWeibaoFacilities));
}
service接口层
List<TxfOrgWeibaoFacility> buildTreeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities);
List<TxfOrgWeibaoFacility> treeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilitys);
serviceImpl业务逻辑层
/**
* 构建前端所需要树结构
*
* @param txfOrgWeibaoFacilities 公司维保计划列表
* @return 树结构列表
*/
@Override
public List<TxfOrgWeibaoFacility> buildTreeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities) {
// 构造返回集合对象
List<TxfOrgWeibaoFacility> returnList = new ArrayList<TxfOrgWeibaoFacility>();//存放返回的树所有对象
List<String> tempList = new ArrayList<String>();//存放所有的id
for (TxfOrgWeibaoFacility txfOrgWeibaoFacility : txfOrgWeibaoFacilities) {//遍历所有的公司维保计划对象
tempList.add(txfOrgWeibaoFacility.getId());//保存所以的id
}
// 迭代器(容器):得到一个iterator对象,next()可以得到下一个值,hasNext() 判断是否有下一个值
// hasNext() 判断是否有下一个值,如果有进行遍历
for (Iterator<TxfOrgWeibaoFacility> iterator = txfOrgWeibaoFacilities.iterator(); iterator.hasNext(); ) {
TxfOrgWeibaoFacility txfOrgWeibaoFacility = (TxfOrgWeibaoFacility) iterator.next();//得到第一个对象
// 如果是顶级节点, 遍历该父节点的所有子节点 contains 包含指定数据,
// 包含说明有子节点为 true, !true不包含说明已经是最高节点
if (!tempList.contains(txfOrgWeibaoFacility.getParentid())) {//判断是否为顶级节点
recursionFn(txfOrgWeibaoFacilities, txfOrgWeibaoFacility); //递归
returnList.add(txfOrgWeibaoFacility); //说明是顶级节点,进行返回显示
}
}
//如果returnList 没有任何子节点,那就给子节点赋值为整个对象
if (returnList.isEmpty()) {
returnList = txfOrgWeibaoFacilities;
}
return returnList;
}
/**
* 递归列表,把子节点进行保存在该父节点的对象下的子节点集合中
*/
private void recursionFn(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t) {
// 得到子节点列表
List<TxfOrgWeibaoFacility> childList = getChildList(list, t);
t.setChildren(childList);//保存在当前正在遍历的对象 t 中子节点对象集合中
for (TxfOrgWeibaoFacility tChild : childList) { //遍历子节点对象集合
if (hasChild(list, tChild)) {//判断是否还有子节点
recursionFn(list, tChild); //有的话 接着递归 孙辈及孙辈一下...
}
}
}
/**
* 得到子节点列表 t 为顶级结点,把子节点放在t对象中
*/
private List<TxfOrgWeibaoFacility> getChildList(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t) {
// 创建一个新的集合tlist保存子节点对象
List<TxfOrgWeibaoFacility> tlist = new ArrayList<TxfOrgWeibaoFacility>();
Iterator<TxfOrgWeibaoFacility> it = list.iterator(); //得到迭代器对象 基本上没什么区别,只是取数据相对方便 可拿到下一个
while (it.hasNext()) { //判断是否还有下个对象 true 进去代码块
TxfOrgWeibaoFacility n = it.next(); //得到子节点对象
//非空判断,把下面pid=id的对象进行保存在子节点集合中返回出去!
if (n.getParentid().equals(t.getId())) {
tlist.add(n);//不为空且相等说明是子节点,进行添加
}
}
// 接着返回子节点列表
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t)
{
// 长度大于零说明还有子节点对象,进行再次add拼接到第一个后面
return getChildList(list, t).size() > 0 ? true : false;
}
@Override
public List<TxfOrgWeibaoFacility> treeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilitys) {
List<TxfOrgWeibaoFacility> FacilityTrees = buildTreeFacility(txfOrgWeibaoFacilitys);//构建树
return FacilityTrees.stream().map(TxfOrgWeibaoFacility::new).collect(Collectors.toList());
// return FacilityTrees;
}
domain实体
/**
* 公司维保计划对象 txf_org_weibao_facility
*
* @author ruoyi
* @date 2020-10-11
*/
public class TxfOrgWeibaoFacility extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** ID */
private String id;
/** 单位ID */
@Excel(name = "单位ID")
private String uqorgid;
/** 系统ID */
@Excel(name = "系统ID")
private String systemid;
/** 父节点(对应ID字段) */
@Excel(name = "父节点", readConverterExp = "对=应ID字段")
private String parentid;
/** 消防设施编号 */
@Excel(name = "消防设施编号")
private String varno;
/** 消防设施名称 */
@Excel(name = "消防设施名称")
private String facility;
/** 状态 1: 有效 0 无效 */
@Excel(name = "状态 1: 有效 0 无效")
private Long intstate;
/** 创建人 */
@Excel(name = "创建人")
private String createuser;
/** 更新人 */
@Excel(name = "更新人")
private String updateuser;
/** 备注 */
@Excel(name = "备注")
private String memo;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TxfOrgWeibaoFacility> Children = new ArrayList<TxfOrgWeibaoFacility>();
public List<TxfOrgWeibaoFacility> getChildren() {
return Children;
}
public TxfOrgWeibaoFacility() {
}
public TxfOrgWeibaoFacility(TxfOrgWeibaoFacility txfOrgWeibaoFacility) {
this.id = txfOrgWeibaoFacility.getId();
this.uqorgid = txfOrgWeibaoFacility.getUqorgid();
this.systemid = txfOrgWeibaoFacility.getSystemid();
this.parentid = txfOrgWeibaoFacility.getParentid();
this.facility = txfOrgWeibaoFacility.getFacility();
this.Children = txfOrgWeibaoFacility.getChildren().stream().map(TxfOrgWeibaoFacility::new).collect(Collectors.toList());
}
public void setChildren(List<TxfOrgWeibaoFacility> children) {
Children = children;
}
}