diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/identity/ActionDelete.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/identity/ActionDelete.java index 195b8e9128778c658d8ca378c759291afc9502b0..22ff26a340e72c8066a02b34b8965090409d1400 100644 --- a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/identity/ActionDelete.java +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/identity/ActionDelete.java @@ -12,6 +12,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.tools.ListTools; import com.x.organization.core.entity.*; import org.apache.commons.lang3.StringUtils; @@ -45,14 +46,11 @@ public class ActionDelete extends BaseAction { throw new ExceptionAccessDenied(effectivePerson, unit); } /** 由于有关联所以要分段提交,提交UnitDuty的成员删除。 */ - emc.beginTransaction(UnitDuty.class); this.removeMemberOfUnitDuty(business, identity); - emc.commit(); } /** group的身份成员删除。*/ - emc.beginTransaction(Group.class); this.removeMemberOfGroup(business, identity); - emc.commit(); + /** 由于前面pick出来的需要重新取出 */ identity = emc.find(identity.getId(), Identity.class); // /** 删除下属身份 */ @@ -100,15 +98,25 @@ public class ActionDelete extends BaseAction { Root root = cq.from(UnitDuty.class); Predicate p = cb.isMember(identity.getId(), root.get(UnitDuty_.identityList)); List os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList()); - for (UnitDuty o : os) { - o.getIdentityList().remove(identity.getId()); + if(ListTools.isNotEmpty(os)) { + business.entityManagerContainer().beginTransaction(UnitDuty.class); + for (UnitDuty o : os) { + o.getIdentityList().remove(identity.getId()); + } + business.entityManagerContainer().commit(); + CacheManager.notify(UnitDuty.class); } } private void removeMemberOfGroup(Business business, Identity identity) throws Exception { List groups = business.group().listSupDirectWithIdentityObject(identity.getId()); - for(Group g : groups){ - g.getIdentityList().remove(identity.getId()); + if(ListTools.isNotEmpty(groups)) { + business.entityManagerContainer().beginTransaction(Group.class); + for (Group g : groups) { + g.getIdentityList().remove(identity.getId()); + } + business.entityManagerContainer().commit(); + CacheManager.notify(Group.class); } } } \ No newline at end of file diff --git a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java index 0658c13678ce1039bd0fd8054d632e4885dba862..709818529b87e1ba87a3957b14fa9ba414d0de07 100644 --- a/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java +++ b/o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java @@ -143,7 +143,7 @@ class ActionListObject extends BaseAction { for (CompletableFuture future : futures) { wos.add(future.get()); } - return wos; + return ListTools.trim(wos, true, false); } private CompletableFuture future(String name) { diff --git a/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/ActionListWithIdentity.java b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/ActionListWithIdentity.java new file mode 100644 index 0000000000000000000000000000000000000000..3501ce014eeef938a1f9114954a1ec7f70fffafb --- /dev/null +++ b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/ActionListWithIdentity.java @@ -0,0 +1,75 @@ +package com.x.organization.core.express.group; + +import com.x.base.core.project.AbstractContext; +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.gson.GsonPropertyObject; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +class ActionListWithIdentity extends BaseAction { + + public static List execute(AbstractContext context, Collection collection, + boolean recursiveGroupFlag, boolean referenceFlag, boolean recursiveOrgFlag) throws Exception { + Wi wi = new Wi(); + if (null != collection) { + wi.getIdentityList().addAll(collection); + wi.setRecursiveGroupFlag(recursiveGroupFlag); + wi.setReferenceFlag(referenceFlag); + wi.setRecursiveOrgFlag(recursiveOrgFlag); + } + Wo wo = context.applications().postQuery(applicationClass, "group/list/identity", wi).getData(Wo.class); + return wo.getGroupList(); + } + + 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 { + } +} diff --git a/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/GroupFactory.java b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/GroupFactory.java index 3fb83687c18615c75e0925416cfc3ba35c76fbeb..ab2623adde90c081be0144cf4e4f114b1935eba0 100644 --- a/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/GroupFactory.java +++ b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/group/GroupFactory.java @@ -138,4 +138,28 @@ public class GroupFactory { return ActionListWithPerson.execute(context, values, recursiveGroupFlag, referenceFlag, recursiveOrgFlag); } + /** 查询身份所在的群组 */ + public List listWithIdentity(Collection values) throws Exception { + return listWithIdentityReference(values,true,true, true); + } + + /** 查询身份所在的群组 */ + public List listWithIdentity(String... values) throws Exception { + return listWithIdentityReference(Arrays.asList(values),true,true, true); + } + + /** + * 查询身份及关联组织所在的群组 + * @param values 身份 + * @param recursiveGroupFlag 是否递归查询上级群组 + * @param referenceFlag 是否包含查找人员身份成员、人员归属组织成员的所属群组 + * @param recursiveOrgFlag 是否递归人员归属组织的上级组织所属群组,前提referenceFlag为true + * @return + * @throws Exception + */ + public List listWithIdentityReference(Collection values, + boolean recursiveGroupFlag, boolean referenceFlag, boolean recursiveOrgFlag) throws Exception { + return ActionListWithIdentity.execute(context, values, recursiveGroupFlag, referenceFlag, recursiveOrgFlag); + } + } \ No newline at end of file diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java index 9be0d5f3bdf3e64a6c37542a8e5dceada3650922..432752418aa6f1b63f6e9874ed8e4d01c7c5da7e 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java @@ -79,7 +79,7 @@ public class ProcessFactory extends ElementFactory { /* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */ public List listStartableWithApplication(EffectivePerson effectivePerson, List identities, - List units, Application application) throws Exception { + List units, List groups, Application application) throws Exception { EntityManager em = this.entityManagerContainer().get(Process.class); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); @@ -88,7 +88,8 @@ public class ProcessFactory extends ElementFactory { if (effectivePerson.isNotManager() && (!this.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_.startableUnitList)), + cb.isEmpty(root.get(Process_.startableGroupList))); 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)); @@ -96,6 +97,9 @@ public class ProcessFactory extends ElementFactory { 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)); + } } p = cb.and(p, cb.equal(root.get(Process_.application), application.getId())); p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable)))); @@ -105,14 +109,15 @@ public class ProcessFactory extends ElementFactory { /* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */ public boolean startable(EffectivePerson effectivePerson, List identities, List units, - Process process) throws Exception { + List groups, Process process) throws Exception { if (effectivePerson.isManager() || (BooleanUtils.isTrue(this.business().organization().person().hasRole(effectivePerson, OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager)))) { return true; } if (ListTools.isEmpty(process.getStartableIdentityList()) - && ListTools.isEmpty(process.getStartableUnitList())) { + && ListTools.isEmpty(process.getStartableUnitList()) + && ListTools.isEmpty(process.getStartableGroupList())) { return true; } if (ListTools.isNotEmpty(process.getStartableIdentityList()) @@ -122,6 +127,11 @@ public class ProcessFactory extends ElementFactory { if (ListTools.isNotEmpty(process.getStartableUnitList()) && ListTools.containsAny(units, process.getStartableUnitList())) { return true; + } else { + if (ListTools.isNotEmpty(process.getStartableGroupList()) + && ListTools.containsAny(groups, process.getStartableGroupList())) { + return true; + } } } return false; diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java index ebb1ace65397076b99aad09c06c841c6b3752fcb..70f328e492b6cfb346082fefec3b96c7e3b1a877 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPerson.java @@ -2,6 +2,7 @@ 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; @@ -15,6 +16,8 @@ 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; @@ -39,20 +42,27 @@ class ActionListWithPerson extends BaseAction { try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { Business business = new Business(emc); ActionResult> result = new ActionResult<>(); - 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 ids = this.list(business, effectivePerson, roles, identities, units); - for (String id : ids) { - Application o = business.application().pick(id); - if (null != o) { - wos.add(Wo.copier.copy(o)); + 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); } - wos = business.application().sort(wos); - result.setData(wos); return result; } } @@ -72,10 +82,10 @@ class ActionListWithPerson extends BaseAction { * 两份ids的交集,这样避免列示只有application没有可以启动process的应用 */ private List list(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + 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); + List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups); return fromProcessIds; // return ListUtils.intersection(ids, fromProcessIds); } @@ -110,7 +120,7 @@ class ActionListWithPerson extends BaseAction { * 从Process中获取可以启动的Process的application. */ private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + 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); @@ -119,7 +129,8 @@ class ActionListWithPerson extends BaseAction { 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_.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)) { @@ -128,6 +139,9 @@ class ActionListWithPerson extends BaseAction { 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()); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java index 5686c9c877e7c90d2da26a0a1cbb7e50e64710b8..abd23af772c844cad055cb937a41b2f702fb6fdb 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonComplex.java @@ -2,6 +2,7 @@ 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; @@ -10,6 +11,8 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import com.x.base.core.project.cache.Cache; +import com.x.base.core.project.cache.CacheManager; import org.apache.commons.collections4.ListUtils; import com.x.base.core.container.EntityManagerContainer; @@ -33,23 +36,30 @@ class ActionListWithPersonComplex extends BaseAction { ActionResult> execute(EffectivePerson effectivePerson) throws Exception { try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { ActionResult> result = new ActionResult<>(); - List wos = new ArrayList<>(); - Business business = new Business(emc); - List identities = business.organization().identity().listWithPerson(effectivePerson); - /** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */ - List units = business.organization().unit().listWithPersonSupNested(effectivePerson); - List roles = business.organization().role().listWithPerson(effectivePerson); - List ids = this.list(business, effectivePerson, roles, identities, units); - for (String id : ids) { - Application o = business.application().pick(id); - if (null != o) { - Wo wo = Wo.copier.copy(o); - wo.setProcessList(this.referenceProcess(business, effectivePerson, identities, units, o)); - wos.add(wo); + 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<>(); + Business business = new Business(emc); + 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) { + Wo wo = Wo.copier.copy(o); + wo.setProcessList(this.referenceProcess(business, effectivePerson, identities, units, groups, o)); + wos.add(wo); + } } + wos = business.application().sort(wos); + result.setData(wos); } - wos = business.application().sort(wos); - result.setData(wos); return result; } } @@ -101,9 +111,9 @@ class ActionListWithPersonComplex extends BaseAction { * 两份ids的交集,这样避免列示只有application没有可以启动process的应用 */ private List list(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + List identities, List units, List groups) throws Exception { List ids = this.listFromApplication(business, effectivePerson, roles, identities, units); - List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units); + List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups); return ListUtils.intersection(ids, fromProcessIds); } @@ -136,7 +146,7 @@ class ActionListWithPersonComplex extends BaseAction { * 从Process中获取可以启动的Process的application. */ private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + 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); @@ -145,7 +155,8 @@ class ActionListWithPersonComplex extends BaseAction { 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_.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)) { @@ -154,15 +165,18 @@ class ActionListWithPersonComplex extends BaseAction { 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()); } private List referenceProcess(Business business, EffectivePerson effectivePerson, - List identities, List units, Application application) throws Exception { + List identities, List units, List groups, Application application) throws Exception { List ids = business.process().listStartableWithApplication(effectivePerson, identities, units, - application); + groups, application); List wos = new ArrayList<>(); for (String id : ids) { WoProcess o = WoProcess.copier.copy(business.process().pick(id)); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java index cb5c60330a976e9be4229465d234f0866461cdff..60134afe613e88bfce00bf091d5263450c430ca9 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionListWithPersonLike.java @@ -38,7 +38,8 @@ class ActionListWithPersonLike extends BaseAction { /** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */ List units = business.organization().unit().listWithPersonSupNested(effectivePerson); List roles = business.organization().role().listWithPerson(effectivePerson); - List ids = this.list(business, effectivePerson, roles, identities, units, key); + List groups = business.organization().group().listWithIdentity(identities); + List ids = this.list(business, effectivePerson, roles, identities, units, groups, key); for (String id : ids) { Application o = business.application().pick(id); wos.add(Wo.copier.copy(o)); @@ -59,9 +60,9 @@ class ActionListWithPersonLike extends BaseAction { } private List list(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units, String key) throws Exception { + List identities, List units, List groups, String key) throws Exception { List ids = this.listFromApplication(business, effectivePerson, roles, identities, units); - List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, key); + List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups, key); return ListUtils.intersection(ids, fromProcessIds); } @@ -94,7 +95,7 @@ class ActionListWithPersonLike extends BaseAction { * 从Process中获取可以启动的Process的application. */ private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units, String key) throws Exception { + List identities, List units, List groups, String key) throws Exception { EntityManager em = business.entityManagerContainer().get(Process.class); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); @@ -106,7 +107,8 @@ class ActionListWithPersonLike extends BaseAction { 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_.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)) { @@ -115,6 +117,9 @@ class ActionListWithPersonLike extends BaseAction { 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()); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java index 4e33fba0eab3b4e5ca5fd34ec54594987b80471f..8504590645dac70037ceac65d61f4386e41088ec 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java @@ -39,12 +39,13 @@ class ActionManageListWithPersonComplex extends BaseAction { /** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */ List units = business.organization().unit().listWithPersonSupNested(person); List roles = business.organization().role().listWithPerson(person); - List ids = this.list(business, effectivePerson, roles, identities, units); + 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) { Wo wo = Wo.copier.copy(o); - wo.setProcessList(this.referenceProcess(business, effectivePerson, identities, units, o)); + wo.setProcessList(this.referenceProcess(business, effectivePerson, identities, units, groups, o)); wos.add(wo); } } @@ -103,9 +104,9 @@ class ActionManageListWithPersonComplex extends BaseAction { * 两份ids的交集,这样避免列示只有application没有可以启动process的应用 */ private List list(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + List identities, List units, List groups) throws Exception { List ids = this.listFromApplication(business, effectivePerson, roles, identities, units); - List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units); + List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups); return ListUtils.intersection(ids, fromProcessIds); } @@ -138,7 +139,7 @@ class ActionManageListWithPersonComplex extends BaseAction { * 从Process中获取可以启动的Process的application. */ private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, - List identities, List units) throws Exception { + 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); @@ -146,7 +147,8 @@ class ActionManageListWithPersonComplex extends BaseAction { Predicate p = cb.conjunction(); p = cb.and(cb.isEmpty(root.get(Process_.startableIdentityList)), - cb.isEmpty(root.get(Process_.startableUnitList))); + cb.isEmpty(root.get(Process_.startableUnitList)), + cb.isEmpty(root.get(Process_.startableGroupList))); if (ListTools.isNotEmpty(identities)) { p = cb.or(p, root.get(Process_.startableIdentityList).in(identities)); @@ -154,14 +156,18 @@ class ActionManageListWithPersonComplex extends BaseAction { 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()); } private List referenceProcess(Business business, EffectivePerson effectivePerson, - List identities, List units, Application application) throws Exception { - List ids = this.listStartableWithApplication(business, effectivePerson, identities, units, application); + List identities, List units, List groups, Application application) throws Exception { + List ids = business.process().listStartableWithApplication(effectivePerson, identities, units, + groups, application); List wos = new ArrayList<>(); for (String id : ids) { WoProcess o = WoProcess.copier.copy(business.process().pick(id)); @@ -170,29 +176,4 @@ class ActionManageListWithPersonComplex extends BaseAction { wos = business.process().sort(wos); return wos; } - - /* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */ - private List listStartableWithApplication(Business business, EffectivePerson effectivePerson, - List identities, List units, Application application) 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(); - - p = cb.and(cb.isEmpty(root.get(Process_.startableIdentityList)), - cb.isEmpty(root.get(Process_.startableUnitList))); - - 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)); - } - - p = cb.and(p, cb.equal(root.get(Process_.application), application.getId())); - p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable)))); - cq.select(root.get(Process_.id)).where(p); - return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList()); - } } diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/BaseAction.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/BaseAction.java index 8058799e9b2c79a0c549f9a44779dc2a9eda63b1..46bdbe6f004cd9281a207fd92fafb3c8a2bce11b 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/BaseAction.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/BaseAction.java @@ -1,7 +1,10 @@ package com.x.processplatform.assemble.surface.jaxrs.application; +import com.x.base.core.project.cache.Cache; import com.x.base.core.project.jaxrs.StandardJaxrsAction; +import com.x.processplatform.core.entity.element.Application; +import com.x.processplatform.core.entity.element.Process; abstract class BaseAction extends StandardJaxrsAction { - + Cache.CacheCategory cacheCategory = new Cache.CacheCategory(Application.class, Process.class); } \ No newline at end of file diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/draft/ActionSave.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/draft/ActionSave.java index bea80dab03aae62afac51ca04d37d8eb5475c7d0..79b0846686de48c9870333c6931b510567e13aae 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/draft/ActionSave.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/draft/ActionSave.java @@ -48,7 +48,8 @@ class ActionSave extends BaseAction { if (!business.application().allowRead(effectivePerson, roles, identities, units, application)) { throw new ExceptionAccessDenied(effectivePerson, application); } - if (!business.process().startable(effectivePerson, identities, units, process)) { + List groups = business.organization().group().listWithIdentity(identities); + if (!business.process().startable(effectivePerson, identities, units, groups, process)) { throw new ExceptionAccessDenied(effectivePerson, process); } emc.beginTransaction(Draft.class); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListAvailableIdentityWithProcess.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListAvailableIdentityWithProcess.java index 6c05cc1407170d6e76e83f1a8817efb50f745606..13b1a0aa2245cf65a346f183f4db94c302f28670 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListAvailableIdentityWithProcess.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListAvailableIdentityWithProcess.java @@ -30,7 +30,8 @@ public class ActionListAvailableIdentityWithProcess extends BaseAction { List identities = business.organization().identity().listWithPerson(effectivePerson); List dns = new ArrayList<>(); if ((ListTools.isEmpty(process.getStartableIdentityList())) - && (ListTools.isEmpty(process.getStartableUnitList()))) { + && (ListTools.isEmpty(process.getStartableUnitList())) + && (ListTools.isEmpty(process.getStartableGroupList()))) { /** 没有设置可启动人员,所有人都可以启动 */ dns.addAll(identities); } else { @@ -39,12 +40,26 @@ public class ActionListAvailableIdentityWithProcess extends BaseAction { dns.addAll(identities); } else { for (String str : identities) { - List units = business.organization().unit().listWithIdentitySupNested(str); - if (ListTools.containsAny(units, process.getStartableUnitList()) - || process.getStartableIdentityList().contains(str)) { + if(ListTools.isNotEmpty(process.getStartableIdentityList()) && process.getStartableIdentityList().contains(str)){ dns.add(str); + }else { + if(ListTools.isNotEmpty(process.getStartableUnitList())) { + List units = business.organization().unit().listWithIdentitySupNested(str); + if (ListTools.containsAny(units, process.getStartableUnitList())) { + dns.add(str); + continue; + } + } + if(ListTools.isNotEmpty(process.getStartableGroupList())) { + List groups = business.organization().group().listWithIdentity(str); + if (ListTools.containsAny(groups, process.getStartableGroupList())) { + dns.add(str); + continue; + } + } } } + } } List os = business.organization().identity().listObject(dns); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplication.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplication.java index 121ce8c4d454e6f0fb1789e0f78b2d7a2f729d81..6b6f1eecab50afbe8f4834466126ea66d4c86c2e 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplication.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplication.java @@ -34,8 +34,8 @@ class ActionListWithPersonWithApplication extends BaseAction { if (!business.application().allowRead(effectivePerson, roles, identities, units, application)) { throw new ExceptionAccessDenied(effectivePerson); } - - List ids = business.process().listStartableWithApplication(effectivePerson, identities, units, + List groups = business.organization().group().listWithIdentity(identities); + List ids = business.process().listStartableWithApplication(effectivePerson, identities, units, groups, application); for (String id : ids) { wos.add(Wo.copier.copy(business.process().pick(id))); diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java index b414896d8f563cf26486cd9c3c2fca538b415e70..accbb862e30a7b91b74ee7597dc4d3a56c3d21f9 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java @@ -52,8 +52,8 @@ class ActionListWithPersonWithApplicationFilter extends BaseAction { if (!business.application().allowRead(effectivePerson, roles, identities, units, application)) { throw new ExceptionAccessDenied(effectivePerson); } - - List ids = list(business, effectivePerson, identities, units, application, wi); + List groups = business.organization().group().listWithIdentity(identities); + List ids = list(business, effectivePerson, identities, units, groups, application, wi); for (String id : ids) { wos.add(Wo.copier.copy(business.process().pick(id))); } @@ -64,7 +64,7 @@ class ActionListWithPersonWithApplicationFilter extends BaseAction { } public List list(Business business, EffectivePerson effectivePerson, List identities, - List units, Application application, Wi wi) throws Exception { + List units, List groups, Application application, Wi wi) throws Exception { EntityManager em = business.entityManagerContainer().get(Process.class); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); @@ -74,7 +74,8 @@ class ActionListWithPersonWithApplicationFilter extends BaseAction { && (!BooleanUtils.isTrue(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_.startableUnitList)), + cb.isEmpty(root.get(Process_.startableGroupList))); 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)); @@ -82,6 +83,9 @@ class ActionListWithPersonWithApplicationFilter extends BaseAction { 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)); + } } p = cb.and(p, cb.equal(root.get(Process_.application), application.getId())); p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)), cb.isNull(root.get(Process_.editionEnable)))); diff --git a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java index eb2e18d10d2171045ab7b732ef2fea1d3ef1a685..9e93e7cc0199662d00d4bd5782245eb4eb0ea8d2 100644 --- a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java +++ b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java @@ -295,6 +295,18 @@ public class Process extends SliceJpaObject { @CheckPersist(allowEmpty = true) private List startableUnitList; + public static final String startableGroupList_FIELDNAME = "startableGroupList"; + @FieldDescribe("在指定启动时候,允许新建Work的群组.") + @PersistentCollection(fetch = FetchType.EAGER) + @ContainerTable(name = TABLE + ContainerTableNameMiddle + + startableGroupList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle + + startableGroupList_FIELDNAME + JoinIndexNameSuffix)) + @OrderColumn(name = ORDERCOLUMNCOLUMN) + @ElementColumn(length = length_255B, name = ColumnNamePrefix + startableGroupList_FIELDNAME) + @ElementIndex(name = TABLE + IndexNameMiddle + startableGroupList_FIELDNAME + ElementIndexNameSuffix) + @CheckPersist(allowEmpty = true) + private List startableGroupList; + public static final String serialTexture_FIELDNAME = "serialTexture"; @FieldDescribe("编号定义.") @Lob @@ -866,4 +878,11 @@ public class Process extends SliceJpaObject { this.startableTerminal = startableTerminal; } + public List getStartableGroupList() { + return startableGroupList; + } + + public void setStartableGroupList(List startableGroupList) { + this.startableGroupList = startableGroupList; + } } \ No newline at end of file