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 new file mode 100644 index 0000000000000000000000000000000000000000..4380a34ed0e8269c663a8cd2ab5037899ae777ab --- /dev/null +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ActionManageListWithPersonComplex.java @@ -0,0 +1,201 @@ +package com.x.processplatform.assemble.surface.jaxrs.application; + +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.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_; +import org.apache.commons.collections4.ListUtils; + +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; + +class ActionManageListWithPersonComplex extends BaseAction { + + ActionResult> execute(EffectivePerson effectivePerson, String person) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + ActionResult> result = new ActionResult<>(); + List wos = new ArrayList<>(); + Business business = new Business(emc); + + if (effectivePerson.isManager()){ + List identities = business.organization().identity().listWithPerson(person); + /** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */ + List units = business.organization().unit().listWithPersonSupNested(person); + List roles = business.organization().role().listWithPerson(person); + 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); + } + } + wos = business.application().sort(wos); + result.setData(wos); + } + + return result; + } + } + + public static class Wo extends Application { + + private static final long serialVersionUID = 1176431364379021779L; + + static WrapCopier copier = WrapCopierFactory.wo(Application.class, Wo.class, null, + JpaObject.FieldsInvisible); + + @FieldDescribe("流程对象") + private List processList; + + @FieldDescribe("是否可编辑") + private Boolean allowControl; + + public Boolean getAllowControl() { + return allowControl; + } + + public void setAllowControl(Boolean allowControl) { + this.allowControl = allowControl; + } + + public List getProcessList() { + return processList; + } + + public void setProcessList(List processList) { + this.processList = processList; + } + + } + + public static class WoProcess extends Process { + + private static final long serialVersionUID = 8239383153729965245L; + public static List Excludes = new ArrayList<>(JpaObject.FieldsInvisible); + + static WrapCopier copier = WrapCopierFactory.wo(Process.class, WoProcess.class, null, + JpaObject.FieldsInvisible); + + } + + /** + * 从可见的application中获取一份ids
+ * 从可启动的process中获取一份ids
+ * 两份ids的交集,这样避免列示只有application没有可以启动process的应用 + */ + private List list(Business business, EffectivePerson effectivePerson, List roles, + List identities, List units) throws Exception { + List ids = this.listFromApplication(business, effectivePerson, roles, identities, units); + List fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units); + 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); + + Predicate p = cb.and(cb.isEmpty(root.get(Application_.availableIdentityList)), + cb.isEmpty(root.get(Application_.availableUnitList))); + + 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); + + list = em.createQuery(cq.select(root.get(Application_.id)).distinct(true)).getResultList(); + return list; + } + + /** + * + * 从Process中获取可以启动的Process的application. + */ + private List listFromProcess(Business business, EffectivePerson effectivePerson, List roles, + List identities, List units) 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)); + } + + cq.select(root.get(Process_.application)).distinct(true).where(p); + return em.createQuery(cq).getResultList(); + } + + 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 wos = new ArrayList<>(); + for (String id : ids) { + WoProcess o = WoProcess.copier.copy(business.process().pick(id)); + wos.add(o); + } + wos = business.process().sort(wos); + return wos; + } + + /* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */ + private List listStartableWithApplication(Business business, EffectivePerson effectivePerson, List identities, + List units, Application application) throws Exception { + List list = new ArrayList<>(); + 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).distinct(true); + + list = em.createQuery(cq).getResultList(); + return list; + } +} diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ApplicationAction.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ApplicationAction.java index 547b4c13099ab136fec6ca03c20d90269869ce61..fc3b2b9d2084fabff327a477e3e78ba98034fe73 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ApplicationAction.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/application/ApplicationAction.java @@ -102,6 +102,24 @@ public class ApplicationAction extends StandardJaxrsAction { asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } + @JaxrsMethodDescribe(value = "根据传入用户,获取可见的Application,并绑定其可见的Porcess", action = ActionManageListWithPersonComplex.class) + @GET + @Path("list/complex/manage/{person}") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void manageListWithPersonComplex(@Suspended final AsyncResponse asyncResponse, + @Context HttpServletRequest request, @JaxrsParameterDescribe("用户") @PathParam("person") String person) { + ActionResult> result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionManageListWithPersonComplex().execute(effectivePerson,person); + } catch (Exception e) { + logger.error(e, effectivePerson, request, null); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + @JaxrsMethodDescribe(value = "仅获取指定Application的Icon,没有权限限制", action = ActionGetIcon.class) @GET @Path("{flag}/icon")