diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java index effd6189ff7b74945c8dca96f3d75a8a2ce40bee..886a11af354c647dbc89f90de76e9fe549cc3518 100644 --- a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/identity/ActionListObject.java @@ -7,14 +7,26 @@ import java.util.Optional; 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.entity.JpaObject; 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.*; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; class ActionListObject extends BaseAction { @@ -24,7 +36,7 @@ class ActionListObject extends BaseAction { Wi wi = this.convertToWrapIn(jsonElement, Wi.class); ActionResult> result = new ActionResult<>(); Business business = new Business(emc); - CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList()); + CacheKey cacheKey = new CacheKey(this.getClass(), wi.getIdentityList(), wi.getReferenceFlag(), wi.getRecursiveFlag()); Optional optional = CacheManager.get(cacheCategory, cacheKey); if (optional.isPresent()) { result.setData((List) optional.get()); @@ -37,11 +49,128 @@ class ActionListObject extends BaseAction { } } + private List list(Business business, Wi wi) throws Exception { + List wos = new ArrayList<>(); + for (String str : wi.getIdentityList()) { + Identity o = business.identity().pick(str); + if(o!=null){ + Wo wo = Wo.copier.copy(o); + wo.setMatchKey(str); + Person p = business.person().pick(o.getPerson()); + if (null != p) { + wo.setPerson(p.getDistinguishedName()); + } + if (BooleanUtils.isTrue(wi.getReferenceFlag())){ + referenceUnit(business, wo, wi); + referenceUnitDuty(business, wo); + referenceGroup(business, wo, wi); + }else { + Unit u = business.unit().pick(o.getUnit()); + if (null != u) { + wo.setUnit(u.getDistinguishedName()); + } + } + wos.add(wo); + } + } + return wos; + } + + private void referenceUnit(Business business, Wo woIdentity, Wi wi) throws Exception { + if (StringUtils.isNotEmpty(woIdentity.getUnit())) { + Unit unit = business.unit().pick(woIdentity.getUnit()); + if (null != unit) { + WoUnit wo = WoUnit.copier.copy(unit); + List unitIdList = new ArrayList<>(); + unitIdList.add(wo.getId()); + if(BooleanUtils.isTrue(wi.getRecursiveFlag())){ + referenceUnit(business, wo, unitIdList); + } + wo.setUnitIdList(unitIdList); + woIdentity.setWoUnit(wo); + woIdentity.setUnit(wo.getDistinguishedName()); + + } + } + } + + private void referenceUnit(Business business, WoUnit woUnit, List unitIdList) throws Exception { + if (StringUtils.isNotEmpty(woUnit.getSuperior())) { + Unit unit = business.unit().pick(woUnit.getSuperior()); + if (null != unit) { + WoUnit wo = WoUnit.copier.copy(unit); + unitIdList.add(wo.getId()); + if (StringUtils.isNotEmpty(wo.getSuperior()) && wo.getLevel()>1) { + referenceUnit(business, wo, unitIdList); + } + woUnit.setWoSupDirectUnit(wo); + } + } + } + + + private void referenceUnitDuty(Business business, Wo woIdentity) throws Exception { + EntityManager em = business.entityManagerContainer().get(UnitDuty.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(UnitDuty.class); + Root root = cq.from(UnitDuty.class); + Predicate p = cb.isMember(woIdentity.getId(), root.get(UnitDuty_.identityList)); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + List wos = WoUnitDuty.copier.copy(os); + wos = business.unitDuty().sort(wos); + for (WoUnitDuty woUnitDuty : wos) { + this.referenceUnit(business, woUnitDuty); + } + woIdentity.setWoUnitDutyList(wos); + } + + private void referenceUnit(Business business, WoUnitDuty woUnitDuty) throws Exception { + if (StringUtils.isNotEmpty(woUnitDuty.getUnit())) { + Unit unit = business.unit().pick(woUnitDuty.getUnit()); + if (null != unit) { + WoUnit wo = WoUnit.copier.copy(unit); + woUnitDuty.setWoUnit(wo); + } + } + } + + private void referenceGroup(Business business, Wo wo, Wi wi) throws Exception { + EntityManager em = business.entityManagerContainer().get(Group.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Group.class); + Root root = cq.from(Group.class); + Predicate p = cb.isMember(wo.getId(), root.get(Group_.identityList)); + if(wo.getWoUnit()!=null){ + p = cb.or(p, root.get(Group_.unitList).in(wo.getWoUnit().getUnitIdList())); + } + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + final List wos = new ArrayList<>(); + os.stream().forEach(o -> { + try { + WoGroup woGroup = WoGroup.copier.copy(o); + if(BooleanUtils.isTrue(wi.getRecursiveFlag())) { + woGroup.setWoSupGroupList(WoGroup.copier.copy(business.group().listSupNestedObject(o))); + } + wos.add(woGroup); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + wo.setWoGroupList(wos); + } + public static class Wi extends GsonPropertyObject { @FieldDescribe("身份") private List identityList = new ArrayList<>(); + @FieldDescribe("是否关联查询身份所属对象信息:组织、角色、群组") + private Boolean referenceFlag; + + @FieldDescribe("是否递归查询上级组织或群组,默认false") + private Boolean recursiveFlag; + public List getIdentityList() { return identityList; } @@ -50,23 +179,140 @@ class ActionListObject extends BaseAction { this.identityList = identityList; } + public Boolean getReferenceFlag() { + return referenceFlag; + } + + public void setReferenceFlag(Boolean referenceFlag) { + this.referenceFlag = referenceFlag; + } + + public Boolean getRecursiveFlag() { + return recursiveFlag; + } + + public void setRecursiveFlag(Boolean recursiveFlag) { + this.recursiveFlag = recursiveFlag; + } } - public static class Wo extends com.x.base.core.project.organization.Identity { + public static class Wo extends Identity { + + private static final long serialVersionUID = -7628608775316429534L; + + static WrapCopier copier = WrapCopierFactory.wo(Identity.class, Wo.class, null, + ListTools.toList(JpaObject.FieldsInvisible)); + + @FieldDescribe("匹配字段") + private String matchKey; + + @FieldDescribe("组织对象") + private WoUnit woUnit; + + @FieldDescribe("组织职务对象") + private List woUnitDutyList; + + @FieldDescribe("群组对象") + private List woGroupList; + + public String getMatchKey() { + return matchKey; + } + public void setMatchKey(String matchKey) { + this.matchKey = matchKey; + } + + public WoUnit getWoUnit() { + return woUnit; + } + + public void setWoUnit(WoUnit woUnit) { + this.woUnit = woUnit; + } + + public List getWoUnitDutyList() { + return woUnitDutyList; + } + + public void setWoUnitDutyList(List woUnitDutyList) { + this.woUnitDutyList = woUnitDutyList; + } + + public List getWoGroupList() { + return woGroupList; + } + + public void setWoGroupList(List woGroupList) { + this.woGroupList = woGroupList; + } } - private List list(Business business, Wi wi) throws Exception { - List wos = new ArrayList<>(); - for (String str : wi.getIdentityList()) { - Identity o = business.identity().pick(str); - if(o!=null){ - Wo wo = this.convert(business, o, Wo.class); - wo.setMatchKey(str); - wos.add(wo); - } + public static class WoUnit extends Unit { + + private static final long serialVersionUID = -7760842451561513441L; + + static WrapCopier copier = WrapCopierFactory.wo(Unit.class, WoUnit.class, null, + ListTools.toList(JpaObject.FieldsInvisible, Unit.controllerList_FIELDNAME)); + + @FieldDescribe("上级组织对象.") + private WoUnit woSupDirectUnit; + + private List unitIdList; + + public WoUnit getWoSupDirectUnit() { + return woSupDirectUnit; + } + + public void setWoSupDirectUnit(WoUnit woSupDirectUnit) { + this.woSupDirectUnit = woSupDirectUnit; + } + + public List getUnitIdList() { + return unitIdList; + } + + public void setUnitIdList(List unitIdList) { + this.unitIdList = unitIdList; + } + } + + public static class WoUnitDuty extends UnitDuty { + + private static final long serialVersionUID = -2375022310349169180L; + + @FieldDescribe("组织对象") + private WoUnit woUnit; + + static WrapCopier copier = WrapCopierFactory.wo(UnitDuty.class, WoUnitDuty.class, null, + ListTools.toList(JpaObject.FieldsInvisible)); + + public WoUnit getWoUnit() { + return woUnit; + } + + public void setWoUnit(WoUnit woUnit) { + this.woUnit = woUnit; + } + } + + public static class WoGroup extends Group { + + private static final long serialVersionUID = 1430979713075568834L; + + @FieldDescribe("上级群组对象列表.") + private List woSupGroupList; + + static WrapCopier copier = WrapCopierFactory.wo(Group.class, WoGroup.class, null, + ListTools.toList(JpaObject.FieldsInvisible)); + + public List getWoSupGroupList() { + return woSupGroupList; + } + + public void setWoSupGroupList(List woSupGroupList) { + this.woSupGroupList = woSupGroupList; } - return wos; } -} \ No newline at end of file +}