sql
CREATE TABLE `OT_MAIL_LIST_GROUP` (
`FLOW_ID` varchar(32) NOT NULL COMMENT '主键' ,
`GROUP_NAME` varchar(32) NOT NULL COMMENT '分组名' ,
`PARENT_ID` varchar(32) NOT NULL COMMENT '父级组' ,
`CREATE_USER_ID` varchar(32) NOT NULL COMMENT '创建中ID' ,
`CREATE_TIME` datetime NULL COMMENT '创建时间' ,
`MODIFY_USER_ID` varchar(36) NULL COMMENT '修改者ID' ,
`MODIFY_TIME` datetime NULL COMMENT '修改时间' ,
`LHD` int NOT NULL COMMENT '左ID,方便查询数据' ,
`RHD` int NOT NULL COMMENT '右ID,方便查询数据',
PRIMARY KEY (`FLOW_ID`)
)
;
数据库实体类
package com.cdsf.egov.oa.maillist.domain;
import java.util.Date;
/**
* 通讯录分组表
* @author tanbowei
*
*/
public class MListGroup {
/**主键*/
private String flowId;
/**分组名字*/
private String groupName;
/**父级ID*/
private String parentId;
/**用户ID*/
private String createUserId;
/**创建时间*/
private Date createTime;
/**修改者ID*/
private String modifyUserId;
/**修改时间*/
private Date modifyTime;
/**左ID*/
private int LHD;
/**右ID*/
private int RHD;
public String getFlowId() {
return flowId;
}
public void setFlowId(String flowId) {
this.flowId = flowId;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getModifyUserId() {
return modifyUserId;
}
public void setModifyUserId(String modifyUserId) {
this.modifyUserId = modifyUserId;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
public int getLHD() {
return LHD;
}
public void setLHD(int lHD) {
LHD = lHD;
}
public int getRHD() {
return RHD;
}
public void setRHD(int rHD) {
RHD = rHD;
}
}
树形数据封装类
package com.cdsf.egov.oa.maillist.domain;
import java.util.List;
public class TreeMList {
/**分组ID*/
private String id;
/**分组名字*/
private String text;
/**父级ID*/
private String parentId;
/**子集合*/
private List<TreeMList> childrenList;
/**是否拥有子集合*/
private boolean hasChildren;
/**子集合类型*/
private int type =1;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public boolean isHasChildren() {
return hasChildren;
}
public void setHasChildren(boolean hasChildren) {
this.hasChildren = hasChildren;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<TreeMList> getChildrenList() {
return childrenList;
}
public void setChildrenList(List<TreeMList> childrenList) {
this.childrenList = childrenList;
}
}
实现方案1
此方案是通过每次用户传入的节点ID来实现树状,每次查询只查询当前传入ID的子节点
public List<?> listGroup(Map<String, String> map) {
MListGroup mg = new MListGroup();//要实现树的分组数据
mg.setCreateUserId(currentUser().id().toString());//设置当前用户的ID
if(map.get("id")!=null){//判断是否有接收参数(参数为选中的树节点ID)
mg.setFlowId(map.get("id"));将父节点ID作为子节点的父ID来查询
}else{
mg.setFlowId(currentUser().id().toString());本系统默认用当前用户的id作为一级根节点的ID
}
if(!s_Parent(mg)){//判断是否拥有子分组
addGroup_s();//为没有分组的用户添加默认分组
}
List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);//接收数据层查询出来的数据
List<TreeMList> lm = new ArrayList<TreeMList>();
TreeMList tm1 = new TreeMList();
for (MListGroup mg1 : list) {
TreeMList tm = new TreeMList();
tm.setText(mg1.getGroupName());
tm.setId(mg1.getFlowId());
tm.setParentId(mg1.getParentId());
tm.setHasChildren(s_Parent(mg1));
lm.add(tm);
}
tm1.setChildrenList(lm);
return tm1.getChildrenList();
}
/**
* 为没有分组的用户添加默认分组
*/
public void addGroup_s(){
MListGroup mg = new MListGroup();
mg.setFlowId(Tools.createUUID());
mg.setParentId(currentUser().id().toString());
mg.setGroupName("我的通讯录");
mg.setLHD(1);
mg.setRHD(2);
mg.setCreateTime(new Date());
mg.setCreateUserId(currentUser().id().toString());
mg.setModifyTime(new Date());
mg.setModifyUserId(currentUser().id().toString());
lMapper.addGroup(mg);
}<p>
</p>/**
* 判断是否拥有子分组
* @param mg
* @return
*/
public boolean s_Parent(MListGroup mg){
return lMapper.s_Parent(mg)>0?true:false;
}
方案2
此方案实现原理 为 一次性将所有的树都查询出来,没有二次查询
@Override
public List<?> listGroup(Map<String, String> map) {
MListGroup mg = new MListGroup();
mg.setCreateUserId(currentUser().id().toString());
if(map.get("id")!=null){
mg.setFlowId(map.get("id"));
}else{
mg.setFlowId(currentUser().id().toString());
}
if(!s_Parent(mg)){
addGroup_s();
}
List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);
List<TreeMList> lm = new ArrayList<TreeMList>();
TreeMList tm1 = new TreeMList();
for (MListGroup mg1 : list) {
TreeMList tm = new TreeMList();
tm.setText(mg1.getGroupName());
tm.setId(mg1.getFlowId());
tm.setParentId(mg1.getParentId());
tm.setHasChildren(s_Parent(mg1));
tm.setChildrenList(treeGroup(mg1));//调用递归方法
lm.add(tm);
}
tm1.setChildrenList(lm);
return tm1.getChildrenList();
}
/**
* 为没有分组的用户添加默认分组
*/
public void addGroup_s(){
MListGroup mg = new MListGroup();
mg.setFlowId(Tools.createUUID());
mg.setParentId(currentUser().id().toString());
mg.setGroupName("我的通讯录");
mg.setLHD(1);
mg.setRHD(2);
mg.setCreateTime(new Date());
mg.setCreateUserId(currentUser().id().toString());
mg.setModifyTime(new Date());
mg.setModifyUserId(currentUser().id().toString());
lMapper.addGroup(mg);
// lMapper.addGroup(mg);
}
/**
* 递归所有的分组
* @param mg
* @return
*/
public List<TreeMList> treeGroup(MListGroup mg){
List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);//接收数据层查询出来的数据
List<TreeMList> lm = new ArrayList<TreeMList>();
for (MListGroup mg1 : list) {
TreeMList tm = new TreeMList();
List<TreeMList> tm2 =new ArrayList<TreeMList>();
tm.setText(mg1.getGroupName());
tm.setId(mg1.getFlowId());
tm.setParentId(mg1.getParentId());
tm.setHasChildren(s_Parent(mg1));
if(s_Parent(mg1)){//如果循环到的节点拥有子节点,继续调用当前方法递归
tm2 = treeGroup(mg1);
}
tm.setChildrenList(tm2);
lm.add(tm);
}
return lm;
}
/**
* 判断是否拥有子分组
* @param mg
* @return
*/
public boolean s_Parent(MListGroup mg){
return lMapper.s_Parent(mg)>0?true:false;
}