From fb4e4aadbf49941783a0a1bf8fda99483d2d7da5 Mon Sep 17 00:00:00 2001 From: o2sword <171715986@qq.com> Date: Fri, 18 Sep 2020 17:46:56 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=BB=84=E7=BB=87=E4=BF=A1=E6=81=AF-?= =?UTF-8?q?=E6=A0=91=E5=BD=A2=E5=B1=95=E7=8E=B0=E6=8E=A5=E5=8F=A3=EF=BC=9B?= =?UTF-8?q?2=E3=80=81=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=BE=A4=E7=BB=84=E4=BF=A1=E6=81=AF-=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E5=B1=95=E7=8E=B0=E6=8E=A5=E5=8F=A3=EF=BC=9B3?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0=E6=A0=B9=E6=8D=AE=E8=BA=AB=E4=BB=BD?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=BE=A4=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../express/factory/IdentityFactory.java | 10 + .../jaxrs/group/ActionListWithGroupTree.java | 223 ++++++++++++++++++ .../jaxrs/group/ActionListWithIdentity.java | 123 ++++++++++ .../group/ActionListWithIdentityObject.java | 129 ++++++++++ .../express/jaxrs/group/GroupAction.java | 54 +++++ .../jaxrs/unit/ActionListWithUnitTree.java | 130 ++++++++++ .../express/jaxrs/unit/UnitAction.java | 18 ++ 7 files changed, 687 insertions(+) create mode 100644 o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithGroupTree.java create mode 100644 o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentity.java create mode 100644 o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentityObject.java create mode 100644 o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListWithUnitTree.java diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/IdentityFactory.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/IdentityFactory.java index 7d1e280c80..53276e264c 100644 --- a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/IdentityFactory.java +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/IdentityFactory.java @@ -159,4 +159,14 @@ public class IdentityFactory extends AbstractFactory { return list; } + public Long countByUnit(String unitId) throws Exception { + EntityManager em = this.entityManagerContainer().get(Identity.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root root = cq.from(Identity.class); + Predicate p = cb.equal(root.get(Identity_.unit), unitId); + Long count = em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult(); + return count; + } + } diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithGroupTree.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithGroupTree.java new file mode 100644 index 0000000000..3b7ecfd40b --- /dev/null +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithGroupTree.java @@ -0,0 +1,223 @@ +package com.x.organization.assemble.express.jaxrs.group; + +import com.google.gson.JsonElement; +import com.x.base.core.container.EntityManagerContainer; +import com.x.base.core.container.factory.EntityManagerContainerFactory; +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.bean.WrapCopier; +import com.x.base.core.project.bean.WrapCopierFactory; +import com.x.base.core.project.cache.Cache.CacheKey; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.gson.GsonPropertyObject; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.tools.ListTools; +import com.x.organization.assemble.express.Business; +import com.x.organization.core.entity.Group; +import com.x.organization.core.entity.Unit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +class ActionListWithGroupTree extends BaseAction { + + ActionResult> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Wi wi = this.convertToWrapIn(jsonElement, Wi.class); + ActionResult> result = new ActionResult<>(); + Business business = new Business(emc); + CacheKey cacheKey = new CacheKey(this.getClass(), wi.getGroupList()); + Optional optional = CacheManager.get(cacheCategory, cacheKey); + if (optional.isPresent()) { + result.setData((List) optional.get()); + } else { + List wos = this.list(business, wi); + CacheManager.put(cacheCategory, cacheKey, wos); + result.setData(wos); + } + return result; + } + } + + public static class Wi extends GsonPropertyObject { + + @FieldDescribe("群组") + private List groupList = new ArrayList<>(); + + public List getGroupList() { + return groupList; + } + + public void setGroupList(List groupList) { + this.groupList = groupList; + } + + } + + public static class Wo extends Group { + + private static final long serialVersionUID = -4928566515131577808L; + + static WrapCopier copier = WrapCopierFactory.wo(Group.class, Wo.class, ListTools.toList(Group.id_FIELDNAME, Group.distinguishedName_FIELDNAME), + null); + + @FieldDescribe("直接下级组织数量") + private Long subDirectGroupCount = 0L; + + @FieldDescribe("直接下级用户数量") + private Long subDirectPersonCount = 0L; + + @FieldDescribe("直接下级身份数量") + private Long subDirectIdentityCount = 0L; + + @FieldDescribe("直接下级组织数量") + private Long subDirectOrgCount = 0L; + + @FieldDescribe("直接下级组织") + private List subUnits = new ArrayList<>(); + + @FieldDescribe("直接下级群组") + private List subGroups = new ArrayList<>(); + + public List getSubGroups() { + return subGroups; + } + + public void setSubGroups(List subGroups) { + this.subGroups = subGroups; + } + + public Long getSubDirectGroupCount() { + return subDirectGroupCount; + } + + public void setSubDirectGroupCount(Long subDirectGroupCount) { + this.subDirectGroupCount = subDirectGroupCount; + } + + public Long getSubDirectPersonCount() { + return subDirectPersonCount; + } + + public void setSubDirectPersonCount(Long subDirectPersonCount) { + this.subDirectPersonCount = subDirectPersonCount; + } + + public Long getSubDirectIdentityCount() { + return subDirectIdentityCount; + } + + public void setSubDirectIdentityCount(Long subDirectIdentityCount) { + this.subDirectIdentityCount = subDirectIdentityCount; + } + + public Long getSubDirectOrgCount() { + return subDirectOrgCount; + } + + public void setSubDirectOrgCount(Long subDirectOrgCount) { + this.subDirectOrgCount = subDirectOrgCount; + } + + public List getSubUnits() { + return subUnits; + } + + public void setSubUnits(List subUnits) { + this.subUnits = subUnits; + } + } + + public static class WoUnit extends Unit { + + private static final long serialVersionUID = -5469947686711876763L; + + static WrapCopier copier = WrapCopierFactory.wo(Unit.class, WoUnit.class, ListTools.toList(Unit.id_FIELDNAME, Unit.distinguishedName_FIELDNAME), + null); + + @FieldDescribe("直接下级身份成员数量") + private Long subDirectUnitCount = 0L; + + @FieldDescribe("直接下级组织数量") + private Long subDirectIdentityCount = 0L; + + @FieldDescribe("直接下级组织") + private List subUnits = new ArrayList<>(); + + public Long getSubDirectUnitCount() { + return subDirectUnitCount; + } + + public void setSubDirectUnitCount(Long subDirectUnitCount) { + this.subDirectUnitCount = subDirectUnitCount; + } + + public Long getSubDirectIdentityCount() { + return subDirectIdentityCount; + } + + public void setSubDirectIdentityCount(Long subDirectIdentityCount) { + this.subDirectIdentityCount = subDirectIdentityCount; + } + + public List getSubUnits() { + return subUnits; + } + + public void setSubUnits(List subUnits) { + this.subUnits = subUnits; + } + } + + private List list(Business business, Wi wi) throws Exception { + List os = business.group().pick(ListTools.trim(wi.getGroupList(), false, true)); + List wos = Wo.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(Wo::getId, Wo->Wo)); + listSub(business, os, map); + return wos; + } + + private void listSub(Business business, List groups, Map groupMap) throws Exception { + for (Group group : groups){ + Wo wo = groupMap.get(group.getId()); + if(group.getGroupList()!=null && !group.getGroupList().isEmpty()){ + List os = business.entityManagerContainer().list(Group.class, group.getGroupList()); + List wos = Wo.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(Wo::getId, Wo->Wo)); + listSub(business, os, map); + wo.setSubGroups(wos); + wo.setSubDirectGroupCount((long)wos.size()); + } + if(group.getUnitList()!=null && !group.getUnitList().isEmpty()){ + List os = business.unit().pick(group.getUnitList()); + List wos = WoUnit.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(WoUnit::getId, WoUnit->WoUnit)); + listSubUnit(business, os, map); + wo.setSubUnits(wos); + wo.setSubDirectOrgCount((long)wos.size()); + } + wo.setSubDirectIdentityCount((long)group.getIdentityList().size()); + wo.setSubDirectPersonCount((long)group.getPersonList().size()); + + } + } + + private void listSubUnit(Business business, List units, Map unitMap) throws Exception { + for (Unit unit : units){ + WoUnit woUnit = unitMap.get(unit.getId()); + List os = business.unit().listSubDirectObject(unit); + if(!os.isEmpty()){ + List wos = WoUnit.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(WoUnit::getId, WoUnit->WoUnit)); + listSubUnit(business, os, map); + woUnit.setSubUnits(wos); + woUnit.setSubDirectUnitCount((long)wos.size()); + } + woUnit.setSubDirectIdentityCount(business.identity().countByUnit(unit.getId())); + } + } + +} \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentity.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentity.java new file mode 100644 index 0000000000..124bbce7e1 --- /dev/null +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentity.java @@ -0,0 +1,123 @@ +package com.x.organization.assemble.express.jaxrs.group; + +import com.google.gson.JsonElement; +import com.x.base.core.container.EntityManagerContainer; +import com.x.base.core.container.factory.EntityManagerContainerFactory; +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.cache.Cache.CacheKey; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.gson.GsonPropertyObject; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.tools.ListTools; +import com.x.organization.assemble.express.Business; +import com.x.organization.core.entity.Identity; +import org.apache.commons.lang3.BooleanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +class ActionListWithIdentity extends BaseAction { + + ActionResult execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Wi wi = this.convertToWrapIn(jsonElement, Wi.class); + ActionResult result = new ActionResult<>(); + Business business = new Business(emc); + CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList(), + wi.getRecursiveGroupFlag(), wi.getReferenceFlag(), wi.getRecursiveOrgFlag()); + Optional optional = CacheManager.get(cacheCategory, cacheKey); + if (optional.isPresent()) { + result.setData((Wo) optional.get()); + } else { + Wo wo = this.list(business, wi); + CacheManager.put(cacheCategory, cacheKey, wo); + result.setData(wo); + } + return result; + } + } + + public static class Wi extends GsonPropertyObject { + + @FieldDescribe("个人") + private List identityList = new ArrayList<>(); + + @FieldDescribe("是否递归查询上级群组,默认true") + private Boolean recursiveGroupFlag = true; + + @FieldDescribe("是否包含查找身份归属组织成员的所属群组,默认false") + private Boolean referenceFlag = false; + + @FieldDescribe("是否递归身份归属组织的上级组织所属群组,前提referenceFlag为true,默认false") + private Boolean recursiveOrgFlag = false; + + public List getIdentityList() { + return identityList; + } + + public void setIdentityList(List identityList) { + this.identityList = identityList; + } + + public Boolean getReferenceFlag() { + return referenceFlag; + } + + public void setReferenceFlag(Boolean referenceFlag) { + this.referenceFlag = referenceFlag; + } + + public Boolean getRecursiveGroupFlag() { + return recursiveGroupFlag; + } + + public void setRecursiveGroupFlag(Boolean recursiveGroupFlag) { + this.recursiveGroupFlag = recursiveGroupFlag; + } + + public Boolean getRecursiveOrgFlag() { + return recursiveOrgFlag; + } + + public void setRecursiveOrgFlag(Boolean recursiveOrgFlag) { + this.recursiveOrgFlag = recursiveOrgFlag; + } + } + + public static class Wo extends WoGroupAbstract { + + } + + private Wo list(Business business, Wi wi) throws Exception { + List os = business.identity().pick(wi.getIdentityList()); + List groupIds = new ArrayList<>(); + for (Identity identity : os) { + groupIds.addAll(business.group().listSupDirectWithIdentity(identity.getId())); + if (BooleanUtils.isTrue(wi.getReferenceFlag())) { + groupIds.addAll(business.group().listSupDirectWithUnit(identity.getUnit())); + if (BooleanUtils.isTrue(wi.getRecursiveOrgFlag())) { + List orgIds = business.unit().listSupNested(identity.getUnit()); + for (String orgId : orgIds) { + groupIds.addAll(business.group().listSupDirectWithUnit(orgId)); + } + } + } + } + groupIds = ListTools.trim(groupIds, true, true); + List groupIds2 = new ArrayList<>(); + groupIds2.addAll(groupIds); + if (!BooleanUtils.isFalse(wi.getRecursiveGroupFlag())) { + for (String groupId : groupIds) { + groupIds2.addAll(business.group().listSupNested(groupId)); + } + groupIds2 = ListTools.trim(groupIds2, true, true); + } + List values = business.group().listGroupDistinguishedNameSorted(groupIds2); + Wo wo = new Wo(); + wo.getGroupList().addAll(values); + return wo; + } + +} \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentityObject.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentityObject.java new file mode 100644 index 0000000000..7c279b61a6 --- /dev/null +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/ActionListWithIdentityObject.java @@ -0,0 +1,129 @@ +package com.x.organization.assemble.express.jaxrs.group; + +import com.google.gson.JsonElement; +import com.x.base.core.container.EntityManagerContainer; +import com.x.base.core.container.factory.EntityManagerContainerFactory; +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.cache.Cache.CacheKey; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.gson.GsonPropertyObject; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.tools.ListTools; +import com.x.organization.assemble.express.Business; +import com.x.organization.core.entity.Group; +import com.x.organization.core.entity.Identity; +import org.apache.commons.lang3.BooleanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +class ActionListWithIdentityObject extends BaseAction { + + @SuppressWarnings("unchecked") + ActionResult> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Wi wi = this.convertToWrapIn(jsonElement, Wi.class); + ActionResult> result = new ActionResult<>(); + Business business = new Business(emc); + CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList() , + wi.getRecursiveGroupFlag(), wi.getReferenceFlag(), wi.getRecursiveOrgFlag()); + Optional optional = CacheManager.get(cacheCategory, cacheKey); + if (optional.isPresent()) { + result.setData((List) optional.get()); + } else { + List wos = this.list(business, wi); + CacheManager.put(cacheCategory, cacheKey, wos); + result.setData(wos); + } + return result; + } + } + + public static class Wi extends GsonPropertyObject { + + @FieldDescribe("身份") + private List identityList = new ArrayList<>(); + + @FieldDescribe("是否递归查询上级群组,默认true") + private Boolean recursiveGroupFlag = true; + + @FieldDescribe("是否包含查找身份归属组织成员的所属群组,默认false") + private Boolean referenceFlag = false; + + @FieldDescribe("是否递归身份归属组织的上级组织所属群组,前提referenceFlag为true,默认false") + private Boolean recursiveOrgFlag = false; + + public List getIdentityList() { + return identityList; + } + + public void setIdentityList(List identityList) { + this.identityList = identityList; + } + + public Boolean getReferenceFlag() { + return referenceFlag; + } + + public void setReferenceFlag(Boolean referenceFlag) { + this.referenceFlag = referenceFlag; + } + + public Boolean getRecursiveGroupFlag() { + return recursiveGroupFlag; + } + + public void setRecursiveGroupFlag(Boolean recursiveGroupFlag) { + this.recursiveGroupFlag = recursiveGroupFlag; + } + + public Boolean getRecursiveOrgFlag() { + return recursiveOrgFlag; + } + + public void setRecursiveOrgFlag(Boolean recursiveOrgFlag) { + this.recursiveOrgFlag = recursiveOrgFlag; + } + } + + public static class Wo extends com.x.base.core.project.organization.Group { + + } + + private List list(Business business, Wi wi) throws Exception { + List wos = new ArrayList<>(); + List os = business.identity().pick(wi.getIdentityList()); + List groupIds = new ArrayList<>(); + for (Identity identity : os) { + groupIds.addAll(business.group().listSupDirectWithIdentity(identity.getId())); + if (BooleanUtils.isTrue(wi.getReferenceFlag())) { + groupIds.addAll(business.group().listSupDirectWithUnit(identity.getUnit())); + if (BooleanUtils.isTrue(wi.getRecursiveOrgFlag())) { + List orgIds = business.unit().listSupNested(identity.getUnit()); + for (String orgId : orgIds) { + groupIds.addAll(business.group().listSupDirectWithUnit(orgId)); + } + } + } + } + groupIds = ListTools.trim(groupIds, true, true); + List groupIds2 = new ArrayList<>(); + groupIds2.addAll(groupIds); + if (!BooleanUtils.isFalse(wi.getRecursiveGroupFlag())) { + for (String groupId : groupIds) { + groupIds2.addAll(business.group().listSupNested(groupId)); + } + groupIds2 = ListTools.trim(groupIds2, true, true); + } + + List list = business.group().pick(groupIds2); + list = business.group().sort(list); + for (Group o : list) { + wos.add(this.convert(business, o, Wo.class)); + } + return wos; + } + +} \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/GroupAction.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/GroupAction.java index 48333838cc..33f669b15d 100644 --- a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/GroupAction.java +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/group/GroupAction.java @@ -263,4 +263,58 @@ public class GroupAction extends StandardJaxrsAction { asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } + @JaxrsMethodDescribe(value = "批量查询人员身份所在的群组.", action = ActionListWithIdentity.class) + @POST + @Path("list/identity") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void listWithIdentity(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + JsonElement jsonElement) { + ActionResult result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionListWithIdentity().execute(effectivePerson, jsonElement); + } catch (Exception e) { + logger.error(e, effectivePerson, request, jsonElement); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + + @JaxrsMethodDescribe(value = "批量查询人员身份所在的群组对象.", action = ActionListWithIdentityObject.class) + @POST + @Path("list/identity/object") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void listWithIdentityObject(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + JsonElement jsonElement) { + ActionResult> result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionListWithIdentityObject().execute(effectivePerson, jsonElement); + } catch (Exception e) { + logger.error(e, effectivePerson, request, jsonElement); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + + @JaxrsMethodDescribe(value = "批量查询群组的嵌套下级群组信息-树形模式.", action = ActionListWithGroupTree.class) + @POST + @Path("list/group/tree") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void ListWithGroupTree(@Suspended final AsyncResponse asyncResponse, + @Context HttpServletRequest request, JsonElement jsonElement) { + ActionResult> result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionListWithGroupTree().execute(effectivePerson, jsonElement); + } catch (Exception e) { + logger.error(e, effectivePerson, request, jsonElement); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + } \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListWithUnitTree.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListWithUnitTree.java new file mode 100644 index 0000000000..5d4a495c06 --- /dev/null +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListWithUnitTree.java @@ -0,0 +1,130 @@ +package com.x.organization.assemble.express.jaxrs.unit; + +import com.google.gson.JsonElement; +import com.x.base.core.container.EntityManagerContainer; +import com.x.base.core.container.factory.EntityManagerContainerFactory; +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.bean.WrapCopier; +import com.x.base.core.project.bean.WrapCopierFactory; +import com.x.base.core.project.cache.Cache.CacheKey; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.gson.GsonPropertyObject; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.tools.ListTools; +import com.x.organization.assemble.express.Business; +import com.x.organization.core.entity.Identity; +import com.x.organization.core.entity.Identity_; +import com.x.organization.core.entity.Unit; + +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +class ActionListWithUnitTree extends BaseAction { + + ActionResult> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Wi wi = this.convertToWrapIn(jsonElement, Wi.class); + ActionResult> result = new ActionResult<>(); + Business business = new Business(emc); + CacheKey cacheKey = new CacheKey(this.getClass(), wi.getUnitList()); + Optional optional = CacheManager.get(cacheCategory, cacheKey); + if (optional.isPresent()) { + result.setData((List) optional.get()); + } else { + List wos = this.list(business, wi); + CacheManager.put(cacheCategory, cacheKey, wos); + result.setData(wos); + } + return result; + } + } + + public static class Wi extends GsonPropertyObject { + + @FieldDescribe("组织") + private List unitList; + + public List getUnitList() { + return unitList; + } + + public void setUnitList(List unitList) { + this.unitList = unitList; + } + + } + + public static class Wo extends Unit { + + private static final long serialVersionUID = -1067995706582209831L; + + static WrapCopier copier = WrapCopierFactory.wo(Unit.class, Wo.class, ListTools.toList(Unit.id_FIELDNAME, Unit.distinguishedName_FIELDNAME), + null); + + @FieldDescribe("直接下级身份成员数量") + private Long subDirectUnitCount = 0L; + + @FieldDescribe("直接下级组织数量") + private Long subDirectIdentityCount = 0L; + + @FieldDescribe("直接下级组织") + private List subUnits = new ArrayList<>(); + + public Long getSubDirectUnitCount() { + return subDirectUnitCount; + } + + public void setSubDirectUnitCount(Long subDirectUnitCount) { + this.subDirectUnitCount = subDirectUnitCount; + } + + public Long getSubDirectIdentityCount() { + return subDirectIdentityCount; + } + + public void setSubDirectIdentityCount(Long subDirectIdentityCount) { + this.subDirectIdentityCount = subDirectIdentityCount; + } + + public List getSubUnits() { + return subUnits; + } + + public void setSubUnits(List subUnits) { + this.subUnits = subUnits; + } + } + + private List list(Business business, Wi wi) throws Exception { + List os = business.unit().pick(wi.getUnitList()); + List wos = Wo.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(Wo::getId, Wo->Wo)); + listSub(business, os, map); + return wos; + } + + private void listSub(Business business, List units, Map unitMap) throws Exception { + for (Unit unit : units){ + Wo wo = unitMap.get(unit.getId()); + List os = business.unit().listSubDirectObject(unit); + if(!os.isEmpty()){ + List wos = Wo.copier.copy(os); + Map map = wos.stream().collect(Collectors.toMap(Wo::getId, Wo->Wo)); + listSub(business, os, map); + wo.setSubUnits(wos); + wo.setSubDirectUnitCount((long)wos.size()); + } + wo.setSubDirectIdentityCount(business.identity().countByUnit(unit.getId())); + } + } + +} \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java index c8c6dad5e2..63461e2f07 100644 --- a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/UnitAction.java @@ -567,4 +567,22 @@ public class UnitAction extends StandardJaxrsAction { } asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } + + @JaxrsMethodDescribe(value = "批量查询组织的嵌套下级组织信息-树形模式.", action = ActionListWithUnitTree.class) + @POST + @Path("list/unit/tree") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void ListWithUnitTree(@Suspended final AsyncResponse asyncResponse, + @Context HttpServletRequest request, JsonElement jsonElement) { + ActionResult> result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionListWithUnitTree().execute(effectivePerson, jsonElement); + } catch (Exception e) { + logger.error(e, effectivePerson, request, jsonElement); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } } \ No newline at end of file -- GitLab