返回实体类:
@Getter
@Setter
@ApiModel("组织机构树")
public class OrganizationDto implements Serializable {
@ApiModelProperty("机构id")
private Long id;
@ApiModelProperty("机构名称")
private String name;
@ApiModelProperty("父节点")
private Long parentId;
@ApiModelProperty("备注")
private String comment;
@ApiModelProperty("子机构")
private List<OrganizationDto> children = new ArrayList<>();
public List<OrganizationDto> getChildren() {
if (!ObjectUtils.isEmpty(children)) {
Collections.sort(children, new PinyinComparator());
}
return children;
}
public void setChildren(List<OrganizationDto> children) {
this.children = children;
}
}
排序规则工具类:
public class PinyinComparator implements Comparator<OrganizationDto> {
/**
* 比较首字母
*
* @param organizationDto
* @param otherOrganizationDto
* @return
*/
public int compare(OrganizationDto organization, OrganizationDto otherOrganization) {
int initials = organizationDto.getName().charAt(0);
int otherInitials = otherOrganizationDto.getName().charAt(0);
String pinyin1 = convertPinyin((char) initials);
String pinyin2 = convertPinyin((char) otherInitials);
// 两个字符都是汉字
if (pinyin1 != null && pinyin2 != null) {
if (!pinyin1.equals(pinyin2)) {
return pinyin1.compareTo(pinyin2);
} else {
return 0;
}
} else {
return organizationDto.getName().substring(0, 1).toLowerCase().charAt(0) - otherOrganizationDto.getName().substring(0, 1).toLowerCase().charAt(0);
}
}
/**
* 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
*
*/
private String convertPinyin(char chinese) {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(chinese);
if (pinyins == null) {
return null;
}
return pinyins[0];
}
}
查询机构树,并组装:
/**
* 查询组织机构树
*
* @param currentTenantId
* @return
*/
@Override
public Organization getOrganizationTree() {
//查询所有机构
Map<Long, OrganizationDto> organizationMap = organizationRepository.findAll().stream()
.collect(Collectors
.toMap(Organization::getId,
organization -> {
Organization organization = new Organization();
BeanUtils.copyProperties(organization, organization);
return organizationDto;
}));
//组装组织机构树,
organizationMap.forEach((key, organization) -> {
if (Objects.nonNull(organizationMap.get(organization.getParentId())) && !ACCOUNT_CATEGORY_TAG_ID.equals(key)) {
organizationMap.get(organization.getParentId()).getChildren().add(organization);
}
});
return organizationMap.get("根节点的id");
}