package com.norteksoft.product.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import com.norteksoft.product.api.entity.Department;
import com.norteksoft.product.api.entity.Workgroup;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.api.entity.User;
import com.norteksoft.product.util.tree.ZTreeNode;
//ztree json util
public class ZTreeUtils{
//拼节点id时为了防止节点id重复,前面加的前缀
private static String COMPANY_="company_";
private static String ALLDEPARTMENT_="allDepartment_";
private static String DEPARTMENT_="department_";
private static String ALLWORKGROUP_="allWorkgroup_";
private static String WORKGROUP_="workgroup_";
private static String USER_="user_";
private static String USERHASNOTDEPARTMENT_="userHasNotDepartment_";
//节点类型
private static String COMPANY="company";//公司
private static String ALLDEPARTMENT="allDepartment";//所有部门
private static String DEPARTMENT="department";//部门
private static String ALLWORKGROUP="allWorkgroup";//所有工作组
private static String WORKGROUP="workgroup";//工作组
private static String USER="user";//员工
private static String USERHASNOTDEPARTMENT="userHasNotDepartment";//无部门节点
//可以考虑在配置文件里配
private static String DEFAULTTREENODEDATA="name,loginName,email,weight,code,description,shortTitle,summary";
//设置树节点显示内容
public static String treeNodeShowContent;//线程不安全
public static void setTreeNodeShowContent(String treeNodeShowContent) {
ZTreeUtils.treeNodeShowContent = treeNodeShowContent;
}
//是否显示无部门人员
private static boolean userWithoutDeptVisible;
public static void setUserWithoutDeptVisible(boolean userWithoutDeptVisible) {
ZTreeUtils.userWithoutDeptVisible = userWithoutDeptVisible;
}
//标准tree的参数
private static String treeNodeData;//设置树节点data
public static void setTreeNodeData(String treeNodeData) {
ZTreeUtils.treeNodeData = treeNodeData;
}
//是否显示在线人员
private static boolean onlineVisible;
public static void setOnlineVisible(boolean onlineVisible) {
ZTreeUtils.onlineVisible = onlineVisible;
}
//显示设定部门
private static String departmentShow;
public static void setDepartmentShow(String departmentShow) {
ZTreeUtils.departmentShow = departmentShow;
}
/**
* ****公司人员树*******************************************************************************************************************
*/
/**
* 公司人员树(异步)
* COMPANY
*/
public static String createCompanyTree(Long companyId,String companyName,String currentId) {
StringBuilder tree = new StringBuilder();
String[] str = currentId.split("_");
if (currentId.equals("0")) {
tree.append(getInitialCompanyTree(companyId,companyName));
}else if(str[0].equals("department")) {
tree.append(getNodesOnExpandOneDepartment(Long.parseLong(str[1])));
}else if(str[0].equals("workgroup")){
tree.append(getNodesOnExpandOneWorkgroup(Long.parseLong(str[1])));
}
return tree.toString();
}
/**
* 只查部门,工作组和没有部门的用户
* @param departments
* @param usersList
* @return
*/
private static Object getInitialCompanyTree(Long companyId, String companyName) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<Department> departments = getSettingDepartment(departmentShow);//得到所有一级部门
List<User> usersList = ApiFactory.getAcsService().getUsersWithoutDepartment();//得到所有无部门人员
List<Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroups();//得到所有一级工作组
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//所有部门节点
addAllDepartmentNode(companyId.toString(),treeNodes,departments);
//封装无部门人员节点
addUserHasNotDepartment(companyId.toString(),treeNodes,usersList);
//封装所有工作组节点
addUserAllWorkgroup(companyId.toString(),treeNodes,workGroups);
return JsonParser.object2Json(treeNodes);
}
//根据部门名字字符串得到部门list
private static List<Department> getDepartmentByNameStr(String departmentShow) {
String[] arr = departmentShow.split(",");
List<Department> list = new ArrayList<Department>();
for(String departmentName : arr){
Department department=ApiFactory.getAcsService().getDepartmentByName(departmentName.trim());
if(department!=null)
list.add(department);
}
return list;
}
//所有部门节点
private static void addAllDepartmentNode(String companyId , List<ZTreeNode> treeNodes,List<Department> departments) {
//"部门"节点
createAllDepartmentNode(companyId,treeNodes,departments);
for(Department d : departments){
List<Department> subDepartments = ApiFactory.getAcsService().getSubDepartmentList(d.getId());//得到子部门
List<User> users = ApiFactory.getAcsService().getUsersByDepartmentId(d.getId());//得到部门下的人
if((subDepartments != null && subDepartments.size() > 0|| users != null && users.size() > 0)){
createDepartmentNodeOpen(d,ALLDEPARTMENT_+companyId,treeNodes);
}else{
createDepartmentNodeClose(d,ALLDEPARTMENT_+companyId,treeNodes);
}
}
}
//封装无部门人员节点
private static void addUserHasNotDepartment(String companyId,List<ZTreeNode> treeNodes, List<User> usersList) {
if(userWithoutDeptVisible){
//封装"无部门人员"节点
createUserHasNotDepartmentNode(companyId,treeNodes,usersList);
//封装人员节点
createUserNode(usersList,USERHASNOTDEPARTMENT_+companyId,treeNodes);
}
}
//封装所有工作组节点
private static void addUserAllWorkgroup(String companyId,List<ZTreeNode> treeNodes, List<Workgroup> workGroups) {
//封装"工作组"节点
createAllWorkgroupNode(companyId.toString(),treeNodes,workGroups);
for(Workgroup w : workGroups){
List<User> users = ApiFactory.getAcsService().getUsersByWorkgroupId(w.getId());
if(workGroups != null && workGroups.size() > 0&&users != null && users.size() > 0){
createWorkgroupNodeOpen(w,ALLWORKGROUP_+companyId,treeNodes);
}else{
createWorkgroupNodeClose(w,ALLWORKGROUP_+companyId,treeNodes);
}
}
}
/**
* 只查某一部门下的子部门和员工
* @param
* @param
* @return
*/
private static Object getNodesOnExpandOneDepartment(Long departmentId) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<Department> subDepartments = ApiFactory.getAcsService().getSubDepartmentList(departmentId);
List<User> users = ApiFactory.getAcsService().getUsersByDepartmentId(departmentId);
//封装此部门下员工
createUserNode(users,DEPARTMENT_+departmentId,treeNodes);
//封装此部门下的子部门
addSubDepartmentsInTheDepartment(departmentId.toString(),treeNodes,subDepartments);
return JsonParser.object2Json(treeNodes);
}
//封装此部门下的子部门
private static void addSubDepartmentsInTheDepartment(String departmentId,List<ZTreeNode> treeNodes, List<Department> subDepartments) {
for (Department d : subDepartments) {
List<User> users = ApiFactory.getAcsService().getUsersByDepartmentId(d.getId());
List<Department> subDepts =ApiFactory.getAcsService().getSubDepartmentList(d.getId());
if ((users != null && users.size() > 0)||(subDepts != null && subDepts.size() > 0)) {
createDepartmentNodeOpen(d,DEPARTMENT_+departmentId,treeNodes);
//封装员工
createUserNode(users,DEPARTMENT_+d.getId(),treeNodes);
//递归封装子部门
addSubDepartmentsInTheDepartment(d.getId().toString(),treeNodes,subDepts);
}else{
createDepartmentNodeClose(d,DEPARTMENT_+departmentId,treeNodes);
}
}
}
/**
* 只查某一工作组下的员工(无子工作组)
* @param
* @param
* @return
*/
private static Object getNodesOnExpandOneWorkgroup(long workgroupId) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<User> users = ApiFactory.getAcsService().getUsersByWorkgroupId(workgroupId);
//封装员工
createUserNode(users,WORKGROUP_+workgroupId,treeNodes);
return JsonParser.object2Json(treeNodes);
}
/**
* ***部门人员树********************************************************************************************************************
*/
/**
* 部门人员树(异步)
* MAN_DEPARTMENT_TREE
*/
public static String createDepartmentUserTree(Long companyId,String companyName,String currentId) {
StringBuilder tree = new StringBuilder();
String[] str = currentId.split("_");
if (currentId.equals("0")) {
tree.append(getInitialDepartmentUserTree(companyId,companyName));
}else if(str[0].equals("department")) {
tree.append(getNodesOnExpandOneDepartment(Long.parseLong(str[1])));
}
return tree.toString();
}
/**
* 只查部门和没有部门的用户
* @param onlineVisible
*/
private static Object getInitialDepartmentUserTree(Long companyId,String companyName) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<Department> departments = getSettingDepartment(departmentShow);//得到所有一级部门
List<User> usersList = ApiFactory.getAcsService().getUsersWithoutDepartment();//得到所有无部门人员
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//所有部门节点
addAllDepartmentNode(companyId.toString(),treeNodes,departments);
//封装无部门人员节点
addUserHasNotDepartment(companyId.toString(),treeNodes,usersList);
return JsonParser.object2Json(treeNodes);
}
/**
* ****工作组人员树*******************************************************************************************************************
*/
/**
* 工作组人员树(异步)
* MAN_DEPARTMENT_TREE
*/
public static String createWorkgroupUserTree(Long companyId,String companyName, String currentId) {
StringBuilder tree = new StringBuilder();
String[] str = currentId.split("_");
if (currentId.equals("0")) {
tree.append(getInitialWorkgroupUserTree(companyId,companyName));
}else if(str[0].equals("workgroup")){
tree.append(getNodesOnExpandOneWorkgroup(Long.parseLong(str[1])));
}
return tree.toString();
}
/**
* 只查工作组和没有部门的用户
* @param onlineVisible
*/
private static Object getInitialWorkgroupUserTree(Long companyId,String companyName) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
List<User> usersList = ApiFactory.getAcsService().getUsersWithoutDepartment();//得到所有无部门人员
List<Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroups();//得到所有一级工作组
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//封装所有工作组节点
addUserAllWorkgroup(companyId.toString(),treeNodes,workGroups);
//封装无部门人员节点
addUserHasNotDepartment(companyId.toString(),treeNodes,usersList);
return JsonParser.object2Json(treeNodes);
}
/**
* ****部门树*******************************************************************************************************************
*/
/**
* 部门树(一下全部加载)
* MAN_DEPARTMENT_TREE
*/
public static String createDepartmentsTree(Long companyId,String companyName, String currentId) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//封装"部门"节点
List<Department> departments = getSettingDepartment(departmentShow);//得到所有一级部门
createAllDepartmentNode(String.valueOf(companyId),treeNodes,departments);
//封装第一层部门节点
addAllDepartmentAndSubDepartmentNode(companyId.toString(),treeNodes,departments);
return JsonParser.object2Json(treeNodes);
}
//所有部门及其子部门节点
private static void addAllDepartmentAndSubDepartmentNode(String companyId,List<ZTreeNode> treeNodes, List<Department> departments) {
//封装第一层部门节点
for(Department d : departments){
List<Department> subDepartments = ApiFactory.getAcsService().getSubDepartmentList(d.getId());;//得到子部门
if((subDepartments != null && subDepartments.size() > 0)){
createDepartmentNodeOpen(d,ALLDEPARTMENT_+companyId,treeNodes);
//封装子部门
addSubDepartmentNode(d.getId().toString(),treeNodes,subDepartments);
}else{
createDepartmentNodeClose(d,ALLDEPARTMENT_+companyId,treeNodes);
}
}
}
//递归封装子部门
private static void addSubDepartmentNode(String departmentId,List<ZTreeNode> treeNodes, List<Department> departments) {
for(Department d : departments){
List<Department> subDepartments = ApiFactory.getAcsService().getSubDepartmentList(d.getId());;//得到子部门
if((subDepartments != null && subDepartments.size() > 0)){
createDepartmentNodeOpen(d,DEPARTMENT_+departmentId,treeNodes);
//封装子部门
addSubDepartmentNode(d.getId().toString(),treeNodes,subDepartments);
}else{
createDepartmentNodeClose(d,DEPARTMENT_+departmentId,treeNodes);
}
}
}
/**
* ***工作组树********************************************************************************************************************
*/
/**
* 工作组树(一下全部加载)
* GROUP_TREE
*/
public static String createWorkgroupsTree(Long companyId,String companyName, String currentId) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//封装"工作组节点"
List<Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroups();
createAllWorkgroupNode(companyId.toString(),treeNodes,workGroups);
//封装第一层工作组节点(只有一层)
addWorkgroupExceptUser(ALLWORKGROUP_+companyId,treeNodes,workGroups);
return JsonParser.object2Json(treeNodes);
}
//封装第一层工作组节点(只有一层)
private static void addWorkgroupExceptUser(String allWorkgroupId,List<ZTreeNode> treeNodes, List<Workgroup> workGroups) {
for(Workgroup w : workGroups){
createWorkgroupNodeClose(w,allWorkgroupId,treeNodes);
}
}
/**
* ***部门和工作组树********************************************************************************************************************
*/
/**
* 部门和工作组树(一下全部加载)
* DEPARTMENT_WORKGROUP_TREE
*/
public static String createDepartmentsAndWorkgroupsTree(Long companyId,String companyName, String currentId) {
List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>();
//公司节点
createCompanyNode(companyId,companyName,treeNodes);
//封装"部门"节点
List<Department> departments = getSettingDepartment(departmentShow);//得到所有一级部门
createAllDepartmentNode(companyId.toString(),treeNodes,departments);
//封装第一层部门节点
addAllDepartmentAndSubDepartmentNode(companyId.toString(),treeNodes,departments);
//封装"工作组节点"
List<Workgroup> workGroups = ApiFactory.getAcsService().getWorkgroups();
createAllWorkgroupNode(companyId.toString(),treeNodes,workGroups);
//封装第一层工作组节点(只有一层)
addWorkgroupExceptUser(ALLWORKGROUP_+companyId,treeNodes,workGroups);
return JsonParser.object2Json(treeNodes);
}
/**
* ***工具/得到各种节点********************************************************************************************************************
*
*/
/**
* 得到公司节点
*
*/
public static void createCompanyNode(Long companyId,String companyName,List<ZTreeNode> treeNodes) {
ZTreeNode company =
new ZTreeNode(COMPANY_+companyId.toString(), "0", getCompanyNodeName(companyName),"true","true",COMPANY,"{\"name\" : \""+companyName+"\" }","root");
treeNodes.add(company);
}
/**
* 得到公司节点的显示名称
*
*/
private static String getCompanyNodeName(String companyName) {
JSONArray array = JSONArray.fromObject((treeNodeShowContent.equals("null")||StringUtils.isEmpty(treeNodeShowContent))?"[{'company':'"+companyName+"'}]":treeNodeShowContent);
JSONObject jsonObj = array.getJSONObject(0);
if(jsonObj.containsKey(COMPANY)){
if(StringUtils.isEmpty(jsonObj.getString(COMPANY))){
return companyName;
}else{
return jsonObj.getString(COMPANY);
}
}
return null;
}
/**
* 得到"部门"节点
*
*/
public static void createAllDepartmentNode(String companyId,List<ZTreeNode> treeNodes,List<Department> departments) {
ZTreeNode allDepartmentNode = null;
if(departments.size()>0){
allDepartmentNode =
new ZTreeNode(ALLDEPARTMENT_+companyId, "company_"+companyId, "部门","true","true",ALLDEPARTMENT,String.valueOf(departments.size()),"department");
}else{
allDepartmentNode =
new ZTreeNode(ALLDEPARTMENT_+companyId, "company_"+companyId, "部门","false","false",ALLDEPARTMENT,"","department");
}
treeNodes.add(allDepartmentNode);
}
/**
* 得到"工作组"节点
*
*/
public static void createAllWorkgroupNode(String companyId,List<ZTreeNode> treeNodes,List<Workgroup> workGroups) {
ZTreeNode allWorkgroupNode = null;
if(workGroups.size()>0){
allWorkgroupNode =
new ZTreeNode(ALLWORKGROUP_+companyId, "company_"+companyId, "工作组","true","true",ALLWORKGROUP,String.valueOf(workGroups.size()),"department");
}else{
allWorkgroupNode =
new ZTreeNode(ALLWORKGROUP_+companyId, "company_"+companyId, "工作组","false","false",ALLWORKGROUP,"","department");
}
treeNodes.add(allWorkgroupNode);
}
/**
* 得到"无部门人员"节点
*
*/
private static void createUserHasNotDepartmentNode(String companyId,List<ZTreeNode> treeNodes,List<User> users) {
ZTreeNode userHasNotDepartmentNode = null;
if(users.size()>0){
userHasNotDepartmentNode =
new ZTreeNode(USERHASNOTDEPARTMENT_+companyId, "company_"+companyId.toString(), "无部门人员","true","true",USERHASNOTDEPARTMENT,String.valueOf(users.size()),"department");
}
treeNodes.add(userHasNotDepartmentNode);
}
/**
* 得到open部门节点
*
*/
public static void createDepartmentNodeOpen(Department d,String parentId ,List<ZTreeNode> treeNodes) {
ZTreeNode department =
new ZTreeNode(DEPARTMENT_+d.getId().toString(), parentId, getNodeShowName(d),"true","true",DEPARTMENT,getNodeData(d),"department");
treeNodes.add(department);
}
/**
* 得到close部门节点
*
*/
private static void createDepartmentNodeClose(Department d, String parentId,List<ZTreeNode> treeNodes) {
ZTreeNode department =
new ZTreeNode(DEPARTMENT_+d.getId().toString(), parentId, getNodeShowName(d),"false","false",DEPARTMENT,getNodeData(d),"department");
treeNodes.add(department);
}
/**
* 得到open工作组节点
*
*/
public static void createWorkgroupNodeOpen(Workgroup w,String parentId ,List<ZTreeNode> treeNodes) {
ZTreeNode workgroup =
new ZTreeNode(WORKGROUP_+w.getId().toString(), parentId, getNodeShowName(w),"true","true",WORKGROUP,getNodeData(w),"department");
treeNodes.add(workgroup);
}
/**
* 得到close工作组节点
*
*/
private static void createWorkgroupNodeClose(Workgroup w, String parentId,List<ZTreeNode> treeNodes) {
ZTreeNode workgroup =
new ZTreeNode(WORKGROUP_+w.getId().toString(), parentId, getNodeShowName(w),"false","false",WORKGROUP,getNodeData(w),"department");
treeNodes.add(workgroup);
}
/**
* 得到员工节点
*
*/
private static void createUserNode(List<User> users, String parentId,List<ZTreeNode> treeNodes) {
ZTreeNode userNode = null;
//得到在线人员
List<Long> onlineUserIds = new ArrayList<Long>();
if(onlineVisible)
onlineUserIds = ApiFactory.getAcsService().getOnlineUserIds();
for(User u : users){
if(onlineVisible&&onlineUserIds.contains(u.getId())){//显示在线人员
userNode =
new ZTreeNode(USER_+u.getId().toString(), parentId, getNodeShowName(u),"false","false",USER,getNodeData(u),"userOnline");
treeNodes.add(userNode);
}else{
userNode =
new ZTreeNode(USER_+u.getId().toString(), parentId, getNodeShowName(u),"false","false",USER,getNodeData(u),"user");
treeNodes.add(userNode);
}
}
}
/**
* 得到节点显示数据
*
*/
public static String getNodeShowName(Object obj) {
String fieldName = "";
if(!treeNodeShowContent.equals("null")&&!StringUtils.isEmpty(treeNodeShowContent)){
JSONArray array = JSONArray.fromObject(treeNodeShowContent);
JSONObject jsonObj = array.getJSONObject(0);
if(jsonObj.containsKey(USER)){
fieldName = jsonObj.getString(USER);
}else if(jsonObj.containsKey(DEPARTMENT)){
fieldName = jsonObj.getString(DEPARTMENT);
}else if(jsonObj.containsKey(WORKGROUP)){
fieldName = jsonObj.getString(WORKGROUP);
}
}
try {
if(containTheField(obj,fieldName)){
return BeanUtils.getFieldValue(obj,StringUtils.isEmpty(fieldName)?"name":fieldName).toString();
}else{
return BeanUtils.getFieldValue(obj,"name").toString();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return "";
}
/**
* 得到节点数据
*
*/
public static String getNodeData(Object obj) {
StringBuilder json = new StringBuilder("{");
String[] str = null;
if(StringUtils.isEmpty(treeNodeData)){
str = DEFAULTTREENODEDATA.split(",");
}else{
str = treeNodeData.split(",");
}
for(int i =0;i<str.length;i++){
try {
if(containTheField(obj,str[i])){
json.append("\""+str[i]+"\" : \""+BeanUtils.getFieldValue(obj, str[i])+"\" ,");
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return json.substring(0, json.length()-1)+"}";
}
/**
* 判断某个类是否含有此属性
*
*/
private static boolean containTheField(Object obj,String fieldName) {
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
if(fieldName.equals(field.getName())){
return true;
}
}
return false;
}
/**
* 得到树的部门
*
*/
private static List<Department> getSettingDepartment(String departmentShow) {
List<Department> departments = null;
if(!StringUtils.isEmpty(departmentShow)&&!departmentShow.equals("undefined")){
departments = getDepartmentByNameStr(departmentShow);
}else{
departments = ApiFactory.getAcsService().getDepartments();//得到所有一级部门
}
return departments;
}
}