Просмотр исходного кода

Merge branch 'feature/queryWithPersonComplex' into 'develop'

【流程管理】根据传入用户,获取可见的Application,并绑定其可见的Porcess

See merge request o2oa/o2oa!882
o2null 5 лет назад
Родитель
Сommit
69d41d9a77

+ 201 - 0
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<List<Wo>> execute(EffectivePerson effectivePerson, String person) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			List<Wo> wos = new ArrayList<>();
+			Business business = new Business(emc);
+
+			if (effectivePerson.isManager()){
+				List<String> identities = business.organization().identity().listWithPerson(person);
+				/** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */
+				List<String> units = business.organization().unit().listWithPersonSupNested(person);
+				List<String> roles = business.organization().role().listWithPerson(person);
+				List<String> 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<Application, Wo> copier = WrapCopierFactory.wo(Application.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		@FieldDescribe("流程对象")
+		private List<WoProcess> processList;
+
+		@FieldDescribe("是否可编辑")
+		private Boolean allowControl;
+
+		public Boolean getAllowControl() {
+			return allowControl;
+		}
+
+		public void setAllowControl(Boolean allowControl) {
+			this.allowControl = allowControl;
+		}
+
+		public List<WoProcess> getProcessList() {
+			return processList;
+		}
+
+		public void setProcessList(List<WoProcess> processList) {
+			this.processList = processList;
+		}
+
+	}
+
+	public static class WoProcess extends Process {
+
+		private static final long serialVersionUID = 8239383153729965245L;
+		public static List<String> Excludes = new ArrayList<>(JpaObject.FieldsInvisible);
+
+		static WrapCopier<Process, WoProcess> copier = WrapCopierFactory.wo(Process.class, WoProcess.class, null,
+				JpaObject.FieldsInvisible);
+
+	}
+
+	/**
+	 * 从可见的application中获取一份ids<br/>
+	 * 从可启动的process中获取一份ids <br/>
+	 * 两份ids的交集,这样避免列示只有application没有可以启动process的应用
+	 */
+	private List<String> list(Business business, EffectivePerson effectivePerson, List<String> roles,
+			List<String> identities, List<String> units) throws Exception {
+		List<String> ids = this.listFromApplication(business, effectivePerson, roles, identities, units);
+		List<String> fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units);
+		return ListUtils.intersection(ids, fromProcessIds);
+	}
+
+	private List<String> listFromApplication(Business business, EffectivePerson effectivePerson, List<String> roles,
+			List<String> identities, List<String> units) throws Exception {
+		List<String> list = new ArrayList<>();
+		EntityManager em = business.entityManagerContainer().get(Application.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<Application> 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<String> listFromProcess(Business business, EffectivePerson effectivePerson, List<String> roles,
+			List<String> identities, List<String> units) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Process.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<Process> 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<WoProcess> referenceProcess(Business business, EffectivePerson effectivePerson,
+			List<String> identities, List<String> units, Application application) throws Exception {
+		List<String> ids = this.listStartableWithApplication(business,effectivePerson, identities, units,
+				application);
+		List<WoProcess> 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<String> listStartableWithApplication(Business business, EffectivePerson effectivePerson, List<String> identities,
+													 List<String> units, Application application) throws Exception {
+		List<String> list = new ArrayList<>();
+		EntityManager em = business.entityManagerContainer().get(Process.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<Process> 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;
+	}
+}

+ 18 - 0
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<List<ActionManageListWithPersonComplex.Wo>> 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")

+ 3 - 1
o2web/source/x_component_LogViewer/Main.js

@@ -61,7 +61,9 @@ MWF.xApplication.LogViewer.Main = new Class({
         o2.Actions.load("x_program_center").CommandAction.getNodeInfoList(
             function( json ){
                 var nodeList = json.data.nodeList;
-                new Element("option", {"value": "*", "text": "*"}).inject(this.nodeSelect);
+                if(nodeList.length>1){
+                    new Element("option", {"value": "*", "text": "*"}).inject(this.nodeSelect);
+                }
                 nodeList.each(function (node) {
                     new Element("option", {
                         "value": node.node.nodeAgentPort,