常见树形数据封装


@Value("${iac.basic.org.maxLevel:5}")
private Integer orgMaxLevel;

/**
* 新增机构管理
*
* @param param
* @param context
* @return
* @throws ServiceException
*/
@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public CloudwalkResult<Boolean> add(OrgNewParam param, CloudwalkCallContext context) throws ServiceException {
OrgNewDto dto = BeanCopyUtils.copyProperties(param, OrgNewDto.class);
dto.setId(this.genUUID());
dto.setCreateTime(context.getCallTime().getTime());
dto.setCreateUserId(context.getUser().getCaller());
dto.setTenantId(context.getCompany().getCompanyId());
if (StringUtils.isBlank(dto.getTenantId())) {
dto.setTenantId("default");
}
dto.setStatus(StatusEnum.EFFECT.getCode());

try {
OrgQueryDto orQueryDto=new OrgQueryDto();
orQueryDto.setOrgName(dto.getOrgName());
List<OrgResultDto> query = orgManager.exist(orQueryDto);
if (!query.isEmpty()){
return CloudwalkResult.fail("10000",orQueryDto.getOrgName()+"已存在!");
}
} catch (DataAccessException e) {
logger.error("机构名称查询失败,原因:", e);
}
List<OrgResultDto> parents=getParents(dto.getParentId());
dto.setPath(buildPath(dto.getId(),parents));
dto.setLevel(buildLevel(parents));
try {
this.orgManager.add(dto);
} catch (Exception e) {
logger.error("新增机构管理失败,原因:", e);
throw new ServiceException(e);
}

return CloudwalkResult.success(true);
}

/**
* 更新机构管理
*
* @param param
* @param context
* @return
* @throws ServiceException
*/
@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public CloudwalkResult<Boolean> update(OrgEditParam param, CloudwalkCallContext context) throws ServiceException {
OrgEditDto dto = BeanCopyUtils.copyProperties(param, OrgEditDto.class);
dto.setLastUpdateTime(context.getCallTime().getTime());
dto.setLastUpdateUserId(context.getUser().getCaller());

try {
OrgQueryDto orQueryDto=new OrgQueryDto();
orQueryDto.setOrgName(dto.getOrgName());
List<OrgResultDto> query = orgManager.exist(orQueryDto);
if (!query.isEmpty()&&!query.get(0).getId().equals(dto.getId())){
return CloudwalkResult.fail("10000",orQueryDto.getOrgName()+"已存在!");
}
} catch (DataAccessException e) {
logger.error("机构名称查询失败,原因:", e);
}
List<OrgResultDto> parents=getParents(dto.getParentId());
dto.setPath(buildPath(dto.getId(),parents));
dto.setLevel(buildLevel(parents));
try {
this.orgManager.update(dto);
} catch (Exception e) {
logger.error("编辑机构管理失败,原因:", e);
throw new ServiceException(e);
}

return CloudwalkResult.success(true);
}

/**
* 删除机构管理
*
* @param param
* @param context
* @return
* @throws ServiceException
*/
@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public CloudwalkResult<Boolean> delete(OrgDeltParam param, CloudwalkCallContext context) throws ServiceException {
OrgDeltDto dto = BeanCopyUtils.copyProperties(param, OrgDeltDto.class);
// 2.判断机构是存在子机构
Boolean havaChildren = this.checkOrgChildre(param.getIds());
if (havaChildren) {
return CloudwalkResult.fail("76061069", this.getMessage("76061069"));
}
try {
this.orgManager.delete(dto);
} catch (Exception e) {
logger.error("删除机构管理失败,原因:", e);
throw new ServiceException(e);
}

return CloudwalkResult.success(true);
}

@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
public CloudwalkResult<List<OrgResult>> query(OrgQueryParam param, CloudwalkCallContext context) throws ServiceException {
OrgQueryDto dto = BeanCopyUtils.copyProperties(param, OrgQueryDto.class);

List<OrgResultDto> resultDTOList = null;
try {
resultDTOList = this.orgManager.query(dto);
} catch (Exception e) {
logger.error("查询机构管理失败,原因:", e);
throw new ServiceException(e);
}
List<OrgResult> orgResult=BeanCopyUtils.copy(resultDTOList, OrgResult.class);
List<OrgResult> result= createTree(orgResult);
return CloudwalkResult.success(result);
}
/*
*查询是否含有子节点
* */
private Boolean checkOrgChildre(List<String> orgIds) {
Boolean havaChildren = false;
OrgQueryDto query = new OrgQueryDto();
query.setParentId(orgIds.get(0));
List<OrgResultDto> orgResultDtos = null;
try {
orgResultDtos = orgManager.query(query);
if (!CollectionUtils.isEmpty(orgResultDtos)) {
havaChildren = true;
}
} catch (DataAccessException e) {
logger.error("查询{}子节点失败",orgIds.get(0));
}

return havaChildren;
}

/**
* 构建树
* */
@SuppressWarnings({ "rawtypes", "unchecked" })
private List<OrgResult> createTree(List<OrgResult> data) {
if(CollectionUtils.isEmpty(data)) {
return new ArrayList<>();
} else {
//将集合中所有数据按照父Id进行分组,放入Map中,Map<parntId, List<Child>>
Map groupByParentIdMap = (Map)data.stream().collect(Collectors.groupingBy((item) -> {
return item.getParentId() != null?item.getParentId().toString():"nonParent";
}));
//将集合中所有数据以数据Id为key,放入Map中,Map<id,T>
Map dataMap = (Map)data.stream().collect(Collectors.toMap((item) -> {
return item.getId().toString();
}, (t2) -> {
return t2;
}));
List<OrgResult> resp = new ArrayList<>();
//遍历数据,将子节点放入对应父节点Children属性中
groupByParentIdMap.keySet().forEach((parentId) -> {
if(dataMap.containsKey(parentId)) {
Object child = ((OrgResult)dataMap.get(parentId)).getChildren();
if(CollectionUtils.isEmpty((Collection)child)) {
child = new ArrayList<>();
}

((List)child).addAll((Collection)groupByParentIdMap.get(parentId));
((OrgResult)dataMap.get(parentId)).setChildren((List)child);
} else {
resp.addAll((Collection)groupByParentIdMap.get(parentId));
}

});
return resp;
}
}

/**
* 获取机构管理
*
* @param param
* @param context
* @return
* @throws ServiceException
*/
@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
public CloudwalkResult<List<OrgResult>> gets(OrgGetsParam param, CloudwalkCallContext context) throws ServiceException {
OrgGetsDto dto = BeanCopyUtils.copyProperties(param, OrgGetsDto.class);

List<OrgResultDto> resultDTOList = null;
try {
resultDTOList = this.orgManager.gets(dto);
} catch (Exception e) {
logger.error("获取机构管理失败,原因:", e);
throw new ServiceException(e);
}

return CloudwalkResult.success(BeanCopyUtils.copy(resultDTOList, OrgResult.class));
}

/**
* 分页查询机构管理
*
* @param param
* @param page
* @param context
* @return
* @throws ServiceException
*/
@Override
@CloudwalkParamsValidate(argsIndexs = {0, 1})
public CloudwalkResult<CloudwalkPageAble<OrgResult>> page(OrgQueryParam param, CloudwalkPageInfo page, CloudwalkCallContext context)
throws ServiceException {
OrgQueryDto dto = BeanCopyUtils.copyProperties(param, OrgQueryDto.class);

CloudwalkPageAble<OrgResultDto> pageAble = null;

try {
pageAble = this.orgManager.page(page, dto);
} catch (Exception e) {
logger.error("分页查询机构管理失败,原因:", e);
throw new ServiceException(e);
}
List<OrgResult> results = BeanCopyUtils.copy(pageAble.getDatas(), OrgResult.class);
return CloudwalkResult.success(new CloudwalkPageAble<>(results, page, pageAble.getTotalRows()));
}


/*
* 获取父节点
* @param parentId
* @param page
*/
private List<OrgResultDto> getParents(String parentId){
List<OrgResultDto> parents=null;
if (StringUtils.isNotBlank(parentId)) {
try {
OrgGetsDto orgGetsDto=new OrgGetsDto();
orgGetsDto.setIds(Collections.singletonList(parentId));
parents = orgManager.gets(orgGetsDto);
} catch (DataAccessException e) {
logger.error("查询父节点{}失败!!",parentId);
}
}
return parents;
}
/*
* 构建机构的层级
* @param parents
*/
private Integer buildLevel(List<OrgResultDto> parents) throws ServiceException {
//1. 根据parentId查询父节点的path
Integer level=0;
if (!CollectionUtils.isEmpty(parents)&&null!=parents.get(0).getLevel()){
//2. 根据父节点的level得到当前的level
level=parents.get(0).getLevel()+1;
}
if(level>=orgMaxLevel){
throw new ServiceException("76061068",this.getMessage("76061068"));
}
return level;
}
/*
* 构建机构的path
* @param id
* @param parents
*/
private String buildPath(String id,List<OrgResultDto> parents){
//1. 根据parentId查询父节点的path
StringBuilder path=new StringBuilder();
if (!CollectionUtils.isEmpty(parents)&&StringUtils.isNotBlank(parents.get(0).getPath())){
//2. 根据父节点的path+id组合成当前的path
path.append(parents.get(0).getPath()).append(BaseConstants.DEFAULT_AREA_PATH_SPLIT).append(id);
} else {
path.append(id);
}

return path.toString();
}

表结构

CREATE TABLE `org` (
`ID` varchar(32) NOT NULL COMMENT '机构编号',
`TENANT_ID` varchar(32) NOT NULL COMMENT '租户编号',
`APPLICATION_ID` varchar(32) DEFAULT NULL COMMENT '应用编号',
`SERVICE_CODE` varchar(32) DEFAULT NULL COMMENT '应用编码',
`CODE` varchar(32) DEFAULT NULL COMMENT '机构编码',
`TYPE` varchar(32) DEFAULT NULL COMMENT '机构类型',
`NAME` varchar(32) NOT NULL COMMENT '机构名称',
`LEVEL` tinyint(4) NOT NULL DEFAULT '0' COMMENT '机构层级',
`DESCRIPTION` varchar(255) DEFAULT NULL COMMENT '机构描述',
`STATUS` tinyint(4) NOT NULL DEFAULT '1' COMMENT '机构状态 1-有效 2-无效',
`PARENT_ID` varchar(64) DEFAULT NULL COMMENT '父机构编号',
`PATH` varchar(255) DEFAULT NULL COMMENT '路径',
`CREATE_TIME` bigint(20) NOT NULL COMMENT '创建时间',
`CREATE_USER_ID` varchar(32) DEFAULT NULL COMMENT '创建人',
`LAST_UPDATE_TIME` bigint(20) DEFAULT NULL COMMENT '最后修改时间',
`LAST_UPDATE_USER_ID` varchar(32) DEFAULT NULL COMMENT '最后修改人',
PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='机构表';

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值