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

增加流程版本管理功能

o2sword 5 лет назад
Родитель
Сommit
5e7fb47c52
20 измененных файлов с 820 добавлено и 46 удалено
  1. 6 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/MessageFactory.java
  2. 62 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ProcessFactory.java
  3. 18 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCover.java
  4. 19 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCreate.java
  5. 9 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionCreate.java
  6. 10 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionDelete.java
  7. 110 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionDeleteEdition.java
  8. 17 9
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionEdit.java
  9. 80 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionEnable.java
  10. 82 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionGetEnabled.java
  11. 46 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionListEdition.java
  12. 1 11
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionListWithApplication.java
  13. 131 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionUpgrade.java
  14. 44 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionUpgradeAll.java
  15. 14 14
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/BaseAction.java
  16. 12 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ExceptionNotExistEnabledProcess.java
  17. 12 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ExceptionProcessEnabled.java
  18. 109 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ProcessAction.java
  19. 24 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java
  20. 14 12
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java

+ 6 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/MessageFactory.java

@@ -42,4 +42,10 @@ public class MessageFactory {
 		title = StringTools.utf8SubString(title, JpaObject.length_255B);
 		MessageConnector.send(MessageConnector.TYPE_PROCESS_DELETE, title, "", process);
 	}
+
+	public static void process_upgrade(Process process) throws Exception {
+		String title = "升级流程平台流程:" + process.getName();
+		title = StringTools.utf8SubString(title, JpaObject.length_255B);
+		MessageConnector.send(MessageConnector.TYPE_PROCESS_UPDATE, title, "", process);
+	}
 }

+ 62 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ProcessFactory.java

@@ -12,8 +12,10 @@ import javax.persistence.criteria.Root;
 
 import com.x.processplatform.assemble.designer.AbstractFactory;
 import com.x.processplatform.assemble.designer.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.StringUtils;
 
 public class ProcessFactory extends AbstractFactory {
 
@@ -27,6 +29,8 @@ public class ProcessFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.equal(root.get(Process_.application), application);
+		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();
 	}
@@ -37,14 +41,72 @@ public class ProcessFactory extends AbstractFactory {
 		CriteriaQuery<Process> cq = cb.createQuery(Process.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate p = cb.equal(root.get(Process_.application), application);
+		p = cb.and(p, cb.or(cb.isTrue(root.get(Process_.editionEnable)),
+				cb.isNull(root.get(Process_.editionEnable))));
 		cq.select(root).where(p);
 		return em.createQuery(cq).getResultList();
 	}
 
+	public List<String> listProcessEdition(String application, String edition) 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.equal(root.get(Process_.application), application);
+		p = cb.and(p, cb.equal(root.get(Process_.edition), edition));
+		cq.select(root.get(Process_.id)).where(p).orderBy(cb.desc(root.get(Process_.editionNumber)));
+		return em.createQuery(cq).getResultList();
+	}
+
+	public List<Process> listProcessEditionObject(String application, String edition) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(Process.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Process> cq = cb.createQuery(Process.class);
+		Root<Process> root = cq.from(Process.class);
+		Predicate p = cb.equal(root.get(Process_.application), application);
+		p = cb.and(p, cb.equal(root.get(Process_.edition), edition));
+		cq.select(root).where(p).orderBy(cb.desc(root.get(Process_.editionNumber)));
+		return em.createQuery(cq).getResultList();
+	}
+
+	public Process getEnabledProcess(String application, String edition) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(Process.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Process> cq = cb.createQuery(Process.class);
+		Root<Process> root = cq.from(Process.class);
+		Predicate p = cb.equal(root.get(Process_.application), application);
+		p = cb.and(p, cb.equal(root.get(Process_.edition), edition));
+		p = cb.and(p, cb.isTrue(root.get(Process_.editionEnable)));
+		cq.select(root).where(p).orderBy(cb.desc(root.get(Process_.editionNumber)));
+		List<Process> list = em.createQuery(cq).getResultList();
+		if(list!=null && !list.isEmpty()){
+			return list.get(0);
+		}
+		return null;
+	}
+
 	public <T extends Process> List<T> sort(List<T> list) {
 		list = list.stream().sorted(Comparator.comparing(Process::getName, Comparator.nullsLast(String::compareTo)))
 				.collect(Collectors.toList());
 		return list;
 	}
 
+	public Double getMaxEditionNumber(String application, String edition) throws Exception {
+		if (StringUtils.isNotEmpty(edition)){
+			EntityManager em = this.entityManagerContainer().get(Process.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<Double> cq = cb.createQuery(Double.class);
+			Root<Process> root = cq.from(Process.class);
+			Predicate p = cb.equal(root.get(Process_.application), application);
+			p = cb.and(p,cb.equal(root.get(Process_.edition), edition));
+			cq.select(cb.max(root.get(Process_.editionNumber))).where(p);
+			Double max = em.createQuery(cq).getSingleResult();
+			if(max == null || max < 1.0){
+				max = 1.0;
+			}
+			return max;
+		}
+		return 1.0;
+	}
+
 }

+ 18 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCover.java

@@ -1,6 +1,7 @@
 package com.x.processplatform.assemble.designer.jaxrs.input;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -11,6 +12,7 @@ import javax.persistence.criteria.Root;
 
 import com.x.base.core.project.cache.ApplicationCache;
 import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
 
@@ -209,6 +211,22 @@ class ActionCover extends BaseAction {
 						Process.class, process.getId()));
 			}
 			process.setApplication(application.getId());
+			if (StringUtils.isNotEmpty(process.getEdition())) {
+				if(BooleanUtils.isTrue(process.getEditionEnable())) {
+					for (Process p : business.entityManagerContainer().listEqualAndEqual(Process.class, Process.application_FIELDNAME,
+							process.getApplication(), Process.edition_FIELDNAME, process.getEdition())) {
+						if (!process.getId().equals(p.getId()) && BooleanUtils.isTrue(p.getEditionEnable())) {
+							p.setLastUpdateTime(new Date());
+							p.setEditionEnable(false);
+						}
+					}
+				}
+			}else{
+				process.setEdition(process.getId());
+				process.setEditionEnable(true);
+				process.setEditionNumber(1.0);
+				process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+			}
 			persistObjects.addAll(this.coverProcessElement(business, process, WrapAgent.inCopier,
 					wrapProcess.getAgentList(), Agent.class));
 			persistObjects.addAll(this.coverProcessElement(business, process, WrapBegin.inCopier,

+ 19 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCreate.java

@@ -1,6 +1,7 @@
 package com.x.processplatform.assemble.designer.jaxrs.input;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import com.google.gson.JsonElement;
@@ -59,6 +60,8 @@ import com.x.processplatform.core.entity.element.wrap.WrapRoute;
 import com.x.processplatform.core.entity.element.wrap.WrapScript;
 import com.x.processplatform.core.entity.element.wrap.WrapService;
 import com.x.processplatform.core.entity.element.wrap.WrapSplit;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
 
 class ActionCreate extends BaseAction {
 
@@ -153,6 +156,22 @@ class ActionCreate extends BaseAction {
 			process = WrapProcess.inCopier.copy(wrapProcess);
 			process.setApplication(application.getId());
 			persistObjects.add(process);
+			if (StringUtils.isNotEmpty(process.getEdition())) {
+				if(BooleanUtils.isTrue(process.getEditionEnable())) {
+					for (Process p : business.entityManagerContainer().listEqualAndEqual(Process.class, Process.application_FIELDNAME,
+							process.getApplication(), Process.edition_FIELDNAME, process.getEdition())) {
+						if (!process.getId().equals(p.getId()) && BooleanUtils.isTrue(p.getEditionEnable())) {
+							p.setLastUpdateTime(new Date());
+							p.setEditionEnable(false);
+						}
+					}
+				}
+			}else{
+				process.setEdition(process.getId());
+				process.setEditionEnable(true);
+				process.setEditionNumber(1.0);
+				process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+			}
 			for (WrapAgent _o : wrapProcess.getAgentList()) {
 				Agent obj = business.entityManagerContainer().find(_o.getId(), Agent.class);
 				if (null != obj) {

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

@@ -32,6 +32,7 @@ import com.x.processplatform.core.entity.element.Route;
 import com.x.processplatform.core.entity.element.Service;
 import com.x.processplatform.core.entity.element.Split;
 import com.x.processplatform.core.entity.element.wrap.WrapProcess;
+import org.apache.commons.lang3.StringUtils;
 
 class ActionCreate extends BaseAction {
 
@@ -54,6 +55,7 @@ class ActionCreate extends BaseAction {
 			process.setCreatorPerson(effectivePerson.getDistinguishedName());
 			process.setLastUpdatePerson(effectivePerson.getDistinguishedName());
 			process.setLastUpdateTime(new Date());
+			this.updateEdition(process);
 			jpaObjects.add(process);
 			jpaObjects.addAll(create_agent(wrapIn.getAgentList(), process));
 			jpaObjects.add(create_begin(wrapIn.getBegin(), process));
@@ -103,4 +105,11 @@ class ActionCreate extends BaseAction {
 
 	}
 
+	private void updateEdition(Process process) throws Exception {
+		process.setEdition(process.getId());
+		process.setEditionEnable(true);
+		process.setEditionNumber(1.0);
+		process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+	}
+
 }

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

@@ -24,6 +24,10 @@ import com.x.processplatform.core.entity.element.Process;
 import com.x.processplatform.core.entity.element.Route;
 import com.x.processplatform.core.entity.element.Service;
 import com.x.processplatform.core.entity.element.Split;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
 
 class ActionDelete extends BaseAction {
 
@@ -44,6 +48,12 @@ class ActionDelete extends BaseAction {
 				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
 						application.getName(), application.getId());
 			}
+			if(StringUtils.isNotEmpty(process.getEdition()) && BooleanUtils.isTrue(process.getEditionEnable())){
+				List<String> list = business.process().listProcessEdition(process.getApplication(), process.getEdition());
+				if(list.size()>1){
+					throw new ExceptionProcessEnabled(id);
+				}
+			}
 			/* 先删除content内容 */
 			this.delete_task(business, process);
 			this.delete_taskCompleted(business, process, onlyRemoveNotCompleted);

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

@@ -0,0 +1,110 @@
+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.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.assemble.designer.MessageFactory;
+import com.x.processplatform.core.entity.element.Process;
+import com.x.processplatform.core.entity.element.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ActionDeleteEdition extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, boolean onlyRemoveNotCompleted)
+			throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Process editionProcess = emc.find(id, Process.class);
+			if (null == editionProcess) {
+				throw new ExceptionProcessNotExisted(id);
+			}
+			Application application = emc.find(editionProcess.getApplication(), Application.class);
+			if (null == application) {
+				throw new ExceptionApplicationNotExist(editionProcess.getApplication());
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
+						application.getName(), application.getId());
+			}
+			List<Process> list = new ArrayList<>();
+			if(StringUtils.isNotEmpty(editionProcess.getEdition())){
+				list.addAll(business.process().listProcessEditionObject(editionProcess.getApplication(), editionProcess.getEdition()));
+			}else{
+				list.add(editionProcess);
+			}
+			for(Process process : list) {
+				/* 先删除content内容 */
+				this.delete_task(business, process);
+				this.delete_taskCompleted(business, process, onlyRemoveNotCompleted);
+				this.delete_read(business, process);
+				this.delete_readCompleted(business, process, onlyRemoveNotCompleted);
+				this.delete_review(business, process, onlyRemoveNotCompleted);
+				this.delete_attachment(business, process, onlyRemoveNotCompleted);
+				this.delete_item(business, process, onlyRemoveNotCompleted);
+				this.delete_serialNumber(business, process);
+				this.delete_record(business, process);
+				this.delete_documentVersion(business, process);
+				this.delete_work(business, process);
+				if (!onlyRemoveNotCompleted) {
+					this.delete_workCompleted(business, process);
+				}
+				this.delete_workLog(business, process, onlyRemoveNotCompleted);
+			}
+			/* 再删除设计 */
+			emc.beginTransaction(Process.class);
+			emc.beginTransaction(Agent.class);
+			emc.beginTransaction(Begin.class);
+			emc.beginTransaction(Cancel.class);
+			emc.beginTransaction(Choice.class);
+			emc.beginTransaction(Delay.class);
+			emc.beginTransaction(Embed.class);
+			emc.beginTransaction(End.class);
+			emc.beginTransaction(Invoke.class);
+			emc.beginTransaction(Manual.class);
+			emc.beginTransaction(Merge.class);
+			emc.beginTransaction(Message.class);
+			emc.beginTransaction(Parallel.class);
+			emc.beginTransaction(Service.class);
+			emc.beginTransaction(Split.class);
+			emc.beginTransaction(Route.class);
+			for(Process process : list) {
+				this.delete_agent(business, process);
+				this.delete_begin(business, process);
+				this.delete_cancel(business, process);
+				this.delete_choice(business, process);
+				this.delete_delay(business, process);
+				this.delete_embed(business, process);
+				this.delete_end(business, process);
+				this.delete_invoke(business, process);
+				this.delete_manual(business, process);
+				this.delete_merge(business, process);
+				this.delete_message(business, process);
+				this.delete_parallel(business, process);
+				this.delete_route(business, process);
+				this.delete_service(business, process);
+				this.delete_split(business, process);
+
+				emc.remove(process);
+			}
+			emc.commit();
+			cacheNotify();
+			Wo wo = new Wo();
+			wo.setId(id);
+			result.setData(wo);
+			MessageFactory.process_delete(editionProcess);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+}

+ 17 - 9
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionEdit.java

@@ -1,7 +1,9 @@
 package com.x.processplatform.assemble.designer.jaxrs.process;
 
 import java.util.Date;
+import java.util.UUID;
 
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -54,6 +56,7 @@ class ActionEdit extends BaseAction {
 				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
 						application.getName(), application.getId());
 			}
+			Process oldProcess = (Process) BeanUtils.cloneBean(process);
 			emc.beginTransaction(Process.class);
 			emc.beginTransaction(Agent.class);
 			emc.beginTransaction(Begin.class);
@@ -71,7 +74,8 @@ class ActionEdit extends BaseAction {
 			emc.beginTransaction(Service.class);
 			emc.beginTransaction(Split.class);
 			WrapProcess.inCopier.copy(wrap, process);
-			updateCreatePersonLastUpdatePerson(effectivePerson, business, process);
+			this.updateCreatePersonLastUpdatePerson(effectivePerson, business, process);
+			this.updateEdition(oldProcess, process);
 			process.setLastUpdateTime(new Date());
 			emc.check(process, CheckPersistType.all);
 			update_agent(business, wrap.getAgentList(), process);
@@ -89,7 +93,6 @@ class ActionEdit extends BaseAction {
 			update_route(business, wrap.getRouteList(), process);
 			update_service(business, wrap.getServiceList(), process);
 			update_split(business, wrap.getSplitList(), process);
-			this.updateEdition(business, process);
 			emc.commit();
 			cacheNotify();
 			/* 保存历史版本 */
@@ -117,13 +120,18 @@ class ActionEdit extends BaseAction {
 		}
 	}
 
-	private void updateEdition(Business business, Process process) throws Exception {
-		if (StringUtils.isNotEmpty(process.getEdition()) && BooleanUtils.isTrue(process.getEditionEnable())) {
-			for (Process p : business.entityManagerContainer().listEqual(Process.class, Process.edition_FIELDNAME,
-					process.getEdition())) {
-				p.setEditionEnable(false);
-				p.setEditionName(process.getEditionName());
-			}
+	private void updateEdition(Process oldProcess, Process process) throws Exception {
+		//更新流程时保持流程的版本信息不变,但当不存在版本信息则添加版本信息
+		if (StringUtils.isEmpty(oldProcess.getEdition())) {
+			process.setEdition(process.getId());
+			process.setEditionEnable(true);
+			process.setEditionNumber(1.0);
+			process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+		}else{
+			process.setEdition(oldProcess.getEdition());
+			process.setEditionEnable(oldProcess.getEditionEnable());
+			process.setEditionNumber(oldProcess.getEditionNumber());
+			process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
 		}
 	}
 }

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

@@ -0,0 +1,80 @@
+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.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.element.Process;
+import com.x.processplatform.core.entity.element.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+
+class ActionEnable 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.find(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());
+			}
+			emc.beginTransaction(Process.class);
+			if(StringUtils.isEmpty(process.getEdition())){
+				process.setLastUpdateTime(new Date());
+				process.setEdition(process.getId());
+				process.setEditionEnable(true);
+				process.setEditionNumber(1.0);
+				process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+				this.updateCreatePersonLastUpdatePerson(effectivePerson, business, process);
+			}else{
+				if(!BooleanUtils.isTrue(process.getEditionEnable())){
+					process.setLastUpdateTime(new Date());
+					process.setEditionEnable(true);
+					this.updateCreatePersonLastUpdatePerson(effectivePerson, business, process);
+				}
+				for (Process p : business.entityManagerContainer().listEqualAndEqual(Process.class, Process.application_FIELDNAME,
+						process.getApplication(), Process.edition_FIELDNAME, process.getEdition())) {
+					if (!process.getId().equals(p.getId()) && BooleanUtils.isTrue(p.getEditionEnable())) {
+						p.setLastUpdateTime(new Date());
+						p.setEditionEnable(false);
+						this.updateCreatePersonLastUpdatePerson(effectivePerson, business, p);
+					}
+				}
+			}
+			emc.commit();
+			Wo wo = new Wo();
+			wo.setValue(true);
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WrapBoolean {
+
+	}
+
+	private void updateCreatePersonLastUpdatePerson(EffectivePerson effectivePerson, Business business, Process process)
+			throws Exception {
+		process.setLastUpdatePerson(effectivePerson.getDistinguishedName());
+		String name = business.organization().person().get(process.getCreatorPerson());
+		if (StringUtils.isEmpty(name)) {
+			process.setCreatorPerson(effectivePerson.getDistinguishedName());
+		} else {
+			process.setCreatorPerson(name);
+		}
+	}
+
+}

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

@@ -0,0 +1,82 @@
+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.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.*;
+import com.x.processplatform.core.entity.element.wrap.*;
+import org.apache.commons.lang3.StringUtils;
+
+class ActionGetEnabled 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.find(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());
+			}
+			if(StringUtils.isNotEmpty(process.getEdition())){
+				process = business.process().getEnabledProcess(process.getApplication(), process.getEdition());
+				if(process == null){
+					throw  new ExceptionNotExistEnabledProcess(id);
+				}
+			}
+			result.setData(this.get(business, process));
+			return result;
+		}
+	}
+
+	public static class Wo extends WrapProcess {
+
+		private static final long serialVersionUID = 8011824007104944097L;
+	}
+
+	private Wo get(Business business, Process process) throws Exception {
+		WrapProcess wrap = WrapProcess.outCopier.copy(process);
+		wrap.setAgentList(WrapAgent.outCopier.copy(business.entityManagerContainer().list(Agent.class,
+				business.agent().listWithProcess(process.getId()))));
+		wrap.setBegin(WrapBegin.outCopier.copy(
+				business.entityManagerContainer().find(business.begin().getWithProcess(process.getId()), Begin.class)));
+		wrap.setCancelList(WrapCancel.outCopier.copy(business.entityManagerContainer().list(Cancel.class,
+				business.cancel().listWithProcess(process.getId()))));
+		wrap.setChoiceList(WrapChoice.outCopier.copy(business.entityManagerContainer().list(Choice.class,
+				business.choice().listWithProcess(process.getId()))));
+		wrap.setDelayList(WrapDelay.outCopier.copy(business.entityManagerContainer().list(Delay.class,
+				business.delay().listWithProcess(process.getId()))));
+		wrap.setEmbedList(WrapEmbed.outCopier.copy(business.entityManagerContainer().list(Embed.class,
+				business.embed().listWithProcess(process.getId()))));
+		wrap.setEndList(WrapEnd.outCopier.copy(
+				business.entityManagerContainer().list(End.class, business.end().listWithProcess(process.getId()))));
+		wrap.setInvokeList(WrapInvoke.outCopier.copy(business.entityManagerContainer().list(Invoke.class,
+				business.invoke().listWithProcess(process.getId()))));
+		wrap.setManualList(WrapManual.outCopier.copy(business.entityManagerContainer().list(Manual.class,
+				business.manual().listWithProcess(process.getId()))));
+		wrap.setMergeList(WrapMerge.outCopier.copy(business.entityManagerContainer().list(Merge.class,
+				business.merge().listWithProcess(process.getId()))));
+		wrap.setMessageList(WrapMessage.outCopier.copy(business.entityManagerContainer().list(Message.class,
+				business.message().listWithProcess(process.getId()))));
+		wrap.setParallelList(WrapParallel.outCopier.copy(business.entityManagerContainer().list(Parallel.class,
+				business.parallel().listWithProcess(process.getId()))));
+		wrap.setServiceList(WrapService.outCopier.copy(business.entityManagerContainer().list(Service.class,
+				business.service().listWithProcess(process.getId()))));
+		wrap.setSplitList(WrapSplit.outCopier.copy(business.entityManagerContainer().list(Split.class,
+				business.split().listWithProcess(process.getId()))));
+		wrap.setRouteList(WrapRoute.outCopier.copy(business.entityManagerContainer().list(Route.class,
+				business.route().listWithProcess(process.getId()))));
+		Wo wo = gson.fromJson(gson.toJson(wrap), Wo.class);
+		return wo;
+	}
+}

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

@@ -0,0 +1,46 @@
+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.exception.ExceptionWhen;
+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.Application;
+import com.x.processplatform.core.entity.element.Process;
+
+import java.util.List;
+
+class ActionListEdition extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String applicationId, String edition) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Application application = emc.find(applicationId, Application.class, ExceptionWhen.not_found);
+			if (null == application) {
+				throw new ExceptionApplicationNotExist(applicationId);
+			}
+			if (!business.editable(effectivePerson, application)) {
+				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
+						application.getName(), application.getId());
+			}
+			List<Wo> wos = Wo.copier.copy(business.process().listProcessEditionObject(applicationId, edition));
+			wos = business.process().sort(wos);
+			result.setData(wos);
+			return result;
+		}
+	}
+
+	public static class Wo extends Process {
+
+		private static final long serialVersionUID = 1439909268641168987L;
+
+		static WrapCopier<Process, Wo> copier = WrapCopierFactory.wo(Process.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+	}
+
+}

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

@@ -35,7 +35,7 @@ class ActionListWithApplication extends BaseAction {
 				throw new ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(),
 						application.getName(), application.getId());
 			}
-			List<Wo> wos = Wo.copier.copy(this.listWithApplication(business, application));
+			List<Wo> wos = Wo.copier.copy(business.process().listWithApplicationObject(applicationId));
 			wos = business.process().sort(wos);
 			result.setData(wos);
 			return result;
@@ -50,14 +50,4 @@ class ActionListWithApplication extends BaseAction {
 				JpaObject.FieldsInvisible);
 	}
 
-	private List<Process> listWithApplication(Business business, Application application) throws Exception {
-		EntityManager em = business.entityManagerContainer().get(Process.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<Process> cq = cb.createQuery(Process.class);
-		Root<Process> root = cq.from(Process.class);
-		Predicate p = cb.equal(root.get(Process_.application), application.getId());
-		cq.select(root).where(p);
-		return em.createQuery(cq).getResultList();
-	}
-
 }

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

@@ -0,0 +1,131 @@
+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.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.assemble.designer.MessageFactory;
+import com.x.processplatform.core.entity.element.Process;
+import com.x.processplatform.core.entity.element.*;
+import com.x.processplatform.core.entity.element.wrap.WrapProcess;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+class ActionUpgrade extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		WrapProcess wrapIn = this.convertToWrapIn(jsonElement, WrapProcess.class);
+		Process process;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			process = emc.find(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());
+			}
+			if(StringUtils.isEmpty(process.getEdition())){
+				emc.beginTransaction(Process.class);
+				process.setEdition(process.getId());
+				process.setEditionEnable(true);
+				process.setEditionNumber(1.0);
+				process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+				this.updateCreatePersonLastUpdatePerson(effectivePerson, business, process);
+				process.setLastUpdateTime(new Date());
+				emc.check(process, CheckPersistType.all);
+				emc.commit();
+			}
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Process newProcess = new Process();
+			WrapProcess.inCopier.copy(wrapIn, newProcess);
+			newProcess.setId(JpaObject.createId());
+			newProcess.setEdition(process.getEdition());
+			updateCreatePersonLastUpdatePerson(effectivePerson, business, newProcess);
+			this.updateEdition(business, newProcess);
+			newProcess.setLastUpdateTime(new Date());
+			List<JpaObject> jpaObjects = new ArrayList<>();
+			jpaObjects.add(newProcess);
+			jpaObjects.addAll(create_agent(wrapIn.getAgentList(), newProcess));
+			jpaObjects.add(create_begin(wrapIn.getBegin(), newProcess));
+			jpaObjects.addAll(create_cancel(wrapIn.getCancelList(), newProcess));
+			jpaObjects.addAll(create_choice(wrapIn.getChoiceList(), newProcess));
+			jpaObjects.addAll(create_delay(wrapIn.getDelayList(), newProcess));
+			jpaObjects.addAll(create_embed(wrapIn.getEmbedList(), newProcess));
+			jpaObjects.addAll(create_end(wrapIn.getEndList(), newProcess));
+			jpaObjects.addAll(create_invoke(wrapIn.getInvokeList(), newProcess));
+			jpaObjects.addAll(create_manual(wrapIn.getManualList(), newProcess));
+			jpaObjects.addAll(create_merge(wrapIn.getMergeList(), newProcess));
+			jpaObjects.addAll(create_message(wrapIn.getMessageList(), newProcess));
+			jpaObjects.addAll(create_parallel(wrapIn.getParallelList(), newProcess));
+			jpaObjects.addAll(create_service(wrapIn.getServiceList(), newProcess));
+			jpaObjects.addAll(create_split(wrapIn.getSplitList(), newProcess));
+			jpaObjects.addAll(create_route(wrapIn.getRouteList(), newProcess));
+			emc.beginTransaction(Process.class);
+			emc.beginTransaction(Agent.class);
+			emc.beginTransaction(Begin.class);
+			emc.beginTransaction(Cancel.class);
+			emc.beginTransaction(Choice.class);
+			emc.beginTransaction(Delay.class);
+			emc.beginTransaction(Embed.class);
+			emc.beginTransaction(End.class);
+			emc.beginTransaction(Invoke.class);
+			emc.beginTransaction(Manual.class);
+			emc.beginTransaction(Merge.class);
+			emc.beginTransaction(Message.class);
+			emc.beginTransaction(Parallel.class);
+			emc.beginTransaction(Service.class);
+			emc.beginTransaction(Split.class);
+			emc.beginTransaction(Route.class);
+			for (JpaObject o : jpaObjects) {
+				emc.persist(o, CheckPersistType.all);
+			}
+			emc.commit();
+			cacheNotify();
+			Wo wo = new Wo();
+			wo.setId(newProcess.getId());
+			result.setData(wo);
+			MessageFactory.process_upgrade(newProcess);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+	private void updateCreatePersonLastUpdatePerson(EffectivePerson effectivePerson, Business business, Process process)
+			throws Exception {
+		process.setLastUpdatePerson(effectivePerson.getDistinguishedName());
+		String name = business.organization().person().get(process.getCreatorPerson());
+		if (StringUtils.isEmpty(name)) {
+			process.setCreatorPerson(effectivePerson.getDistinguishedName());
+		} else {
+			process.setCreatorPerson(name);
+		}
+	}
+
+	private void updateEdition(Business business, Process process) throws Exception {
+		process.setEditionEnable(false);
+		Double maxEn = business.process().getMaxEditionNumber(process.getApplication(), process.getEdition());
+		double newEn = (maxEn.intValue() + 1);
+		process.setEditionNumber(newEn);
+		process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+	}
+}

+ 44 - 0
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionUpgradeAll.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.annotation.CheckPersistType;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WrapBoolean;
+import com.x.processplatform.assemble.designer.Business;
+import com.x.processplatform.core.entity.element.Process;
+import org.apache.commons.lang3.StringUtils;
+
+class ActionUpgradeAll extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		if (effectivePerson.isManager()) {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				emc.beginTransaction(Process.class);
+				for (Process process : business.entityManagerContainer().listAll(Process.class)) {
+					if(StringUtils.isEmpty(process.getEdition())){
+						process.setEdition(process.getId());
+						process.setEditionEnable(true);
+						process.setEditionNumber(1.0);
+						process.setEditionName(process.getName() + "_V" + process.getEditionNumber());
+						emc.check(process, CheckPersistType.all);
+					}
+				}
+				emc.commit();
+			}
+			wo.setValue(true);
+		}else{
+			wo.setValue(false);
+		}
+		result.setData(wo);
+		return result;
+	}
+
+	public static class Wo extends WrapBoolean {
+
+	}
+}

+ 14 - 14
o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/BaseAction.java

@@ -205,8 +205,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapAgent w : wraps) {
 				Agent o = new Agent();
-				o.setProcess(process.getId());
 				WrapAgent.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -218,8 +218,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		Begin o = null;
 		if (wrap != null) {
 			o = new Begin();
-			o.setProcess(process.getId());
 			WrapBegin.inCopier.copy(wrap, o);
+			o.setProcess(process.getId());
 			o.setDistributeFactor(process.getDistributeFactor());
 		}
 		return o;
@@ -230,8 +230,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapCancel w : wraps) {
 				Cancel o = new Cancel();
-				o.setProcess(process.getId());
 				WrapCancel.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -244,8 +244,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapChoice w : wraps) {
 				Choice o = new Choice();
-				o.setProcess(process.getId());
 				WrapChoice.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -258,8 +258,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapDelay w : wraps) {
 				Delay o = new Delay();
-				o.setProcess(process.getId());
 				WrapDelay.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -272,8 +272,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapEmbed w : wraps) {
 				Embed o = new Embed();
-				o.setProcess(process.getId());
 				WrapEmbed.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -286,8 +286,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapEnd w : wraps) {
 				End o = new End();
-				o.setProcess(process.getId());
 				WrapEnd.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -300,8 +300,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapInvoke w : wraps) {
 				Invoke o = new Invoke();
-				o.setProcess(process.getId());
 				WrapInvoke.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -314,8 +314,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapManual w : wraps) {
 				Manual o = new Manual();
-				o.setProcess(process.getId());
 				WrapManual.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -328,8 +328,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapMerge w : wraps) {
 				Merge o = new Merge();
-				o.setProcess(process.getId());
 				WrapMerge.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -342,8 +342,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapMessage w : wraps) {
 				Message o = new Message();
-				o.setProcess(process.getId());
 				WrapMessage.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -356,8 +356,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapParallel w : wraps) {
 				Parallel o = new Parallel();
-				o.setProcess(process.getId());
 				WrapParallel.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -370,8 +370,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (int i = 0; i < wraps.size(); i++) {
 				Route o = new Route();
-				o.setProcess(process.getId());
 				WrapRoute.inCopier.copy(wraps.get(i), o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}
@@ -399,8 +399,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 		if (null != wraps) {
 			for (WrapSplit w : wraps) {
 				Split o = new Split();
-				o.setProcess(process.getId());
 				WrapSplit.inCopier.copy(w, o);
+				o.setProcess(process.getId());
 				o.setDistributeFactor(process.getDistributeFactor());
 				list.add(o);
 			}

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

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.designer.jaxrs.process;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNotExistEnabledProcess extends PromptException {
+
+	private static final long serialVersionUID = 7770778192986529177L;
+
+	ExceptionNotExistEnabledProcess(String flag) {
+		super("process: {} in all edition not exist enabled process.", flag);
+	}
+}

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

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.designer.jaxrs.process;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionProcessEnabled extends PromptException {
+
+	private static final long serialVersionUID = 3768001625178470667L;
+
+	ExceptionProcessEnabled(String flag) {
+		super("process: {} 存在多个版本,且当前版本处于启用状态,请启用其他版本后再删除.", flag);
+	}
+}

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

@@ -52,6 +52,24 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "获取启用版本流程内容.含所有节点和路由信息", action = ActionGetEnabled.class)
+	@GET
+	@Path("{id}/enabled")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getEnabled(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<ActionGetEnabled.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetEnabled().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "创建流程.", action = ActionCreate.class)
 	@POST
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@@ -87,6 +105,24 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "升级流程.", action = ActionUpgrade.class)
+	@POST
+	@Path("{id}/upgrade")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void upgrade(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+						@JaxrsParameterDescribe("标识") @PathParam("id") String id, JsonElement jsonElement) {
+		ActionResult<ActionUpgrade.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpgrade().execute(effectivePerson, id, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "删除流程.", action = ActionDelete.class)
 	@DELETE
 	@Path("{id}/{onlyRemoveNotCompleted}")
@@ -106,6 +142,25 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "删除流程所有版本.", action = ActionDeleteEdition.class)
+	@DELETE
+	@Path("{id}/{onlyRemoveNotCompleted}/edition")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void deleteEdition(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					   @JaxrsParameterDescribe("标识") @PathParam("id") String id,
+					   @JaxrsParameterDescribe("仅删除流转中Work") @PathParam("onlyRemoveNotCompleted") boolean onlyRemoveNotCompleted) {
+		ActionResult<ActionDeleteEdition.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDeleteEdition().execute(effectivePerson, id, onlyRemoveNotCompleted);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "列示某个应用的所有流程.", action = ActionListWithApplication.class)
 	@GET
 	@Path("application/{applicationId}")
@@ -160,4 +215,58 @@ public class ProcessAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "列示流程的所有版本.", action = ActionListEdition.class)
+	@GET
+	@Path("application/{applicationId}/edition/{edition}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listEdition(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							@JaxrsParameterDescribe("应用标识") @PathParam("applicationId") String applicationId,
+							@JaxrsParameterDescribe("流程版本标志") @PathParam("edition") String edition) {
+		ActionResult<List<ActionListEdition.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListEdition().execute(effectivePerson, applicationId, edition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "给所有流程打上版本信息.", action = ActionUpgradeAll.class)
+	@GET
+	@Path("upgrade/all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void upgradeAll(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionUpgradeAll.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpgradeAll().execute(effectivePerson);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "启用当前版本流程.", action = ActionEnable.class)
+	@GET
+	@Path("{id}/enable")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void enableProcess(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+							  @JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+		ActionResult<ActionEnable.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionEnable().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 }

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

@@ -89,6 +89,26 @@ public class ProcessFactory extends ElementFactory {
 		return o;
 	}
 
+	public Process pickEnabledEdition(String appId, String edition) throws Exception {
+		if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(edition)) {
+			return null;
+		}
+		Process o = null;
+		String cacheKey = ApplicationCache.concreteCacheKey(appId, edition);
+		Element element = cache.get(cacheKey);
+		if (null != element) {
+			if (null != element.getObjectValue()) {
+				o = (Process) element.getObjectValue();
+			}
+		} else {
+			//code is hear
+			if (null != o) {
+				cache.put(new Element(cacheKey, o));
+			}
+		}
+		return o;
+	}
+
 	private Process pickObject(String flag) throws Exception {
 		Process o = this.business().entityManagerContainer().flag(flag, Process.class );
 		if (o != null) {
@@ -138,6 +158,8 @@ public class ProcessFactory extends ElementFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Process> root = cq.from(Process.class);
 		Predicate 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;
@@ -165,6 +187,8 @@ public class ProcessFactory extends ElementFactory {
 			}
 		}
 		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;

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

@@ -17,7 +17,9 @@ import javax.persistence.OrderColumn;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
+import com.x.base.core.entity.annotation.*;
 import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.openjpa.persistence.PersistentCollection;
 import org.apache.openjpa.persistence.jdbc.ContainerTable;
 import org.apache.openjpa.persistence.jdbc.ElementColumn;
@@ -26,14 +28,6 @@ import org.apache.openjpa.persistence.jdbc.Index;
 
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.SliceJpaObject;
-import com.x.base.core.entity.annotation.CheckPersist;
-import com.x.base.core.entity.annotation.CitationExist;
-import com.x.base.core.entity.annotation.CitationNotExist;
-import com.x.base.core.entity.annotation.ContainerEntity;
-import com.x.base.core.entity.annotation.Equal;
-import com.x.base.core.entity.annotation.Flag;
-import com.x.base.core.entity.annotation.IdReference;
-import com.x.base.core.entity.annotation.RestrictFlag;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.processplatform.core.entity.PersistenceProperties;
 
@@ -72,6 +66,12 @@ public class Process extends SliceJpaObject {
 		if (this.routeNameAsOpinion == null) {
 			this.routeNameAsOpinion = true;
 		}
+		if(StringUtils.isEmpty(this.edition)){
+			this.edition = this.id;
+			this.editionEnable = true;
+			this.editionNumber = 1.0;
+			this.editionName = this.name + "_V" + this.editionNumber;
+		}
 	}
 
 	public Boolean getProjectionFully() {
@@ -137,7 +137,8 @@ public class Process extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true, simplyString = false, citationNotExists =
 	/* 同一个应用下不可重名 */
 	@CitationNotExist(fields = { "name", "id",
-			"alias" }, type = Process.class, equals = @Equal(property = "application", field = "application")))
+			"alias" }, type = Process.class, equals = @Equal(property = "application", field = "application"),
+			notEquals = @NotEqual(property = "edition", field = "edition")))
 	private String name;
 
 	public static final String alias_FIELDNAME = "alias";
@@ -147,7 +148,8 @@ public class Process extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true, simplyString = false, citationNotExists =
 	/* 同一个应用下不可重名 */
 	@CitationNotExist(fields = { "name", "id",
-			"alias" }, type = Process.class, equals = @Equal(property = "application", field = "application")))
+			"alias" }, type = Process.class, equals = @Equal(property = "application", field = "application"),
+			notEquals = @NotEqual(property = "edition", field = "edition")))
 	private String alias;
 
 	public static final String description_FIELDNAME = "description";
@@ -469,7 +471,7 @@ public class Process extends SliceJpaObject {
 	private String afterInquireScriptText;
 
 	public static final String edition_FIELDNAME = "edition";
-	@FieldDescribe("版本,唯一编码.")
+	@FieldDescribe("版本编码,不同版本的流程编码需相同.")
 	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + edition_FIELDNAME)
 	private String edition;
 
@@ -484,7 +486,7 @@ public class Process extends SliceJpaObject {
 	private Boolean editionEnable;
 
 	public static final String editionNumber_FIELDNAME = "editionNumber";
-	@FieldDescribe("版本")
+	@FieldDescribe("版本")
 	@Column(name = ColumnNamePrefix + editionNumber_FIELDNAME)
 	private Double editionNumber;