save
public void save(DeptParam param) {
BeanValidator.check (param)
if(checkExist(param.getParentId (), param.getName (), param.getId ())) {
throw new ParamException("同一层级下存在相同名称的部门" )
}
//name parentId seq remark 前台传递
SysDept dept = SysDept.builder ().name (param.getName ()).parentId (param.getParentId ())
.seq (param.getSeq ()).remark (param.getRemark ()).build ()
dept.setLevel (LevelUtil.calculateLevel (getLevel(param.getParentId ()), param.getParentId ()))
dept.setOperator (RequestHolder.getCurrentUser ().getUsername ())
dept.setOperateIp (IpUtil.getRemoteIp (RequestHolder.getCurrentRequest ()))
dept.setOperateTime (new Date())
sysDeptMapper.insertSelective (dept)
sysLogService.saveDeptLog (null, dept)
}
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class SysDept {
private String getLevel (Integer deptId) {
SysDept dept = sysDeptMapper.selectByPrimaryKey(deptId);
if (dept == null ) {
return null ;
}
return dept.getLevel();
}
public class LevelUtil {
public final static String SEPARATOR = "." ;
public final static String ROOT = "0" ;
public static String calculateLevel (String parentLevel, int parentId) {
if (StringUtils.isBlank(parentLevel)) {
return ROOT;
} else {
return StringUtils.join (parentLevel, SEPARATOR, parentId);
}
}
}
tree.json
@Getter
@Setter
@ToString
public class DeptLevelDto extends SysDept {
private List<DeptLevelDto> deptList = Lists.newArrayList();
public static DeptLevelDto adapt (SysDept dept) {
DeptLevelDto dto = new DeptLevelDto();
BeanUtils.copyProperties(dept, dto);
return dto;
}
}
public List <DeptLevelDto> deptTree() {
List <SysDept> deptList = sysDeptMapper.getAllDept();
List <DeptLevelDto> dtoList = Lists.newArrayList();
for (SysDept dept : deptList) {
DeptLevelDto dto = DeptLevelDto.adapt(dept);
dtoList.add(dto);
}
return deptListToTree(dtoList);
}
public List<DeptLevelDto> deptListToTree (List<DeptLevelDto> deptLevelList) {
if (CollectionUtils.isEmpty(deptLevelList)) {
return Lists.newArrayList();
}
Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create();
List<DeptLevelDto> rootList = Lists.newArrayList();
for (DeptLevelDto dto : deptLevelList) {
levelDeptMap.put(dto.getLevel(), dto);
if (LevelUtil.ROOT.equals(dto.getLevel())) {
rootList.add(dto);
}
}
Collections.sort(rootList, new Comparator<DeptLevelDto>() {
public int compare (DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
});
transformDeptTree(rootList, LevelUtil.ROOT, levelDeptMap);
return rootList;
}
public void transformDeptTree (List<DeptLevelDto> deptLevelList, String level, Multimap<String, DeptLevelDto> levelDeptMap) {
for (int i = 0 ; i < deptLevelList.size(); i++) {
DeptLevelDto deptLevelDto = deptLevelList.get (i);
String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId());
List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get (nextLevel);
if (CollectionUtils.isNotEmpty(tempDeptList)) {
Collections.sort(tempDeptList, deptSeqComparator);
deptLevelDto.setDeptList(tempDeptList);
transformDeptTree(tempDeptList, nextLevel, levelDeptMap);
}
}
}
public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq() ;
}
};