无限极设计以及随意移动节点(树结构)

1.表设计

CREATE TABLE `party_examine_bank_type` (
  `id` bigint(20) NOT NULL  COMMENT '类型id',
  `ancestors` text COMMENT '祖级列表',
  `parent_id` bigint(20) DEFAULT '0' COMMENT '父id',
  `name` varchar(200) DEFAULT '' COMMENT '名称',
  `sort` int(4) DEFAULT '0' COMMENT '显示顺序',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `is_delete` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
  `create_time` bigint(20) DEFAULT '0' COMMENT '创建时间', 
  `update_time` bigint(20) DEFAULT '0' COMMENT '更新时间',
  `supplier_id` bigint(20) DEFAULT NULL COMMENT '商户编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='类型表';

 

 

 

2.插入操作 祖级列表直接取上级的祖级列表数据拼接当前的上级就可以了

 

3.主要看更新操作,支持所有节点随意移动,树的下级也跟着移动,与上一篇 左右值算法实现的无限极异曲同工之效

 

 public int updatePartyExamineBankType(PartyExamineBankType partyExamineBankType)
    {
     //查询新上级的数据 PartyExamineBankType newParentBank
= partyExamineBankTypeMapper.selectById(partyExamineBankType.getParentId());
     //查询当前id的旧数据 PartyExamineBankType oldBank
= partyExamineBankTypeMapper.selectPartyExamineBankTypeById(partyExamineBankType.getId()); String newAncestors =""; if (StringUtils.isNotNull(newParentBank) && StringUtils.isNotNull(oldBank)) { String oldAncestors = oldBank.getAncestors(); Long id=partyExamineBankType.getId(); Long pId=newParentBank.getId();
       //这里判断下,如果涉及上下级或者间接关系走这里
if(newParentBank.getAncestors().contains(Convert.toStr(id))){ String s=newParentBank.getAncestors(); String param=s.substring(s.lastIndexOf(Convert.toStr(id))); newAncestors=oldAncestors + "," + pId; newParentBank.setAncestors(oldAncestors); newParentBank.setParentId(oldBank.getParentId());
          //先更新新上级的数据 partyExamineBankTypeMapper.updatePartyExamineBankType(newParentBank); partyExamineBankType.setAncestors(newAncestors);
          //更新子节点信息 updateBankRelationChildren(id, newAncestors, oldAncestors,pId,param); }
else {//非关系的走这里
           newAncestors
= newParentBank.getAncestors() + "," + pId; partyExamineBankType.setAncestors(newAncestors);
          //更新子节点信息 updateBankChildren(id, newAncestors, oldAncestors); } }
int result = partyExamineBankTypeMapper.updatePartyExamineBankType(partyExamineBankType); if (UserConstants.DEPT_NORMAL.equals(partyExamineBankType.getStatus())) { // 如果该节点是启用状态,则启用该节点的所有上级 updateParentTypeStatus(partyExamineBankType); } return result; }
/**
     * 修改子元素关系
     *
     * @param typeId 被修改的类型ID
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     *
     */
    public void updateBankChildren(Long typeId, String newAncestors, String oldAncestors)
    {
        List<PartyExamineBankType> children = partyExamineBankTypeMapper.selectChildrenTypeById(typeId);
        for (PartyExamineBankType child : children)
        {
            child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
        }

        if (children.size() > 0)
        {
            partyExamineBankTypeMapper.updateTypeChildren(children);
        }
    }
/**
     * 修改子元素关系(上下级互换用)
     *
     * @param typeId 被修改的类型ID
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     * @param param 新的父ID与旧的父ID之间间隔的级别
     */
    public void updateBankRelationChildren(Long typeId, String newAncestors, String oldAncestors,Long newParentId,String param)
    {
        List<PartyExamineBankType> children = partyExamineBankTypeMapper.selectChildrenTypeById(typeId);
        String p[]=param.split(",");
        String pId=Convert.toStr(newParentId);
        for (PartyExamineBankType child : children)
        {
            if(child.getAncestors().contains(pId)){
                for(int i=0;i<p.length;i++){
                    child.setAncestors(child.getAncestors().replace(","+p[i],""));
                }
                continue;
            }
            child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
        }

        if (children.size() > 0)
        {
            partyExamineBankTypeMapper.updateTypeChildren(children);
        }
    }

 

posted @ 2020-11-04 16:38  海代码  阅读(273)  评论(0编辑  收藏  举报