package com.norteksoft.product.util; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import com.norteksoft.product.api.AcsService; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.Department; import com.norteksoft.product.api.entity.User; import com.norteksoft.product.api.entity.Workgroup; import com.norteksoft.product.util.tree.ZTreeNode; import com.norteksoft.tags.tree.TreeType; //ztree json util public class ZTreeUtils{ private static AcsService as=null; static{ as=ApiFactory.getAcsService(); } //拼节点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 BRANCH_="branch_"; private static String USERHASNOTDEPARTMENT_="userHasNotDepartment_"; private static String HASWORKGROUPBRANCH_="hasWorkgroupBranch_"; //节点类型 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 BRANCH="branch";//分支机构 private static String USERHASNOTDEPARTMENT="userHasNotDepartment";//无部门节点 private static String HASWORKGROUPBRANCH="hasWorkgroupBranch"; //可以考虑在配置文件里配 private static String USERNODEDATA="id,name,loginName,mainDepartmentId,email,weight,subCompanyId,subCompanyName"; private static String DEPARTMENTNODEDATA="id,name,weight,code,shortTitle,summary,parentDepartmentId,branch,subCompanyId,subCompanyName"; private static String WORKGROUPNODEDATA="id,name,weight,code,description,shortTitle,summary,subCompanyId,subCompanyName"; //设置树节点显示内容 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; } private static boolean showBranch; public static void setShowBranch(boolean showBranch) { ZTreeUtils.showBranch = showBranch; } private static String branchIds; public static void setBranchIds(String branchIds){ ZTreeUtils.branchIds=branchIds; } /** * ****公司人员树******************************************************************************************************************* */ /** * 公司人员树(异步) * 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(currentId,companyId,companyName)); }else if(str[0].equals("department")||str[0].equals("branch")) { tree.append(getNodeInDepartment(Long.parseLong(str[1]),str[0],currentId)); }else if(str[0].equals("userHasNotDepartment")){ tree.append(getNodeInNoDepartment(Long.parseLong(str[1]),str[0],currentId)); }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(String currentId,Long companyId, String companyName) { List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); //公司节点 createCompanyNode(companyId,companyName,treeNodes,true); //所有部门节点 addAllDepartmentNode(companyId.toString(),treeNodes,currentId); //封装所有工作组节点 addUserAllWorkgroup(companyId.toString(),treeNodes); 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=as.getDepartmentByName(departmentName.trim()); if(department!=null) list.add(department); } return list; } //根据部门名字字符串得到部门list private static List<Department> getBranchByIds() { List<Department> list = new ArrayList<Department>(); if(branchIds!=null&&!branchIds.trim().equals("")){ String[] arr = branchIds.split(","); for(String id : arr){ if(id.matches("^[1-9]\\d*")){ Department department=as.getDepartmentById(Long.parseLong(id)); if(department!=null) list.add(department); } } } branchIds=""; return list; } //所有部门节点 private static void addAllDepartmentNode(String companyId , List<ZTreeNode> treeNodes,String currentId) { List<Department> departments=as.getDepartments(); createAllDepartmentNode(companyId.toString(),treeNodes,departments); for(Department dept:departments){ ZTreeNode company=null; if(dept.getBranch()){ company = new ZTreeNode("branch_"+dept.getId().toString(),ALLDEPARTMENT_+companyId, dept.getName(),"false","false",BRANCH,object2Json(dept),"branch"); }else{ String nodeName=dept.getName(); if(showBranch&&ContextUtils.hasBranch()){ dept.setName(dept.getName()+"("+dept.getSubCompanyName()+")"); } company = new ZTreeNode("department_"+dept.getId().toString(),ALLDEPARTMENT_+companyId, nodeName,"false","false",DEPARTMENT,object2Json(dept),"department"); } if(haschlid(dept)){ company.setIsParent("true"); }else{ company.setIsParent("false"); } treeNodes.add(company); } //封装无部门人员节点 addUserHasNotDepartment(currentId,companyId.toString(),treeNodes); } //封装无部门人员节点 private static ZTreeNode addUserHasNotDepartment(String currentId,String id,List<ZTreeNode> treeNodes) { ZTreeNode userHasNotDepartmentNode = null; if(userWithoutDeptVisible){ List<User> users=null; if(currentId.equals("0")){ users=as.getUsersWithoutDepartment(); userHasNotDepartmentNode = new ZTreeNode(USERHASNOTDEPARTMENT_+id, COMPANY_+id, "无部门人员","false","false",USERHASNOTDEPARTMENT,"{\"name\" : \"\" }","department"); }else{ users=as.getUsersWithoutBranch(Long.valueOf(id)); userHasNotDepartmentNode = new ZTreeNode(USERHASNOTDEPARTMENT_+currentId.split("_")[1], currentId, "无部门人员","false","fasle",USERHASNOTDEPARTMENT,"{\"name\" : \"无部门人员\" }","department"); } if(users.size()>0){ userHasNotDepartmentNode.setIsParent("true"); treeNodes.add(userHasNotDepartmentNode); } } return userHasNotDepartmentNode; } //封装所有工作组节点 private static void addUserAllWorkgroup(String companyId,List<ZTreeNode> treeNodes) { List<Department> depts=as.getDepartmentIfHasWorkGroup(); //封装公司下工作组节点 List<Workgroup> workGroups2=as.getWorkgroups(); for(int i=0;i<workGroups2.size();i++){ List<User> users = as.getUsersByWorkgroupId(workGroups2.get(i).getId()); if(workGroups2 != null && workGroups2.size() > 0&&users != null && users.size() > 0){ createWorkgroupNodeOpen(workGroups2.get(i),ALLWORKGROUP_+companyId,treeNodes); }else{ createWorkgroupNodeClose(workGroups2.get(i),ALLWORKGROUP_+companyId,treeNodes); } } //封装"工作组"节点 createAllWorkgroupNode(companyId.toString(),treeNodes,depts); String pId=""; for(Department dept:depts){ pId=HASWORKGROUPBRANCH_+dept.getId(); treeNodes.add(new ZTreeNode(pId,ALLWORKGROUP_+companyId, dept.getName(),"true","true",HASWORKGROUPBRANCH,object2Json(dept),"branch")); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); for(Workgroup w : workGroups){ List<User> users = as.getUsersByWorkgroupId(w.getId()); if(workGroups != null && workGroups.size() > 0&&users != null && users.size() > 0){ createWorkgroupNodeOpen(w,pId,treeNodes); }else{ createWorkgroupNodeClose(w,pId,treeNodes); } } } } //封装工作组用户树的所有工作组节点 private static void addAllWorkgroup(String companyId,List<ZTreeNode> treeNodes, List<Department> depts,List<Workgroup> companyWorkgroups) { for(Workgroup wg:companyWorkgroups){ List<User> users = as.getUsersByWorkgroupId(wg.getId()); if(companyWorkgroups != null && companyWorkgroups.size() > 0&&users != null && users.size() > 0){ createWorkgroupNodeOpen(wg,COMPANY_+companyId,treeNodes); }else{ createWorkgroupNodeClose(wg,COMPANY_+companyId,treeNodes); } } String pId=""; for(Department dept:depts){ pId=HASWORKGROUPBRANCH_+dept.getId(); treeNodes.add(new ZTreeNode(pId,COMPANY_+companyId, dept.getName(),"true","true",HASWORKGROUPBRANCH,object2Json(dept),"branch")); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); for(Workgroup w : workGroups){ List<User> users = as.getUsersByWorkgroupId(w.getId()); if(workGroups != null && workGroups.size() > 0&&users != null && users.size() > 0){ createWorkgroupNodeOpen(w,pId,treeNodes); }else{ createWorkgroupNodeClose(w,pId,treeNodes); } } } } /** * 获取部门或分支机构下的所有节点 * @param * @param * @return */ private static Object getNodeInDepartment(Long departmentId,String departmentType,String currentId) { List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); List<Department> departments=as.getSubDepartmentList(departmentId); if(departmentType.equals("department")){ addUserNode(treeNodes,departmentId,departmentType,currentId); } ZTreeNode node=null; for(Department dept:departments){ if(dept.getBranch()){ node = new ZTreeNode("branch_"+dept.getId().toString(),currentId, dept.getName(),"false","false",BRANCH,object2Json(dept),"branch"); }else{ String nodeName=dept.getName(); if(showBranch&&ContextUtils.hasBranch()){ dept.setName(dept.getName()+"("+dept.getSubCompanyName()+")"); } node = new ZTreeNode("department_"+dept.getId().toString(),currentId, nodeName,"false","false",DEPARTMENT,object2Json(dept),"department"); } if(haschlid(dept)){ node.setIsParent("true"); }else{ node.setIsParent("false"); } treeNodes.add(node); } if(departmentType.equals("branch")){ //封装无部门人员节点 addUserHasNotDepartment(currentId,departmentId.toString(),treeNodes); } return JsonParser.object2Json(treeNodes); } private static void addUserNode(List<ZTreeNode> treeNodes, Long id, String departmentType, String currentId) { List<User> users=null; if(departmentType.equals("userHasNotDepartment")){ if(id.equals(ContextUtils.getCompanyId())){ users=as.getUsersWithoutDepartment(); }else{ users=as.getUsersWithoutBranch(id); } }else if(departmentType.equals("department")){ users=as.getUsersByDepartmentId(id); } ZTreeNode node=null; for(User user:users){ String nodeName=user.getName(); if(showBranch&&ContextUtils.hasBranch()){ user.setName(user.getName()+"("+user.getSubCompanyName()+")"); } node=new ZTreeNode(USER_+user.getId().toString(),currentId, nodeName,"false","false",USER,object2Json(user),"user"); if(onlineVisible){ List<Long> ids=ApiFactory.getAcsService().getOnlineUserIds(); if(ids.contains(user.getId())){ node.setIconSkin("userOnline"); } } treeNodes.add(node); } } //封装此部门下的子部门 /* private static void addSubDepartmentsInTheDepartment(String departmentId,List<ZTreeNode> treeNodes, List<Department> subDepartments) { for (Department d : subDepartments) { List<Department> subDepts =as.getSubDepartmentList(d.getId()); List<User> users=as.getUsersByDepartmentId(d.getId()); if ((users != null && users.size() > 0)||(subDepts != null && subDepts.size() > 0)) { createDepartmentNodeOpen(d,DEPARTMENT_+departmentId,treeNodes); }else{ createDepartmentNodeClose(d,DEPARTMENT_+departmentId,treeNodes); } } }*/ /** * 只查某一工作组下的员工(无子工作组) * @param * @param * @return */ private static Object getNodesOnExpandOneWorkgroup(long workgroupId) { List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); List<User> users = as.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,currentId)); }else if(str[0].equals("department")||str[0].equals("branch")) { tree.append(getNodeInDepartment(Long.parseLong(str[1]),str[0],currentId)); }else if(str[0].equals("userHasNotDepartment")){ tree.append(getNodeInNoDepartment(Long.parseLong(str[1]),str[0],currentId)); } return tree.toString(); } //获取无部门人员下所有人员 private static Object getNodeInNoDepartment(Long id ,String type,String currentId) { List<ZTreeNode> treeNodes=new ArrayList<ZTreeNode>(); addUserNode(treeNodes,id,type, currentId); return JsonParser.object2Json(treeNodes); } /** * 初始化部门人员树 * @param companyId,companyName */ private static Object getInitialDepartmentUserTree(Long companyId,String companyName,String currentId) { List<Department> lists=getBranchByIds(); List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); if(lists.size()==0){ List<Department> departments=as.getDepartments(); boolean companyNodeHasSubNode=false; List<User> user=as.getUsersWithoutDepartment(); if(departments.size()>0||userWithoutDeptVisible?(user.size()>0):false){ companyNodeHasSubNode=true; } //集团节点 createCompanyNode(companyId,companyName,treeNodes,companyNodeHasSubNode); //封装集团下部门和分支机构节点和无部门人员节点 createNodeInCompany(companyId,companyName,treeNodes,currentId); return JsonParser.object2Json(treeNodes); }else{ for(Department dept:lists){ ZTreeNode company=null; if(dept.getBranch()){ company = new ZTreeNode("branch_"+dept.getId().toString(),"0", dept.getName(),"false","false",BRANCH,object2Json(dept),"branch"); }else{ String nodeName=dept.getName(); if(showBranch&&ContextUtils.hasBranch()){ dept.setName(dept.getName()+"("+dept.getSubCompanyName()+")"); } company = new ZTreeNode("department_"+dept.getId().toString(),"0", nodeName,"false","false",DEPARTMENT,object2Json(dept),"department"); } if(haschlid(dept)){ company.setIsParent("true"); }else{ company.setIsParent("false"); } treeNodes.add(company); } return JsonParser.object2Json(treeNodes); } } /* * 创建集团下部门,分支机构和无部门节点 */ private static void createNodeInCompany(Long companyId, String companyName, List<ZTreeNode> treeNodes,String currentId) { List<Department> departments=as.getDepartments(); for(Department dept:departments){ ZTreeNode company=null; if(dept.getBranch()){ company = new ZTreeNode(BRANCH_+dept.getId().toString(),COMPANY_+companyId, dept.getName(),"false","false",BRANCH,object2Json(dept),BRANCH); }else{ String nodeName=dept.getName(); if(showBranch&&ContextUtils.hasBranch()){ dept.setName(dept.getName()+"("+dept.getSubCompanyName()+")"); } company = new ZTreeNode(DEPARTMENT_+dept.getId().toString(),COMPANY_+companyId, nodeName,"false","false",DEPARTMENT,object2Json(dept),DEPARTMENT); } if(haschlid(dept)){ company.setIsParent("true"); }else{ company.setIsParent("false"); } treeNodes.add(company); } //封装无部门人员节点 addUserHasNotDepartment(currentId,companyId.toString(),treeNodes); } private static boolean haschlid(Department dept){ List<Department> departments=as.getSubDepartmentList(dept.getId()); List<User> users=new ArrayList<User>(); if(dept.getBranch()){ if(userWithoutDeptVisible){ users = as.getUsersWithoutBranch(dept.getId()); } }else{ users = as.getUsersByDepartmentId(dept.getId()); } if(departments!=null&&departments.size()>0||users!=null&&users.size()>0){ return true; } return false; } /** * 工作组人员树(异步) * MAN_DEPARTMENT_TREE */ public static String createWorkgroupUserTree(Long companyId,String companyName, String currentId) { // TODO Auto-generated method stub StringBuilder tree = new StringBuilder(); String[] str = currentId.split("_"); if (currentId.equals("0")) { tree.append(getInitialWorkgroupUserTree(currentId,companyId,companyName)); }else if(str[0].equals("workgroup")){ tree.append(getNodesOnExpandOneWorkgroup(Long.parseLong(str[1]))); } return tree.toString(); } /** * 只查工作组和没有部门的用户 * @param onlineVisible */ private static Object getInitialWorkgroupUserTree(String currentId,Long companyId,String companyName) { List<Department> lists=getBranchByIds(); List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); if(lists.size()==0){ List<Department> depts=as.getDepartmentIfHasWorkGroup(); List<Workgroup> workGroups = as.getWorkgroups();//得到所有一级工作组 //判断根节点是不是父节点 boolean companyNodeHasSubNode=false; if(depts.size()>0||workGroups.size()>0){ companyNodeHasSubNode=true; } //公司节点 createCompanyNode(companyId,companyName,treeNodes,companyNodeHasSubNode); //封装所有工作组节点 addAllWorkgroup(companyId.toString(),treeNodes,depts,workGroups); return JsonParser.object2Json(treeNodes); }else{ String pId=""; List<Department> branchs=new ArrayList<Department>(); lists=getSubBranch(branchs,lists); for(Department dept:branchs){ pId=HASWORKGROUPBRANCH_+dept.getId(); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); if(workGroups.size()>0){ treeNodes.add(new ZTreeNode(pId,"0", dept.getName(),"true","true",HASWORKGROUPBRANCH,object2Json(dept),"branch")); }else{ treeNodes.add(new ZTreeNode(pId,"0", dept.getName(),"false","false",HASWORKGROUPBRANCH,object2Json(dept),"branch")); } for(Workgroup w : workGroups){ List<User> users = as.getUsersByWorkgroupId(w.getId()); if(workGroups != null && workGroups.size() > 0&&users != null && users.size() > 0){ createWorkgroupNodeOpen(w,pId,treeNodes); }else{ createWorkgroupNodeClose(w,pId,treeNodes); } } } return JsonParser.object2Json(treeNodes); } } private static List<Department> getSubBranch(List<Department> branchs,List<Department> lists) { for(Department dept:lists){ if(dept.getBranch()){ branchs.add(dept); } getSubBranch(branchs,as.getSubDepartmentList(dept.getId())); } return null; } /** * 部门树(一下全部加载) * MAN_DEPARTMENT_TREE */ public static String createDepartmentsTree(Long companyId,String companyName, String currentId) { StringBuilder tree = new StringBuilder(); String[] str = currentId.split("_"); if (currentId.equals("0")) { tree.append(getInitialDepartmentTree(companyId,companyName,currentId)); }else if(str[0].equals("department")||str[0].equals("branch")) { tree.append(getSubDepartmentNodes(Long.parseLong(str[1]),str[0],currentId)); } return tree.toString(); } /* * 部门树 点击部门节点时加载部门 */ private static Object getSubDepartmentNodes(long departmentId, String departmentType,String currentId) { List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); List<Department> departments=as.getSubDepartmentList(departmentId); ZTreeNode node=null; for(Department dept:departments){ if(dept.getBranch()){ node = new ZTreeNode(BRANCH_+dept.getId().toString(),currentId, dept.getName(),"false","false",BRANCH,object2Json(dept),BRANCH); }else{ String nodeName=dept.getName(); if(showBranch&&ContextUtils.hasBranch()){ dept.setName(dept.getName()+"("+dept.getSubCompanyName()+")"); } node = new ZTreeNode(DEPARTMENT_+dept.getId().toString(),currentId, nodeName,"false","false",DEPARTMENT,object2Json(dept),DEPARTMENT); } List<Department> depts=as.getSubDepartmentList(dept.getId()); if(depts!=null&&depts.size()>0){ node.setIsParent("true"); } treeNodes.add(node); } return JsonParser.object2Json(treeNodes); } private static Object getInitialDepartmentTree(Long companyId, String companyName, String currentId) { List<Department> lists=getBranchByIds(); List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); if(lists.size()==0){ List<Department> departments=as.getDepartments(); boolean companyNodeHasSubNode=false; if(departments.size()>0){ companyNodeHasSubNode=true; } //公司节点 createCompanyNode(companyId,companyName,treeNodes,companyNodeHasSubNode); addAllDepartment(COMPANY_+companyId.toString(),treeNodes,departments); return JsonParser.object2Json(treeNodes); }else{ for(Department d : lists){ List<Department> subDepartments = as.getSubDepartmentList(d.getId());//得到子部门 if((subDepartments != null && subDepartments.size() > 0)){ createDepartmentNodeOpen(d,"0",treeNodes); }else{ createDepartmentNodeClose(d,"0",treeNodes); } } return JsonParser.object2Json(treeNodes); } } //当前部门下的子部门节点 private static void addAllDepartment(String pId,List<ZTreeNode> treeNodes, List<Department> departments) { for(Department d : departments){ List<Department> subDepartments = as.getSubDepartmentList(d.getId());//得到子部门 if((subDepartments != null && subDepartments.size() > 0)){ createDepartmentNodeOpen(d,pId,treeNodes); }else{ createDepartmentNodeClose(d,pId,treeNodes); } } } /** * 工作组树 * GROUP_TREE */ public static String createWorkgroupsTree(Long companyId,String companyName, String currentId) { // TODO Auto-generated method stub List<Department> lists=getBranchByIds(); List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); if(lists.size()==0){ List<Workgroup> workGroups = as.getAllWorkgroups(); boolean companyNodeHasSubNode=false; if(workGroups.size()>0){ companyNodeHasSubNode=true; } //公司节点 createCompanyNode(companyId,companyName,treeNodes,companyNodeHasSubNode); //封装公司下工作组节点 List<Workgroup> workGroups2=as.getWorkgroups(); for(int i=0;i<workGroups2.size();i++){ createWorkgroupNodeClose(workGroups2.get(i),COMPANY_+companyId.toString(),treeNodes); } //封装"工作组节点" List<Department> depts=as.getDepartmentIfHasWorkGroup(); addWorkgroupExceptUser(COMPANY_+companyId,treeNodes,depts); return JsonParser.object2Json(treeNodes); }else{ String pId=""; List<Department> branchs=new ArrayList<Department>(); lists=getSubBranch(branchs,lists); for(Department dept:branchs){ pId=HASWORKGROUPBRANCH_+dept.getId(); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); if(workGroups.size()>0){ treeNodes.add(new ZTreeNode(pId,"0", dept.getName(),workGroups.size()>0?"true":"false",workGroups.size()>0?"true":"false",HASWORKGROUPBRANCH,object2Json(dept),"branch")); for(Workgroup w : workGroups){ createWorkgroupNodeClose(w,pId,treeNodes); } } } return JsonParser.object2Json(treeNodes); } } //封装工作组树的工作组节点 private static void addWorkgroupExceptUser(String pid,List<ZTreeNode> treeNodes, List<Department> depts) { String pId=""; for(Department dept:depts){ pId=HASWORKGROUPBRANCH_+dept.getId(); treeNodes.add(new ZTreeNode(pId,pid, dept.getName(),"true","true",HASWORKGROUPBRANCH,object2Json(dept),"branch")); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); for(Workgroup w : workGroups){ createWorkgroupNodeClose(w,pId,treeNodes); } } } /** * 部门和工作组树(异步) * DEPARTMENT_WORKGROUP_TREE */ public static String createDepartmentsAndWorkgroupsTree(Long companyId,String companyName, String currentId) { // TODO Auto-generated method stub StringBuilder tree = new StringBuilder(); String[] str = currentId.split("_"); if (currentId.equals("0")) { tree.append(getInitialDepartmentsAndWorkgroupsTree(currentId,companyId,companyName)); }else if(str[0].equals("department")||str[0].equals("branch")) { tree.append(getSubDepartmentNodes(Long.parseLong(str[1]),str[0],currentId)); } return tree.toString(); } private static Object getInitialDepartmentsAndWorkgroupsTree( String currentId, Long companyId, String companyName) { List<ZTreeNode> treeNodes = new ArrayList<ZTreeNode>(); List<Department> departments = getSettingDepartment(departmentShow);//得到所有一级部门 List<Department> depts=as.getDepartmentIfHasWorkGroup();//得到所有含有工作组分支机构 //公司节点 createCompanyNode(companyId,companyName,treeNodes,true); //封装"部门"节点 createAllDepartmentNode(companyId.toString(),treeNodes,departments); //封装第一层部门节点 addAllDepartment(ALLDEPARTMENT_+companyId.toString(),treeNodes,departments); //封装公司下工作组节点 List<Workgroup> workGroups2=as.getWorkgroups(); for(int i=0;i<workGroups2.size();i++){ createWorkgroupNodeClose(workGroups2.get(i),ALLWORKGROUP_+companyId.toString(),treeNodes); } //封装"工作组节点" createAllWorkgroupNode(companyId.toString(),treeNodes,depts); String pId=""; for(Department dept:depts){ pId=HASWORKGROUPBRANCH_+dept.getId(); treeNodes.add(new ZTreeNode(pId,ALLWORKGROUP_+companyId, dept.getName(),"true","true",HASWORKGROUPBRANCH,object2Json(dept),"branch")); List<Workgroup> workGroups=as.getWorkgroupsByBranchId(dept.getId()); for(Workgroup w : workGroups){ createWorkgroupNodeClose(w,pId,treeNodes); } } return JsonParser.object2Json(treeNodes); } /** * 得到公司节点 * */ public static void createCompanyNode(Long companyId,String companyName,List<ZTreeNode> treeNodes,boolean companyNodeHasSubNode) { ZTreeNode company = new ZTreeNode(COMPANY_+companyId.toString(), "0", companyName,"true","true",COMPANY,"{\"name\" : \""+companyName+"\" }","root"); if(!companyNodeHasSubNode){ company.setIsParent("false"); } treeNodes.add(company); } /** * 得到"部门"节点 * */ 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,"{\"name\" : \"所有部门\" }",DEPARTMENT); }else{ allDepartmentNode = new ZTreeNode(ALLDEPARTMENT_+companyId, COMPANY_+companyId, "部门","false","false",ALLDEPARTMENT,"{\"name\" : \"所有部门\" }",DEPARTMENT); } treeNodes.add(allDepartmentNode); } /** * 得到"工作组"节点 * */ public static void createAllWorkgroupNode(String companyId,List<ZTreeNode> treeNodes,List<Department> depts) { if(depts.size()>0){ treeNodes.add(new ZTreeNode(ALLWORKGROUP_+companyId,COMPANY_+companyId, "工作组","true","true",ALLWORKGROUP,"{\"name\" : \"所有工作组\" }","department")); }else{ treeNodes.add(new ZTreeNode(ALLWORKGROUP_+companyId,COMPANY_+companyId, "工作组","false","false",ALLWORKGROUP,"{\"name\" : \"所有工作组\" }","department")); } } /** * 得到open部门节点 * */ public static void createDepartmentNodeOpen(Department d,String parentId ,List<ZTreeNode> treeNodes) { ZTreeNode department = null; if(d.getBranch()){ department=new ZTreeNode(BRANCH_+d.getId().toString(), parentId, d.getName(),"false","true",BRANCH,object2Json(d),BRANCH); }else{ String nodeName=d.getName(); if(showBranch&&ContextUtils.hasBranch()){ d.setName(d.getName()+"("+d.getSubCompanyName()+")"); } department=new ZTreeNode(DEPARTMENT_+d.getId().toString(), parentId, nodeName,"false","true",DEPARTMENT,object2Json(d),DEPARTMENT); } treeNodes.add(department); } /** * 得到close部门节点 * */ private static void createDepartmentNodeClose(Department d, String parentId,List<ZTreeNode> treeNodes) { ZTreeNode department = null; if(d.getBranch()){ department=new ZTreeNode(BRANCH_+d.getId().toString(), parentId, d.getName(),"false","false",BRANCH,object2Json(d),BRANCH); }else{ String nodeName=d.getName(); if(showBranch&&ContextUtils.hasBranch()){ d.setName(d.getName()+"("+d.getSubCompanyName()+")"); } department=new ZTreeNode(DEPARTMENT_+d.getId().toString(), parentId, nodeName,"false","false",DEPARTMENT,object2Json(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, w.getName(),"true","true",WORKGROUP,object2Json(w),WORKGROUP); treeNodes.add(workgroup); } /** * 得到close工作组节点 * */ private static void createWorkgroupNodeClose(Workgroup w, String parentId,List<ZTreeNode> treeNodes) { ZTreeNode workgroup = new ZTreeNode(WORKGROUP_+w.getId().toString(), parentId, w.getName(),"false","false",WORKGROUP,object2Json(w),WORKGROUP); 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 = as.getOnlineUserIds(); for(User u : users){ String nodeName=u.getName(); if(showBranch&&ContextUtils.hasBranch()){ u.setName(u.getName()+"("+u.getSubCompanyName()+")"); } if(onlineVisible&&onlineUserIds.contains(u.getId())){//显示在线人员 userNode = new ZTreeNode(USER_+u.getId().toString(), parentId, nodeName,"false","false",USER,object2Json(u),"userOnline"); treeNodes.add(userNode); }else{ userNode = new ZTreeNode(USER_+u.getId().toString(), parentId, nodeName,"false","false",USER,object2Json(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) { String DEFAULTTREENODEDATA=null; StringBuilder json = new StringBuilder("{"); String[] str = null; if(obj instanceof User){ DEFAULTTREENODEDATA=USERNODEDATA; }else if(obj instanceof Department){ DEFAULTTREENODEDATA=DEPARTMENTNODEDATA; }else if(obj instanceof Workgroup){ DEFAULTTREENODEDATA=WORKGROUPNODEDATA; }else{ throw new RuntimeException("参数错误! 请传入User Department Workgroup 对象"); } if(StringUtils.isEmpty(treeNodeData)||treeNodeData.equals("undefined")){ str = DEFAULTTREENODEDATA.split(","); }else{ str = treeNodeData.split(","); } for(int i =0;i<str.length;i++){ try { if(containTheField(obj,str[i])){ if(str[i].equals("subCompanyName")){ Object o=BeanUtils.getFieldValue(obj,"subCompanyId"); if(o!=null&&o instanceof Long){ json.append("\""+str[i]+"\" : \""+as.getDepartmentById((Long)(o)).getName()+"\" ,"); }else{ json.append("\""+str[i]+"\" : \""+ContextUtils.getCompanyName()+"\" ,"); } }else if(str[i].equals("parentDepartmentId")){ Department d=((Department)obj).getParent(); if(d!=null){ json.append("\""+str[i]+"\" : \""+d.getId()+"\" ,"); } }else{ 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")&&!departmentShow.equals("null")){ departments = getDepartmentByNameStr(departmentShow); }else{ departments = as.getDepartments();//得到所有一级部门 } return departments; } private static String object2Json(Object obj){ return getNodeData(obj); } public static String getSearchTreeWillOpenNodes(TreeType treeType, String searchValue) { switch(treeType) { case COMPANY: return getMsgByCompany(searchValue); case MAN_DEPARTMENT_TREE: return getMsgByDepartmentUser(searchValue); case MAN_GROUP_TREE: return getMsgByWorkgroupUser(searchValue); case DEPARTMENT_TREE: return getMsgByDepartment(searchValue); case GROUP_TREE: return getMsgByWorkgroup(searchValue); case DEPARTMENT_WORKGROUP_TREE: return getMsgByDepartmentWorkgroup(searchValue); } return null; } //递归查找需要展开的部门节点ID(部门树情况) private static boolean getWillOpenNodeByDepartment(Map<String, Integer> nodeIds, Department dept, List<Department> ds) { boolean isOpen=false; String type=DEPARTMENT_; List<Department> depts=as.getSubDepartmentList(dept.getId()); if(dept.getBranch()){ type=BRANCH_; } if(contains_dept(depts, ds)){ isOpen=true; } for(Department d:depts){ if(isOpen){ getWillOpenNodeByDepartment(nodeIds,d,ds); }else{ isOpen=getWillOpenNodeByDepartment(nodeIds,d,ds); } } if(isOpen){ nodeIds.put(type+dept.getId(), -1); } return isOpen; } //递归查找需要展开的部门节点ID(人员树情况) private static boolean getWillOpenNodeByDepartment(Map<String,Integer> nodeIds,long deptId,List<User> users,Integer index) { Department dept=as.getDepartmentById(deptId); boolean isOpen=false; List<Department> depts=null; String type=DEPARTMENT_; List<User> us=null; if(dept.getBranch()){ type=BRANCH_; us=as.getUsersWithoutBranch(deptId); depts=as.getSubDepartmentList(deptId); if(userWithoutDeptVisible&&us!=null&&us.size()>0&&contains(users,us)){ nodeIds.put(USERHASNOTDEPARTMENT_+dept.getId(),index+1); isOpen=true; } }else{ us=as.getUsersByDepartmentId(deptId); if(us!=null&&us.size()>0&&contains(users,us)){ isOpen=true; } } depts=as.getSubDepartmentList(deptId); for(Department d:depts){ if(isOpen){ getWillOpenNodeByDepartment(nodeIds,d.getId(),users,index+1); }else{ isOpen=getWillOpenNodeByDepartment(nodeIds,d.getId(),users,index+1); } } if(isOpen){ nodeIds.put(type+deptId,index); } return isOpen; } private static void getWillOpenNodeByWorkgroup(Map<String,Integer> nodeIds,List<User> users){ List<Workgroup> workgroups=as.getAllWorkgroups(); List<User> us = new ArrayList<User>(); for(Workgroup w:workgroups){ us=as.getUsersByWorkgroupId(w.getId()); if(us!=null&&!us.isEmpty()&&contains(us ,users)){ nodeIds.put(WORKGROUP_+w.getId(), -1); } } } private static boolean contains(List<User> users, List<User> us) { for(User user:users){ if(us.contains(user)){ return true; } } return false; } private static boolean contains_dept(List<Department> depts, List<Department> ds) { for(Department d:depts){ if(ds.contains(d)){ return true; } } return false; } /* * 获取查询部门树所需节点 */ private static String getMsgByDepartment(String searchValue){ StringBuilder sb=new StringBuilder("["); Map<String,Integer> nodeIds=new HashMap<String,Integer>(); List<Department> ds=as.getDepartmentsBySearchValue(searchValue); List<Department> depts=as.getDepartments(); for(Department dept:depts){ getWillOpenNodeByDepartment(nodeIds,dept,ds); } Iterator<Entry<String, Integer>> i=nodeIds.entrySet().iterator(); sb.append("{"); while(i.hasNext()){ Entry<String, Integer> e=i.next(); sb.append(e.getKey()+":"+e.getValue()+","); } if(sb.length()>2){ sb.replace(sb.length()-1, sb.length(),"}"); }else{ sb.append("}"); } sb.append(",{"); for(int n=0;n<ds.size();n++){ if(ds.get(n).getBranch()){ sb.append(BRANCH_+ds.get(n).getId()+":-1"+","); }else{ sb.append(DEPARTMENT_+ds.get(n).getId()+":-1"+","); } } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } /* * 获取查询工作组树所需节点 */ private static String getMsgByWorkgroup(String searchValue){ List<Workgroup> wgs=as.getWorkGroupsBySearchValue(searchValue); StringBuilder sb=new StringBuilder("[{},{"); for(int n=0;n<wgs.size();n++){ sb.append(WORKGROUP_+wgs.get(n).getId()+":-1"+","); } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } /* * 获取查询工作组部门树所需节点 */ private static String getMsgByDepartmentWorkgroup(String searchValue){ StringBuilder sb=new StringBuilder("["); Map<String,Integer> nodeIds=new HashMap<String,Integer>(); List<Department> ds=as.getDepartmentsBySearchValue(searchValue); List<Workgroup> wgs=as.getWorkGroupsBySearchValue(searchValue); List<Department> depts=as.getDepartments(); for(Department dept:depts){ getWillOpenNodeByDepartment(nodeIds,dept,ds); } Iterator<Entry<String, Integer>> i=nodeIds.entrySet().iterator(); sb.append("{"); while(i.hasNext()){ Entry<String, Integer> e=i.next(); sb.append(e.getKey()+":"+e.getValue()+","); } if(sb.length()>2){ sb.replace(sb.length()-1, sb.length(),"}"); }else{ sb.append("}"); } sb.append(",{"); for(int n=0;n<ds.size();n++){ if(ds.get(n).getBranch()){ sb.append(BRANCH_+ds.get(n).getId()+":-1"+","); }else{ sb.append(DEPARTMENT_+ds.get(n).getId()+":-1"+","); } } for(int n=0;n<wgs.size();n++){ sb.append(WORKGROUP_+wgs.get(n).getId()+":-1"+","); } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } /* * 获取查询公司树所需节点 */ private static String getMsgByCompany(String searchValue){ StringBuilder sb=new StringBuilder("["); Map<String,Integer> nodeIds=new HashMap<String,Integer>(); List<User> users=as.getUsersBySearchValue(searchValue); List<Department> depts=as.getDepartments(); for(Department dept:depts){ getWillOpenNodeByDepartment(nodeIds,dept.getId(),users,1); } List<User> nodeDeptUsers=as.getUsersWithoutDepartment(); if(userWithoutDeptVisible&&nodeDeptUsers!=null&&!nodeDeptUsers.isEmpty()&&contains(users,nodeDeptUsers)){ nodeIds.put(USERHASNOTDEPARTMENT_+ContextUtils.getCompanyId(), 0); } getWillOpenNodeByWorkgroup(nodeIds,users); Iterator<Entry<String, Integer>> i=nodeIds.entrySet().iterator(); sb.append("{"); while(i.hasNext()){ Entry<String, Integer> e=i.next(); sb.append(e.getKey()+":"+e.getValue()+","); } if(sb.length()>2){ sb.replace(sb.length()-1, sb.length(),"}"); }else{ sb.append("}"); } sb.append(",{"); for(int n=0;n<users.size();n++){ sb.append(USER_+users.get(n).getId()+":-1"+","); } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } /* * 获取查询部门人员树所需节点 */ private static String getMsgByDepartmentUser(String searchValue){ StringBuilder sb=new StringBuilder("["); Map<String,Integer> nodeIds=new HashMap<String,Integer>(); List<User> users=as.getUsersBySearchValue(searchValue); List<Department> depts=as.getDepartments(); for(Department dept:depts){ getWillOpenNodeByDepartment(nodeIds,dept.getId(),users,1); } List<User> nodeDeptUsers=as.getUsersWithoutDepartment(); if(userWithoutDeptVisible&&nodeDeptUsers!=null&&!nodeDeptUsers.isEmpty()&&contains(users,nodeDeptUsers)){ nodeIds.put(USERHASNOTDEPARTMENT_+ContextUtils.getCompanyId(), 0); } Iterator<Entry<String, Integer>> i=nodeIds.entrySet().iterator(); sb.append("{"); while(i.hasNext()){ Entry<String, Integer> e=i.next(); sb.append(e.getKey()+":"+e.getValue()+","); } if(sb.length()>2){ sb.replace(sb.length()-1, sb.length(),"}"); }else{ sb.append("}"); } sb.append(",{"); for(int n=0;n<users.size();n++){ sb.append(USER_+users.get(n).getId()+":-1"+","); } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } /* * 获取查询工作组人员树所需节点 */ private static String getMsgByWorkgroupUser(String searchValue){ StringBuilder sb=new StringBuilder("["); Map<String,Integer> nodeIds=new HashMap<String,Integer>(); List<User> users=as.getUsersBySearchValue(searchValue); getWillOpenNodeByWorkgroup(nodeIds,users); Iterator<Entry<String, Integer>> i=nodeIds.entrySet().iterator(); sb.append("{"); while(i.hasNext()){ Entry<String, Integer> e=i.next(); sb.append(e.getKey()+":"+e.getValue()+","); } if(sb.length()>2){ sb.replace(sb.length()-1, sb.length(),"}"); }else{ sb.append("}"); } sb.append(",{"); for(int n=0;n<users.size();n++){ sb.append(USER_+users.get(n).getId()+":-1"+","); } sb.replace(sb.length()-1, sb.length(),"}"); sb.append("]"); return (sb.toString().equals("[{},}]"))?"[{},{}]":sb.toString(); } }