Browse Source

设计搜索内存优化,减少对象创建,减少数据输出3

o2sword 5 years ago
parent
commit
fa932e8f4c

+ 44 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionGetProcess.java

@@ -0,0 +1,44 @@
+package com.x.processplatform.assemble.designer.jaxrs.process;
+
+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.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.element.Process;
+import com.x.processplatform.core.entity.element.*;
+
+class ActionGetProcess extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Process process = emc.fetch(id, Process.class);
+			if (null == process) {
+				throw new ExceptionProcessNotExisted(id);
+			}
+			Application application = emc.find(process.getApplication(), Application.class);
+			if (null == application) {
+				throw new ExceptionApplicationNotExist(process.getApplication());
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
+						application.getName(), application.getId());
+			}
+			result.setData(Wo.outCopier.copy(process));
+			return result;
+		}
+	}
+
+	public static class Wo extends Process {
+
+		private static final long serialVersionUID = 1683913161529174561L;
+
+		public static WrapCopier<Process, Wo> outCopier = WrapCopierFactory.wo(Process.class, Wo.class,
+				null, JpaObject.FieldsInvisible);
+	}
+}

+ 138 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionGetProcessElementList.java

@@ -0,0 +1,138 @@
+package com.x.processplatform.assemble.designer.jaxrs.process;
+
+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.project.annotation.FieldDescribe;
+import com.x.base.core.project.annotation.FieldTypeDescribe;
+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.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.element.*;
+import com.x.processplatform.core.entity.element.Process;
+
+import java.util.*;
+
+class ActionGetProcessElementList extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionGetProcessElementList.class);
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Business business = new Business(emc);
+			Process process = emc.fetch(id, Process.class, ListTools.toList(Process.application_FIELDNAME));
+			if (null == process) {
+				throw new ExceptionProcessNotExisted(id);
+			}
+			Application application = emc.find(process.getApplication(), Application.class);
+			if (null == application) {
+				throw new ExceptionApplicationNotExist(process.getApplication());
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
+						application.getName(), application.getId());
+			}
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			final Map<String, Set<String>> map = new HashMap<>();
+			if(ListTools.isNotEmpty(wi.getElementWiList())){
+				wi.getElementWiList().stream().forEach(elementWi -> {
+					if (map.containsKey(elementWi.getElementType())){
+						map.get(elementWi.getElementType()).add(elementWi.getElementId());
+					}else{
+						Set<String> set = new HashSet<>();
+						set.add(elementWi.getElementId());
+						map.put(elementWi.getElementType(), set);
+					}
+				});
+			}
+			//logger.print("查询的元素信息:{}", map);
+			Wo wo = new Wo();
+			for (String key : map.keySet()){
+				if("route".equals(key)){
+					List<Route> routeList = emc.listEqualAndIn(Route.class, Route.process_FIELDNAME, id,Route.id_FIELDNAME, map.get(key));
+					wo.setRouteList(routeList);
+				}else{
+					List<Activity> list = (List<Activity>)emc.listEqualAndIn(ActivityType.getClassOfActivityType(ActivityType.valueOf(key)),
+							Route.process_FIELDNAME, id, Activity.id_FIELDNAME, map.get(key));
+					if(wo.getActivityList()==null){
+						wo.setActivityList(list);
+					}else{
+						wo.getActivityList().addAll(list);
+					}
+				}
+			}
+
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends GsonPropertyObject {
+
+		@FieldDescribe("节点信息.")
+		private List<Activity> activityList;
+
+		@FieldDescribe("路由信息.")
+		private List<Route> routeList;
+
+		public List<Activity> getActivityList() {
+			return activityList;
+		}
+
+		public void setActivityList(List<Activity> activityList) {
+			this.activityList = activityList;
+		}
+
+		public List<Route> getRouteList() {
+			return routeList;
+		}
+
+		public void setRouteList(List<Route> routeList) {
+			this.routeList = routeList;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("查询元素列表(元素类型:route|begin|agent|...)")
+		@FieldTypeDescribe(fieldType = "class", fieldTypeName = "ElementWi", fieldValue = "{\"elementType\": \"元素类型\", \"elementId\": \"元素ID\"}")
+		private List<ElementWi> elementWiList;
+
+		public List<ElementWi> getElementWiList() {
+			return elementWiList;
+		}
+
+		public void setElementWiList(List<ElementWi> elementWiList) {
+			this.elementWiList = elementWiList;
+		}
+	}
+
+	public static class ElementWi extends GsonPropertyObject {
+
+		@FieldDescribe("元素类型(route|begin|agent|...).")
+		private String elementType;
+		@FieldDescribe("元素ID.")
+		private String elementId;
+
+		public String getElementType() {
+			return elementType;
+		}
+
+		public void setElementType(String elementType) {
+			this.elementType = elementType;
+		}
+
+		public String getElementId() {
+			return elementId;
+		}
+
+		public void setElementId(String elementId) {
+			this.elementId = elementId;
+		}
+	}
+}

+ 37 - 1
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ProcessAction.java

@@ -305,4 +305,40 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-}
+	@JaxrsMethodDescribe(value = "仅获取流程内容,不包含节点和路由信息", action = ActionGetProcess.class)
+	@GET
+	@Path("{id}/process")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getProcess(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<ActionGetProcess.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetProcess().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "查询流程的指定节点或路由信息.", action = ActionGetProcessElementList.class)
+	@POST
+	@Path("{id}/list/element")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getProcessElementList(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+								  @JaxrsParameterDescribe("标识") @PathParam("id") String id, JsonElement jsonElement) {
+		ActionResult<ActionGetProcessElementList.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetProcessElementList().execute(effectivePerson, id, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 48 - 2
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/Business.java

@@ -24,6 +24,8 @@ public class Business {
 
 	private EntityManagerContainer emc;
 
+	public Business(){}
+
 	public Business(EntityManagerContainer emc) throws Exception {
 		this.emc = emc;
 	}
@@ -54,11 +56,55 @@ public class Business {
 		if (effectivePerson.isManager()) {
 			return true;
 		}
-		if (this.organization.person().hasRole(effectivePerson, OrganizationDefinition.QueryManager,
+		if (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.QueryManager,
+				OrganizationDefinition.Manager)) {
+			return true;
+		}
+		return false;
+	}
+
+	public boolean isProcessManager(EffectivePerson effectivePerson) throws Exception {
+		if (effectivePerson.isManager()) {
+			return true;
+		}
+		if (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.ProcessPlatformManager,
+				OrganizationDefinition.Manager)) {
+			return true;
+		}
+		return false;
+	}
+
+	public boolean isServiceManager(EffectivePerson effectivePerson) throws Exception {
+		if (effectivePerson.isManager()) {
+			return true;
+		}
+		if (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.ServiceManager,
+				OrganizationDefinition.Manager)) {
+			return true;
+		}
+		return false;
+	}
+
+	public boolean isCmsManager(EffectivePerson effectivePerson) throws Exception {
+		if (effectivePerson.isManager()) {
+			return true;
+		}
+		if (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.CMSManager,
+				OrganizationDefinition.Manager)) {
+			return true;
+		}
+		return false;
+	}
+
+	public boolean isPortalManager(EffectivePerson effectivePerson) throws Exception {
+		if (effectivePerson.isManager()) {
+			return true;
+		}
+		if (this.organization().person().hasRole(effectivePerson, OrganizationDefinition.PortalManager,
 				OrganizationDefinition.Manager)) {
 			return true;
 		}
 		return false;
 	}
 
-}
+}

+ 30 - 13
o2server/x_query_service_processing/src/main/java/com/x/query/service/processing/jaxrs/design/ActionSearch.java

@@ -13,6 +13,7 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.SortTools;
+import com.x.query.service.processing.Business;
 import com.x.query.service.processing.ThisApplication;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -35,11 +36,11 @@ class ActionSearch extends BaseAction {
 		}
 		logger.info("{}搜索设计:{}的关键字:{}", effectivePerson.getDistinguishedName(), wi.getModuleList(), wi.getKeyword());
 		if (ListTools.isNotEmpty(wi.getModuleList())) {
-			result.setData(search(wi));
+			result.setData(search(wi, effectivePerson));
 		}else{
 			lock.lock();
 			try {
-				result.setData(search(wi));
+				result.setData(search(wi, effectivePerson));
 			} finally {
 				lock.unlock();
 			}
@@ -47,33 +48,49 @@ class ActionSearch extends BaseAction {
 		return result;
 	}
 
-	private Wo search(final Wi wi) {
+	private Wo search(final Wi wi, EffectivePerson effectivePerson) throws Exception{
+		Business business = new Business();
 		final Map<String, List<WiDesigner.ModuleApp>> moduleMap = new HashMap<>();
 		if(!ListTools.isEmpty(wi.getModuleList())){
 			for (Module module: wi.getModuleList()){
-				if(module.getModuleType().equalsIgnoreCase(ModuleType.cms.toString())){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.cms.toString())
+						&& business.isCmsManager(effectivePerson)){
 					moduleMap.put(ModuleType.cms.toString(), module.getModuleAppList());
 				}
-				if(module.getModuleType().equalsIgnoreCase(ModuleType.portal.toString())){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.portal.toString())
+						&& business.isPortalManager(effectivePerson)){
 					moduleMap.put(ModuleType.portal.toString(), module.getModuleAppList());
 				}
-				if(module.getModuleType().equalsIgnoreCase(ModuleType.processPlatform.toString())){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.processPlatform.toString())
+						&& business.isProcessManager(effectivePerson)){
 					moduleMap.put(ModuleType.processPlatform.toString(), module.getModuleAppList());
 				}
-				if(module.getModuleType().equalsIgnoreCase(ModuleType.query.toString())){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.query.toString())
+						&& business.isManager(effectivePerson)){
 					moduleMap.put(ModuleType.query.toString(), module.getModuleAppList());
 				}
-				if(module.getModuleType().equalsIgnoreCase(ModuleType.service.toString())){
+				if(module.getModuleType().equalsIgnoreCase(ModuleType.service.toString())
+						&& business.isServiceManager(effectivePerson)){
 					moduleMap.put(ModuleType.service.toString(), module.getModuleAppList());
 				}
 			}
 		}else{
 			List<WiDesigner.ModuleApp> list = new ArrayList<>();
-			moduleMap.put(ModuleType.cms.toString(), list);
-			moduleMap.put(ModuleType.portal.toString(), list);
-			moduleMap.put(ModuleType.processPlatform.toString(), list);
-			moduleMap.put(ModuleType.query.toString(), list);
-			moduleMap.put(ModuleType.service.toString(), list);
+			if(business.isCmsManager(effectivePerson)) {
+				moduleMap.put(ModuleType.cms.toString(), list);
+			}
+			if(business.isPortalManager(effectivePerson)) {
+				moduleMap.put(ModuleType.portal.toString(), list);
+			}
+			if(business.isProcessManager(effectivePerson)) {
+				moduleMap.put(ModuleType.processPlatform.toString(), list);
+			}
+			if(business.isManager(effectivePerson)) {
+				moduleMap.put(ModuleType.query.toString(), list);
+			}
+			if(business.isServiceManager(effectivePerson)) {
+				moduleMap.put(ModuleType.service.toString(), list);
+			}
 		}
 		Executor executor = Executors.newFixedThreadPool(5);
 		CompletableFuture<List<WrapDesigner>> processPlatformCf = searchAsync(wi, moduleMap, ModuleType.processPlatform.toString(), x_processplatform_assemble_designer.class, executor);