```java
package com.unisound.iot.smart.dao.model.saas;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author zhangtonghao
* @create 2021-04-27 14:34
*/
@Data
@ApiModel(value = "Saas功能模块树节点", description = "Saas功能模块树节点")
public class TenantModuleTreeNode implements Comparable<TenantModuleTreeNode> {
@ApiModelProperty(value = "id唯一标识", position = 1, required = true)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@ApiModelProperty(value = "模块名称", position = 1, required = true)
private String moduleName;
@ApiModelProperty(value = "父模块id", position = 1, required = false)
private Long parentId;
@ApiModelProperty(value = "模块路径", position = 1, required = false)
private String modulePath;
@ApiModelProperty(value = "模块图标", position = 1, required = false)
private String moduleIcon;
@ApiModelProperty(value = "http方法", position = 1, required = false)
private String httpMethod;
@ApiModelProperty(value = "排序", position = 1, required = false)
private Integer sortNum;
@ApiModelProperty(value = "模块代码", position = 1, required = false)
private String moduleCode;
@ApiModelProperty(value = "是否可用", position = 1, required = false)
private Integer active;
@ApiModelProperty(value = "版本:pro、lite", position = 1, required = false)
private String serviceVersion;
@ApiModelProperty(value = "管理模式:1:标准模式 2:直客 3:非直客", position = 1, required = false)
private Integer custMode;
@ApiModelProperty(value = "是否具备此模块", position = 1, required = false)
private Boolean isHas = false;
@ApiModelProperty(value = "子菜单列表", position = 1, required = false)
private List<TenantModuleTreeNode> children;
public static List<TenantModuleTreeNode> listToTree(List<TenantModuleTreeNode> list) {
//用递归找子。
List<TenantModuleTreeNode> treeList = new ArrayList<TenantModuleTreeNode>();
for (TenantModuleTreeNode tree : list) {
if (tree.getParentId() == -1) {
treeList.add(findChildren(tree, list));
}
}
return treeList;
}
public static TenantModuleTreeNode findChildren(TenantModuleTreeNode tree, List<TenantModuleTreeNode> list) {
for (TenantModuleTreeNode node : list) {
if (node.getParentId().longValue() == tree.getId()) {
if (tree.getChildren() == null) {
tree.setChildren(new ArrayList<TenantModuleTreeNode>());
}
tree.getChildren().add(findChildren(node, list));
}
}
return tree;
}
/**
* 转换为树
*
* @param moduleList
* @return
*/
public static List<TenantModuleTreeNode> convertToTree(List<TenantModule> moduleList) {
if (moduleList == null || moduleList.size() == 0) {
return null;
}
List<TenantModuleTreeNode> list = new ArrayList<>();
for (TenantModule module : moduleList) {
TenantModuleTreeNode node = new TenantModuleTreeNode();
BeanUtils.copyProperties(module, node);
list.add(node);
}
return sort(listToTree(list));
}
/**
* 转换为树并设置是否具备对应模块
*/
public static List<TenantModuleTreeNode> convertToTreeAndIsHas(List<TenantModule> allModuleList, List<Long> idList) {
if (allModuleList == null || allModuleList.size() == 0) {
return null;
}
List<TenantModuleTreeNode> list = new ArrayList<>();
for (TenantModule module : allModuleList) {
TenantModuleTreeNode node = new TenantModuleTreeNode();
BeanUtils.copyProperties(module, node);
if (idList != null && idList.size() > 0) {
for (Long um : idList) {
if (um == module.getId().longValue()) {
node.setIsHas(true);
break;
}
}
}
list.add(node);
}
return sort(listToTree(list));
}
@Override
public int compareTo(TenantModuleTreeNode other) {
if (other == null) {
return 1;
}
if (this.getSortNum() == null || other.getSortNum() == null) {
return 1;
}
return this.getSortNum() - other.getSortNum();
}
private static List<TenantModuleTreeNode> sort(List<TenantModuleTreeNode> adminModuleTreeNodeList) {
if (adminModuleTreeNodeList == null || adminModuleTreeNodeList.size() == 0) {
return adminModuleTreeNodeList;
}
for (TenantModuleTreeNode TenantModuleTreeNode : adminModuleTreeNodeList) {
if (TenantModuleTreeNode.getChildren() != null) {
Collections.sort(TenantModuleTreeNode.getChildren());
sort(TenantModuleTreeNode.getChildren());
}
}
return adminModuleTreeNodeList;
}
}