Index: forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManager.java =================================================================== diff -u -r15581 -r15976 --- forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManager.java (.../OrgUnitManager.java) (revision 15581) +++ forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManager.java (.../OrgUnitManager.java) (revision 15976) @@ -28,7 +28,9 @@ public THTreeNode getOrgUnitByCode(String code); public Set getCurrentOrgUintChildren(Long id); - + + public Set getAllChildrenOfOrgUnits(Set parentOrgUnits); + public Set getCurrentOrgUintChildren(OrgUnit orgUnit); public List findAllBase(); Index: forgon-core/src/main/java/com/forgon/directory/service/DirectoryHelper.java =================================================================== diff -u -r15958 -r15976 --- forgon-core/src/main/java/com/forgon/directory/service/DirectoryHelper.java (.../DirectoryHelper.java) (revision 15958) +++ forgon-core/src/main/java/com/forgon/directory/service/DirectoryHelper.java (.../DirectoryHelper.java) (revision 15976) @@ -1083,8 +1083,9 @@ /** * 查找用户所在部门,以及这些部门的下级部门 - * 注意:如果用户直接属于公司的根节点,会忽略该节点,不会找出该节点下的子部门。最初的实现代码中, - * 如果用户直接属于公司的根节点,则会把该公司下的所有部门找出来,如果部门多,会严重影响性能。 + * 注意:如果用户直接属于公司的根节点,会忽略该节点,不会找出该节点下的子部门。 + * 最初的实现代码中,如果用户直接属于公司的根节点,则会把该公司下的所有部门找出来,如果部门多,会严重影响性能。 + * 目前代码已重构,改为了一次传入多个父部门对象查询,减少了数据库交互次数,即使部门多,查询的速度也很快。 * * @param user * @return @@ -1094,15 +1095,23 @@ Set orgUnitRelationList = user.getOrgUserRelations(); if (orgUnitRelationList != null && orgUnitRelationList.size() > 0) { + + // 父部门,不包含公司 + Set parentDeparts = new HashSet(); + for (OrgUserRelation relation : orgUnitRelationList) { OrgUnit orgUnit = relation.getOrgUnit(); - // 如果用户所属的组织单位为部门,才去查找子组织单位。是公司就不会查找子组织单位 + // 如果用户所属的组织单位为部门,才去查找子部门(子组织单位),是公司就不会查找子部门(子组织单位) if (OrgUnit.ORGUNIT_TYPE_DEPARTMENT == orgUnit.getOrgType()){ - allOrgUnit.addAll(orgUnitManager - .getCurrentOrgUintChildren(relation.getOrgUnit() - .getId())); + + parentDeparts.add(orgUnit); + } } + + allOrgUnit.addAll(orgUnitManager + .getAllChildrenOfOrgUnits(parentDeparts)); + } return orgUnitSet2CodesString(allOrgUnit); } Index: forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java =================================================================== diff -u -r15893 -r15976 --- forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java (.../OrgUnitManagerImpl.java) (revision 15893) +++ forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java (.../OrgUnitManagerImpl.java) (revision 15976) @@ -7,7 +7,6 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -17,6 +16,8 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.hibernate.Query; +import org.hibernate.Session; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; @@ -43,7 +44,6 @@ import com.forgon.treenode.service.THTreeNodeManager; import edu.emory.mathcs.backport.java.util.Arrays; -import org.hibernate.Session; /** * @author Angus @@ -659,7 +659,60 @@ } return new LinkedHashSet(); } + + /** + * 获取所有父部门的所有下级部门集合,返回结果集合包含了作为查询条件的所有的父部门 + * @return + */ + public Set getAllChildrenOfOrgUnits(Set parentDeparts){ + Set allOrgUnits = new LinkedHashSet(); + + if (CollectionUtils.isNotEmpty(parentDeparts)){ + setAllChildren(parentDeparts, allOrgUnits); + } + + return allOrgUnits; + } + /** + * 设置子部门的集合,该集合也包含所有的父部门 + * @param parentDeparts + * @param allChildrenDeparts + */ + private void setAllChildren(Set parentDeparts, Set allChildrenDeparts) { + if (CollectionUtils.isEmpty(parentDeparts)) { + return; + } + + allChildrenDeparts.addAll(parentDeparts); + + // 一次查询出所有的子部门,减少数据库交互,提高查询速度 + List ids = new ArrayList(); + for (OrgUnit parentDepart: parentDeparts){ + if (OrgUnit.ORGUNIT_TYPE_DEPARTMENT.equals(parentDepart.getOrgType())){ + ids.add(parentDepart.getId()); + } + } + Session session = objectDao.getHibernateSession(); + Query query = session.createQuery("from OrgUnit where parentId in (:ids)"); + query.setParameterList("ids", ids); + List children = query.list(); + + if (CollectionUtils.isNotEmpty(children)){ + + allChildrenDeparts.addAll(children); + + setAllChildren(new HashSet(children), allChildrenDeparts); + } + + } + + /** + * 查找某个组织单位的下级组织单位。返回集合对象,该集合也包含了该组织单位本身。 + * 当有多个父部门时,需要多次调用该方法,效率低,建议调用新方法: Set getAllChildrenOfOrgUnits(Set parentDeparts) + * + * Deprecated. + */ public Set getCurrentOrgUintChildren(OrgUnit orgUnit) { Set allChildren = new LinkedHashSet(); if (orgUnit != null) {