从mysql查询机构表用java解析成机构树

数据库表:
这里写图片描述

对应实体:

@Entity
@Table(name = "t_sys_org")
public class SysOrgDTO {
    private Long id;
    private String name;  
    private Long parentId;

    @Transient
    private List<SysOrgDTO> childOrg = new ArrayList<SysOrgDTO>();   
}

Controller层:

@RestController
@RequestMapping("/api/sys/org")
public class OrgController extends BaseController{
    @Autowired
    private OrgBO orgBO;
/**
     *机构树
     * @param orgId
     * @return
     */
    @RequestMapping(value = "/getOrgTree",method = RequestMethod.GET)
    @ApiOperation(value = "机构树",notes="机构树")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orgId",value = "机构id",dataType = "Long",paramType = "query")
    })
    @ApiResponses(value = {@ApiResponse(code = 200,message = "机构树")})
    public JsonMessage<String> getOrgTree(@RequestParam(value = "orgId",required = false) Long orgId){
        return JsonMessage.successed(JsonUtil.toDefaultJSONString(orgBO.generateTreeNode(orgId),SysOrgDTO.getDefaultJsonFilter()));
    }
}

Service层:

@Service
public class OrgBO {
    @Autowired
    private SysOrgBO sysOrgBO;

    /**
     * 生成机构树
     * @param rootId
     * @return
     */
    public List<SysOrgDTO> generateTreeNode(Long rootId){
        List<SysOrgDTO> root = new ArrayList<SysOrgDTO>();
        if (rootId != null){
            //找到所有一级机构
            root = sysOrgBO.findAll(new NumberCondition("id",rootId,NumberCondition.Handler.EQUAL));
        }else {
            root = sysOrgBO.findAll(new NumberCondition("parentId",0,NumberCondition.Handler.EQUAL));
        }
        //为一级机构设置子机构
        for(SysOrgDTO org:root){
            org.setChildOrg(getChildNode(org.getId()));
        }
        return root;
    }

    /**
     * 根据父id查询所有子机构
     * @param nodeId
     * @return
     */
    public List<SysOrgDTO> getChildNode(Long nodeId){
        //根据父id查询子机构
        List<SysOrgDTO> childNodeList = sysOrgBO.findAll(new NumberCondition("parentId",nodeId,NumberCondition.Handler.EQUAL));
        //子机构下的子机构
        for(SysOrgDTO org:childNodeList){
            org.setChildOrg(getChildNode(org.getId()));//递归
        }
        if (childNodeList.size() == 0){
            return null;
        }
        return childNodeList;
    }
 }

这样返回的是一个list集合。

$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单的引用,以便在对象中使用该菜单 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
/** * 根据等级查询类目 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值