package com.x.processplatform.assemble.surface.jaxrs.application; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; 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 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.bean.WrapCopier; import com.x.base.core.project.bean.WrapCopierFactory; import com.x.base.core.project.cache.Cache; import com.x.base.core.project.cache.CacheManager; import com.x.base.core.project.http.ActionResult; import com.x.base.core.project.http.EffectivePerson; import com.x.base.core.project.organization.OrganizationDefinition; import com.x.base.core.project.tools.ListTools; import com.x.processplatform.assemble.surface.Business; import com.x.processplatform.core.entity.element.Application; import com.x.processplatform.core.entity.element.Application_; import com.x.processplatform.core.entity.element.Process; import com.x.processplatform.core.entity.element.Process_; class ActionListWithPerson extends BaseAction { /** * 1.身份在可使用列表中
* 2.组织在可使用组织中
* 4.没有限定身份和组织
* 5.个人在应用管理员中
* 6.应用的创建人员
* 7.个人有Manage权限或者ProcessPlatformManager身份 */ ActionResult> execute(EffectivePerson effectivePerson) throws Exception { try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { Business business = new Business(emc); ActionResult> result = new ActionResult<>(); Cache.CacheKey cacheKey = new Cache.CacheKey(this.getClass(), effectivePerson.getDistinguishedName()); Optional optional = CacheManager.get(cacheCategory, cacheKey); if (optional.isPresent()) { result.setData((List) optional.get()); }else { List wos = new ArrayList<>(); List identities = business.organization().identity().listWithPerson(effectivePerson); /** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */ List units = business.organization().unit().listWithPersonSupNested(effectivePerson); List roles = business.organization().role().listWithPerson(effectivePerson); List groups = business.organization().group().listWithIdentity(identities); List ids = this.list(business, effectivePerson, roles, identities, units, groups); for (String id : ids) { Application o = business.application().pick(id); if (null != o) { wos.add(Wo.copier.copy(o)); } } wos = business.application().sort(wos); result.setData(wos); } return result; } } public static class Wo extends Application { private static final long serialVersionUID = -4862564047240738097L; static WrapCopier copier = WrapCopierFactory.wo(Application.class, Wo.class, null, JpaObject.FieldsInvisible); } /** * 从可见的application中获取一份ids
* 从可启动的process中获取一份ids
* 两份ids的交集,这样避免列示只有application没有可以启动process的应用 */ private List list(Business business, EffectivePerson effectivePerson, List roles, List identities, List units, List groups) throws Exception { // List ids = this.listFromApplication(business, effectivePerson, roles, identities, units); // return ids; List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups); return fromProcessIds; // return ListUtils.intersection(ids, fromProcessIds); } private List listFromApplication(Business business, EffectivePerson effectivePerson, List roles, List identities, List units) throws Exception { List list = new ArrayList<>(); EntityManager em = business.entityManagerContainer().get(Application.class); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(Application.class); if (effectivePerson.isNotManager() && (!business.organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager))) { Predicate p = cb.and(cb.isEmpty(root.get(Application_.availableIdentityList)), cb.isEmpty(root.get(Application_.availableUnitList))); p = cb.or(p, cb.isMember(effectivePerson.getDistinguishedName(), root.get(Application_.controllerList))); p = cb.or(p, cb.equal(root.get(Application_.creatorPerson), effectivePerson.getDistinguishedName())); if (ListTools.isNotEmpty(identities)) { p = cb.or(p, root.get(Application_.availableIdentityList).in(identities)); } if (ListTools.isNotEmpty(units)) { p = cb.or(p, root.get(Application_.availableUnitList).in(units)); } cq.where(p); } return em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct() .collect(Collectors.toList()); } /** * * 从Process中获取可以启动的Process的application. */ private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, List identities, List units, List groups) throws Exception { EntityManager em = business.entityManagerContainer().get(Process.class); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(Process.class); Predicate p = cb.conjunction(); if (effectivePerson.isNotManager() && (!business.organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager))) { p = cb.and(cb.isEmpty(root.get(Process_.startableIdentityList)), cb.isEmpty(root.get(Process_.startableUnitList)), cb.isEmpty(root.get(Process_.startableGroupList))); p = cb.or(p, cb.isMember(effectivePerson.getDistinguishedName(), root.get(Process_.controllerList))); p = cb.or(p, cb.equal(root.get(Process_.creatorPerson), effectivePerson.getDistinguishedName())); if (ListTools.isNotEmpty(identities)) { p = cb.or(p, root.get(Process_.startableIdentityList).in(identities)); } if (ListTools.isNotEmpty(units)) { p = cb.or(p, root.get(Process_.startableUnitList).in(units)); } if (ListTools.isNotEmpty(groups)) { p = cb.or(p, root.get(Process_.startableGroupList).in(groups)); } } cq.select(root.get(Process_.application)).where(p); return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()); } }