📄 depttreebean.java
字号:
package com.syit.cc.system.controller;
import java.util.List;
import org.apache.myfaces.custom.tree2.TreeNodeBase;
import org.apache.myfaces.custom.tree2.TreeNode;
import com.syit.util.FacesUtil;
import com.syit.util.ServiceLocator;
import com.syit.cc.system.model.TSysDept;
/**
* 构建部门树
*/
public class DeptTreeBean {
/**
* 部门树
*/
private TreeNode deptTree;
// 定位节点id
private String locationId;
public DeptTreeBean() {
// 读取定位节点id,url参数传过来值优先赋值
locationId = (String) com.syit.util.FacesUtil
.getRequestParameter("locationId");
if (locationId == null)
locationId = (String) com.syit.util.FacesUtil
.getRequestParameter("deptParentId");
// 如果该节点不存在则构建该节点
if (locationId != null
&& (deptTree == null || orientateNode(deptTree, locationId) == null)) {
List treeList = ServiceLocator.getDepartmentService().findAll();
TSysDept parentDept = ServiceLocator.getDepartmentService()
.findById(locationId);
if (treeList.size() > 0 && parentDept != null) {
deptTree = new TreeNodeBase("child", parentDept.getDeptName(),
parentDept.getDeptId(), false);
deptTree = constructTree(treeList, parentDept, deptTree);
FacesUtil.getRequest().setAttribute("deptParentId", locationId);
FacesUtil.getRequest().setAttribute("deptTree", deptTree);
}
}
}
/**
* 递归定位被选节点在树图中的位置
*
* @param start
* 起始节点
* @param nodeId
* 起始节点id
* @return
*/
private TreeNode orientateNode(TreeNode start, String nodeId) {
TreeNode result = null;
// 匹配id,如果相等则返回该节点
if (nodeId.equals(start.getIdentifier())) {
return start;
} else {
// id不相等则继续递归
List children = start.getChildren();
for (int i = 0; i < children.size(); i++) {
start = (TreeNode) children.get(i);
result = orientateNode(start, nodeId);
if (result != null)
break;
}
}
return result;
}
/**
* 根据所有部门列表和某一个子部门构建一棵展开到该子部门的部门树
*
* @param deptList
* 所有部门列表
* @param expandDept
* 需要展开的部门对象
* @param expandNode
* 需要展开的部门节点
* @return
*/
private TreeNode constructTree(List deptList, TSysDept expandDept,
TreeNode expandNode) {
// 该部门没有上级部门,直接返回
if (expandDept.getTSysDept() == null) {
expandNode.setType("root");
// 遍历列表将下属部门增加到上级部门节点下
for (int i = 0; i < deptList.size(); i++) {
TSysDept dept = (TSysDept) deptList.get(i);
// 父部门id为传入部门的将会被加入到节点下
if (dept.getTSysDept() != null
&& dept.getTSysDept().getDeptId().equals(
expandDept.getDeptId())) {
TreeNode childNode = new TreeNodeBase("child", dept
.getDeptName(), dept.getDeptId(), false);
expandNode.getChildren().add(childNode);
}
}
return expandNode;
} else {
// 获得传入部门的上级部门
TSysDept parentDept = expandDept.getTSysDept();
TreeNode parentNode = new TreeNodeBase("child", parentDept
.getDeptName(), parentDept.getDeptId(), false);
// 遍历列表将下属部门增加到上级部门节点下
for (int i = 0; i < deptList.size(); i++) {
TSysDept dept = (TSysDept) deptList.get(i);
// 父部门id为传入部门的将会被加入到节点下
if (dept.getTSysDept() != null
&& dept.getTSysDept().getDeptId().equals(
expandDept.getDeptId())) {
TreeNode childNode = new TreeNodeBase("child", dept
.getDeptName(), dept.getDeptId(), false);
expandNode.getChildren().add(childNode);
}
}
// 递归获取上级部门的父节点
TreeNode rootNode = constructTree(deptList, parentDept, parentNode);
// 替换掉rootNode中与parentNode相同的子节点
for (int i = 0; i < parentNode.getChildCount(); i++) {
TreeNode tmpNode = (TreeNode) parentNode.getChildren().get(i);
if (tmpNode.getIdentifier().equals(expandNode.getIdentifier())) {
parentNode.getChildren().set(i, expandNode);
expandNode = (TreeNode) parentNode.getChildren().get(i);
break;
}
}
return rootNode;
}
}
/**
* 获取部门树
*
* @return TreeNode 部门树
*/
public TreeNode getDeptTree() {
// 读取request里面的deptTree
if (null == deptTree) {
deptTree = (TreeNode) FacesUtil.getRequest().getAttribute(
"deptTree");
}
if (null == deptTree) {
// 读取不到则从数据库中查询顶级部门列表
List treeList = ServiceLocator.getDepartmentService()
.findChildByTSysDept(null);
// 创建树的根节点
if (treeList.size() > 0) {
// 获得根节点部门对象
TSysDept dept = (TSysDept) treeList.get(0);
deptTree = new TreeNodeBase("root", dept.getDeptName(), dept
.getDeptId(), false);
// 查询下一级部门列表
treeList = ServiceLocator.getDepartmentService()
.findChildByTSysDept(dept.getDeptId());
for (int i = 0; i < treeList.size(); i++) {
dept = (TSysDept) treeList.get(i);
TreeNode childTree = new TreeNodeBase("child", dept
.getDeptName(), dept.getDeptId(), false);
deptTree.getChildren().add(childTree);
}
}
}
return deptTree;
}
/**
* 获得子部门树
*
* @return
*/
public String getChildDeptTree() {
// 被点中的获取部门节点id
String deptParentId = (String) com.syit.util.FacesUtil
.getRequestParameter("deptParentId");
if (null != deptParentId) {
// 被点中的部门对象
TSysDept dept = ServiceLocator.getDepartmentService().findById(
deptParentId);
// 定位被点中的部门对象
TreeNode selectedNode = deptTree;
selectedNode = orientateNode(selectedNode, dept.getDeptId());
// 如果被点中的部门对象下没有子节点,则查询其子部门
if (selectedNode.getChildCount() == 0) {
// 获取子部门列表
List treeList = ServiceLocator.getDepartmentService()
.findChildByTSysDept(deptParentId);
// 增加子部门
for (int i = 0; i < treeList.size(); i++) {
TSysDept childept = (TSysDept) treeList.get(i);
TreeNode childTree = new TreeNodeBase("child", childept
.getDeptName(), childept.getDeptId(), false);
selectedNode.getChildren().add(childTree);
}
}
// 在被定位的子部门节点下增加部门节点
for (int i = 0; i < selectedNode.getChildCount(); i++) {
// 获得子部门节点
TreeNode deptNode = (TreeNode) selectedNode.getChildren()
.get(i);
if (deptNode.getChildCount() > 0)
deptNode.getChildren().clear();
List childtreeList = ServiceLocator.getDepartmentService()
.findChildByTSysDept(deptNode.getIdentifier());
for (int j = 0; j < childtreeList.size(); j++) {
TSysDept childept = (TSysDept) childtreeList.get(j);
TreeNode childTree = new TreeNodeBase("child", childept
.getDeptName(), childept.getDeptId(), false);
deptNode.getChildren().add(childTree);
}
}
// 向request中存放数据
FacesUtil.getRequest().setAttribute("deptParentId", deptParentId);
FacesUtil.getRequest().setAttribute("deptTree", deptTree);
}
return NavigationResults.DEPARTMENT_TREE;
}
public void setDeptTree(TreeNode deptTree) {
this.deptTree = deptTree;
}
public String getLocationId() {
return locationId;
}
public void setLocationId(String locationId) {
this.locationId = locationId;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -