瀏覽代碼

Merge branch 'feature/processTerminal' into 'develop'

Feature/process terminal

See merge request o2oa/o2oa!928
o2null 5 年之前
父節點
當前提交
669a9c14c4

+ 0 - 29
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java

@@ -187,35 +187,6 @@ public class ProcessFactory extends ElementFactory {
 		return em.createQuery(cq).getResultList();
 	}
 
-	/* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */
-	public List<String> listStartableWithApplicationTerminalMobile(EffectivePerson effectivePerson,
-			List<String> identities, List<String> units, Application application) throws Exception {
-		EntityManager em = this.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();
-		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)));
-			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));
-			}
-		}
-		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))));
-		// 不指名仅在client端可启动那么可启动
-		p = cb.and(p, cb.or(cb.isNull(root.get(Process_.startableTerminal)),
-				cb.notEqual(root.get(Process_.startableTerminal), Process.DEFAULTSTARTABLETERMINAL_CLIENT)));
-		cq.select(root.get(Process_.id)).where(p).distinct(true);
-		return em.createQuery(cq).getResultList();
-	}
-
 	/* 获取用户可启动的流程,如果applicationId 为空则取到所有可启动流程 */
 	public boolean startable(EffectivePerson effectivePerson, List<String> identities, List<String> units,
 			Process process) throws Exception {

+ 123 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationFilter.java

@@ -0,0 +1,123 @@
+package com.x.processplatform.assemble.surface.jaxrs.process;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.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.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+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.organization.OrganizationDefinition;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.SortTools;
+import com.x.processplatform.assemble.surface.Business;
+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.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+class ActionListWithPersonWithApplicationFilter extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String applicationFlag, JsonElement jsonElement)
+			throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Business business = new Business(emc);
+			List<Wo> wos = new ArrayList<>();
+			Application application = business.application().pick(applicationFlag);
+			if (null == application) {
+				throw new ExceptionEntityNotExist(applicationFlag, Application.class);
+			}
+			List<String> roles = business.organization().role().listWithPerson(effectivePerson);
+			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
+			List<String> units = business.organization().unit().listWithPersonSupNested(effectivePerson);
+			if (!business.application().allowRead(effectivePerson, roles, identities, units, application)) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+
+			List<String> ids = list(business, effectivePerson, identities, units, application, wi);
+			for (String id : ids) {
+				wos.add(Wo.copier.copy(business.process().pick(id)));
+			}
+			SortTools.asc(wos, false, "name");
+			result.setData(wos);
+			return result;
+		}
+	}
+
+	public List<String> list(Business business, EffectivePerson effectivePerson, List<String> identities,
+			List<String> units, Application application, Wi wi) 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();
+		if (effectivePerson.isNotManager()
+				&& (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)));
+			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));
+			}
+		}
+		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))));
+		if (StringUtils.equals(wi.getStartableTerminal(), Process.STARTABLETERMINAL_CLIENT)) {
+			p = cb.and(p,
+					cb.or(cb.isNull(root.get(Process_.startableTerminal)),
+							cb.equal(root.get(Process_.startableTerminal), Process.STARTABLETERMINAL_CLIENT),
+							cb.equal(root.get(Process_.startableTerminal), Process.STARTABLETERMINAL_ALL)));
+		} else if (StringUtils.equals(wi.getStartableTerminal(), Process.STARTABLETERMINAL_MOBILE)) {
+			p = cb.and(p,
+					cb.or(cb.isNull(root.get(Process_.startableTerminal)),
+							cb.equal(root.get(Process_.startableTerminal), Process.STARTABLETERMINAL_MOBILE),
+							cb.equal(root.get(Process_.startableTerminal), Process.STARTABLETERMINAL_ALL)));
+		}
+
+		cq.select(root.get(Process_.id)).where(p).distinct(true);
+		return em.createQuery(cq).getResultList();
+	}
+
+	public static class Wo extends Process {
+
+		private static final long serialVersionUID = 1521228691441978462L;
+
+		static WrapCopier<Process, Wo> copier = WrapCopierFactory.wo(Process.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+	}
+
+	public static class Wi extends GsonPropertyObject {
+		@FieldDescribe("可启动流程终端类型,可选值 client,mobile,all")
+		private String startableTerminal;
+
+		public String getStartableTerminal() {
+			return startableTerminal;
+		}
+
+		public void setStartableTerminal(String startableTerminal) {
+			this.startableTerminal = startableTerminal;
+		}
+	}
+}

+ 0 - 56
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionListWithPersonWithApplicationTerminalMobile.java

@@ -1,56 +0,0 @@
-package com.x.processplatform.assemble.surface.jaxrs.process;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.exception.ExceptionAccessDenied;
-import com.x.base.core.project.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.tools.SortTools;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.core.entity.element.Application;
-import com.x.processplatform.core.entity.element.Process;
-
-class ActionListWithPersonWithApplicationTerminalMobile extends BaseAction {
-
-	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String applicationFlag) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
-			Business business = new Business(emc);
-			List<Wo> wos = new ArrayList<>();
-			Application application = business.application().pick(applicationFlag);
-			if (null == application) {
-				throw new ExceptionEntityNotExist(applicationFlag, Application.class);
-			}
-			List<String> roles = business.organization().role().listWithPerson(effectivePerson);
-			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
-			List<String> units = business.organization().unit().listWithPersonSupNested(effectivePerson);
-			if (!business.application().allowRead(effectivePerson, roles, identities, units, application)) {
-				throw new ExceptionAccessDenied(effectivePerson);
-			}
-
-			List<String> ids = business.process().listStartableWithApplicationTerminalMobile(effectivePerson,
-					identities, units, application);
-			for (String id : ids) {
-				wos.add(Wo.copier.copy(business.process().pick(id)));
-			}
-			SortTools.asc(wos, false, "name");
-			result.setData(wos);
-			return result;
-		}
-	}
-
-	public static class Wo extends Process {
-
-		private static final long serialVersionUID = 1521228691441978462L;
-
-		static WrapCopier<Process, Wo> copier = WrapCopierFactory.wo(Process.class, Wo.class, null,
-				JpaObject.FieldsInvisible);
-	}
-}

+ 16 - 9
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ProcessAction.java

@@ -3,7 +3,12 @@ package com.x.processplatform.assemble.surface.jaxrs.process;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
@@ -100,20 +105,22 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "根据指定Application获取mobile端可启动的流程.", action = ActionListWithPersonWithApplicationTerminalMobile.class)
-	@GET
-	@Path("list/application/{applicationFlag}/terminal/mobile")
+	@JaxrsMethodDescribe(value = "根据指定Application和指定条件获取可启动的流程.", action = ActionListWithPersonWithApplicationFilter.class)
+	@POST
+	@Path("list/application/{applicationFlag}/filter")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void listWithPersonWithApplicationTerminalMobile(@Suspended final AsyncResponse asyncResponse,
+	public void listWithPersonWithApplicationFilter(@Suspended final AsyncResponse asyncResponse,
 			@Context HttpServletRequest request,
-			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag) {
-		ActionResult<List<ActionListWithPersonWithApplicationTerminalMobile.Wo>> result = new ActionResult<>();
+			@JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag,
+			JsonElement jsonElement) {
+		ActionResult<List<ActionListWithPersonWithApplicationFilter.Wo>> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
-			result = new ActionListWithPersonWithApplicationTerminalMobile().execute(effectivePerson, applicationFlag);
+			result = new ActionListWithPersonWithApplicationFilter().execute(effectivePerson, applicationFlag,
+					jsonElement);
 		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
+			logger.error(e, effectivePerson, request, jsonElement);
 			result.error(e);
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));

+ 5 - 5
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java

@@ -46,12 +46,12 @@ public class Process extends SliceJpaObject {
 	public static final String SERIALPHASE_ARRIVE = "arrive";
 	public static final String SERIALPHASE_INQUIRE = "inquire";
 
-	public static final String DEFAULTSTARTMODE_DRAFT = "draft";
-	public static final String DEFAULTSTARTMODE_INSTANCE = "instance";
+	public static final String STARTMODE_DRAFT = "draft";
+	public static final String STARTMODE_INSTANCE = "instance";
 
-	public static final String DEFAULTSTARTABLETERMINAL_CLIENT = "client";
-	public static final String DEFAULTSTARTABLETERMINAL_MOBILE = "mobile";
-	public static final String DEFAULTSTARTABLETERMINAL_ALL = "all";
+	public static final String STARTABLETERMINAL_CLIENT = "client";
+	public static final String STARTABLETERMINAL_MOBILE = "mobile";
+	public static final String STARTABLETERMINAL_ALL = "all";
 
 	public String getId() {
 		return id;