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

Merge branch 'feature/add_process_version' into 'develop'

Merge of feature/[流程平台]新增流程版本管理的后台服务 to develop

See merge request o2oa/o2oa!224
胡起 5 лет назад
Родитель
Сommit
aaa834495d
25 измененных файлов с 1677 добавлено и 53 удалено
  1. 62 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/element/factory/ProcessFactory.java
  2. 18 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCover.java
  3. 19 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/input/ActionCreate.java
  4. 9 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionCreate.java
  5. 10 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionDelete.java
  6. 110 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionDeleteEdition.java
  7. 17 9
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionEdit.java
  8. 81 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionEnable.java
  9. 82 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionGetEnabled.java
  10. 46 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionListEdition.java
  11. 1 11
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionListWithApplication.java
  12. 131 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionUpgrade.java
  13. 45 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ActionUpgradeAll.java
  14. 14 14
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/BaseAction.java
  15. 12 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ExceptionNotExistEnabledProcess.java
  16. 12 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ExceptionProcessEnabled.java
  17. 109 0
      o2server/x_processplatform_assemble_designer/src/main/java/com/x/processplatform/assemble/designer/jaxrs/process/ProcessAction.java
  18. 62 5
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/factory/element/ProcessFactory.java
  19. 5 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/process/ActionGetWithProcessWithApplication.java
  20. 3 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreate.java
  21. 391 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateForce.java
  22. 3 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateWithApplicationProcess.java
  23. 380 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateWithApplicationProcessForce.java
  24. 41 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java
  25. 14 12
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java

+ 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());
 		}
 	}
 }

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

@@ -0,0 +1,81 @@
+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();
+			cacheNotify();
+			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_update(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());
+	}
+}

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

@@ -0,0 +1,45 @@
+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();
+				cacheNotify();
+			}
+			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));
+	}
+
 }

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

@@ -14,7 +14,6 @@ import javax.persistence.criteria.Root;
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.exception.ExceptionWhen;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.organization.OrganizationDefinition;
 import com.x.base.core.project.tools.ListTools;
@@ -80,9 +79,30 @@ public class ProcessFactory extends ElementFactory {
 				o = (Process) element.getObjectValue();
 			}
 		} else {
-			o = this.entityManagerContainer().restrictFlag(flag, Process.class, Process.application_FIELDNAME,
-					application.getId());
+			o = this.restrictProcess(application.getId(), flag);
 			if (null != o) {
+				this.entityManagerContainer().get(Process.class).detach(o);
+				cache.put(new Element(cacheKey, o));
+			}
+		}
+		return o;
+	}
+
+	public Process pickEnabled(String application, String edition) throws Exception {
+		if (StringUtils.isEmpty(application) || StringUtils.isEmpty(edition)) {
+			return null;
+		}
+		Process o = null;
+		String cacheKey = ApplicationCache.concreteCacheKey(application, edition);
+		Element element = cache.get(cacheKey);
+		if (null != element) {
+			if (null != element.getObjectValue()) {
+				o = (Process) element.getObjectValue();
+			}
+		} else {
+			o = this.getEnabledProcess(application, edition);
+			if (null != o) {
+				this.entityManagerContainer().get(Process.class).detach(o);
 				cache.put(new Element(cacheKey, o));
 			}
 		}
@@ -121,8 +141,7 @@ public class ProcessFactory extends ElementFactory {
 				o = (Process) element.getObjectValue();
 			}
 		} else {
-			o = this.entityManagerContainer().restrictFlag(flag, Process.class, Process.application_FIELDNAME,
-					application.getId());
+			o = this.restrictProcess(application.getId(), flag);
 			if (null != o) {
 				cache.put(new Element(cacheKey, o));
 			}
@@ -138,6 +157,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 +186,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;
@@ -186,6 +209,40 @@ public class ProcessFactory extends ElementFactory {
 		return list;
 	}
 
+	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.or(cb.isTrue(root.get(Process_.editionEnable)),
+				cb.isNull(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 Process restrictProcess(String application, String flag) 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.or(cb.equal(root.get(Process_.id), flag),
+				cb.equal(root.get(Process_.name), flag),
+				cb.equal(root.get(Process_.alias), flag)));
+		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 boolean allowControl(EffectivePerson effectivePerson, Process process)
 	// throws Exception {

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

@@ -11,6 +11,8 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.element.Application;
 import com.x.processplatform.core.entity.element.Process;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
 
 public class ActionGetWithProcessWithApplication extends BaseAction {
 
@@ -26,6 +28,9 @@ public class ActionGetWithProcessWithApplication extends BaseAction {
 			if (null == process) {
 				throw new ExceptionEntityNotExist(flag, Process.class);
 			}
+			if(StringUtils.isNotEmpty(process.getEdition()) && BooleanUtils.isFalse(process.getEditionEnable())){
+				process = business.process().pickEnabled(process.getApplication(), process.getEdition());
+			}
 			Wo wo = Wo.copier.copy(process);
 			result.setData(wo);
 			return result;

+ 3 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreate.java

@@ -66,6 +66,9 @@ class ActionCreate extends BaseAction {
 			if (null == process) {
 				throw new ExceptionProcessNotExist(processFlag);
 			}
+			if(StringUtils.isNotEmpty(process.getEdition()) && BooleanUtils.isFalse(process.getEditionEnable())){
+				process = business.process().pickEnabled(process.getApplication(), process.getEdition());
+			}
 			Application application = business.application().pick(process.getApplication());
 			List<String> roles = business.organization().role().listWithPerson(effectivePerson);
 			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);

+ 391 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateForce.java

@@ -0,0 +1,391 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+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.Applications;
+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.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.TokenType;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Audit;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Unit;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.SortTools;
+import com.x.base.core.project.x_processplatform_service_processing;
+import com.x.organization.core.express.Organization;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.ThisApplication;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.*;
+import com.x.processplatform.core.entity.element.Application;
+import com.x.processplatform.core.entity.element.Process;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+class ActionCreateForce extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionCreateForce.class);
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String processFlag, JsonElement jsonElement)
+			throws Exception {
+		Audit audit = logger.audit(effectivePerson);
+		/* 新建工作id */
+		String workId = "";
+		/* 已存在草稿id */
+		String lastestWorkId = "";
+		String identity = null;
+		Process process = null;
+		List<Wo> wos = new ArrayList<>();
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			identity = this.decideCreatorIdentity(business, effectivePerson, wi);
+			process = business.process().pick(processFlag);
+			if (null == process) {
+				throw new ExceptionProcessNotExist(processFlag);
+			}
+			Application application = business.application().pick(process.getApplication());
+			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 ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(), application.getId());
+			}
+			if (BooleanUtils.isTrue(wi.getLatest())) {
+				/* 判断是否是要直接打开之前创建的草稿,草稿的判断标准:有待办无任何已办 */
+				lastestWorkId = this.latest(business, process, identity);
+				workId = lastestWorkId;
+			}
+		}
+		if (StringUtils.isEmpty(workId)) {
+			WoId woId = ThisApplication.context().applications().postQuery(x_processplatform_service_processing.class,
+					Applications.joinQueryUri("work", "process", process.getId()), wi.getData(), process.getId())
+					.getData(WoId.class);
+			workId = woId.getId();
+		}
+		/* 设置Work信息 */
+		if (BooleanUtils.isFalse(wi.getLatest()) || (StringUtils.isEmpty(lastestWorkId))) {
+			/* 如果不是草稿那么需要进行设置 */
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				Organization organization = business.organization();
+				emc.beginTransaction(Work.class);
+				Work work = emc.find(workId, Work.class);
+				if (null == work) {
+					throw new ExceptionWorkNotExist(workId);
+				}
+				work.setTitle(wi.getTitle());
+				work.setCreatorIdentity(identity);
+				work.setCreatorPerson(organization.person().getWithIdentity(identity));
+				work.setCreatorUnit(organization.unit().getWithIdentity(identity));
+				if (StringUtils.isNotEmpty(work.getCreatorUnit())) {
+					Unit unit = organization.unit().getObject(work.getCreatorUnit());
+					work.setCreatorUnitLevelName(unit.getLevelName());
+				}
+				emc.commit();
+			}
+			/* 驱动工作 */
+			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
+					"work/" + URLEncoder.encode(workId, DefaultCharset.name) + "/processing", null, processFlag);
+		} else {
+			/* 如果是草稿,准备后面的直接打开 */
+			workId = lastestWorkId;
+		}
+		/* 拼装返回结果 */
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Work work = emc.find(workId, Work.class);
+			/* 如果work是从开始->执行任务->结束,这里work已经结束那么有可能这里已经没有work了. */
+			if (null != work) {
+				List<String> ids = business.workLog()
+						.listWithFromActivityTokenForwardNotConnected(work.getActivityToken());
+				/* 先取得没有结束的WorkLog */
+				List<WorkLog> list = emc.list(WorkLog.class, ids);
+				wos = this.refercenceWorkLog(business, list);
+				/* 标识当前用户的待办 */
+				for (Wo o : wos) {
+					o.setCurrentTaskIndex(-1);
+					for (int i = 0; i < o.getTaskList().size(); i++) {
+						WoTask t = o.getTaskList().get(i);
+						if (StringUtils.equals(effectivePerson.getDistinguishedName(), t.getPerson())) {
+							o.setCurrentTaskIndex(i);
+						}
+					}
+				}
+				audit.log(null, "填单");
+			}
+		}
+		result.setData(wos);
+		return result;
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("直接打开指定人员已经有的草稿,草稿判断:工作没有已办,只有一条此人的待办.")
+		private Boolean latest;
+
+		@FieldDescribe("标题.")
+		private String title;
+
+		@FieldDescribe("启动人员身份.")
+		private String identity;
+
+		@FieldDescribe("工作数据.")
+		private JsonElement data;
+
+		public String getTitle() {
+			return title;
+		}
+
+		public void setTitle(String title) {
+			this.title = title;
+		}
+
+		public String getIdentity() {
+			return identity;
+		}
+
+		public void setIdentity(String identity) {
+			this.identity = identity;
+		}
+
+		public JsonElement getData() {
+			return data;
+		}
+
+		public void setData(JsonElement data) {
+			this.data = data;
+		}
+
+		public Boolean getLatest() {
+			return latest;
+		}
+
+		public void setLatest(Boolean latest) {
+			this.latest = latest;
+		}
+
+	}
+
+	public static class Wo extends WorkLog {
+
+		private static final long serialVersionUID = 1307569946729101786L;
+
+		// private static List<String> Includes = ListTools.toList("createTime",
+		// "updateTime", "completed", "fromActivity",
+		// "fromActivityType", "fromActivityName", "fromActivityToken",
+		// "fromTime", "arrivedActivity",
+		// "arrivedActivityType", "arrivedActivityName", "arrivedActivityToken",
+		// "arrivedTime", "route",
+		// "routeName", "work", "workCompleted", "connected", "splitting",
+		// "splitTokenList", "processingType");
+
+		static WrapCopier<WorkLog, Wo> copier = WrapCopierFactory.wo(WorkLog.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("已办对象")
+		private List<WoTaskCompleted> taskCompletedList;
+
+		@FieldDescribe("待办对象")
+		private List<WoTask> taskList;
+
+		@FieldDescribe("当前待办序号")
+		private Integer currentTaskIndex;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public Integer getCurrentTaskIndex() {
+			return currentTaskIndex;
+		}
+
+		public void setCurrentTaskIndex(Integer currentTaskIndex) {
+			this.currentTaskIndex = currentTaskIndex;
+		}
+
+		public List<WoTask> getTaskList() {
+			return taskList;
+		}
+
+		public void setTaskList(List<WoTask> taskList) {
+			this.taskList = taskList;
+		}
+
+		public List<WoTaskCompleted> getTaskCompletedList() {
+			return taskCompletedList;
+		}
+
+		public void setTaskCompletedList(List<WoTaskCompleted> taskCompletedList) {
+			this.taskCompletedList = taskCompletedList;
+		}
+
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 2279846765261247910L;
+
+		// public static List<String> Includes = ListTools.toList("createTime",
+		// "updateTime", "startTime",
+		// "startTimeMonth", "person", "identity", "unit", "topUnit",
+		// "routeList", "routeNameList", "work",
+		// "allowRapid");
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class, null,
+				JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		private WorkControl control;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public WorkControl getControl() {
+			return control;
+		}
+
+		public void setControl(WorkControl control) {
+			this.control = control;
+		}
+
+	}
+
+	public static class WoTaskCompleted extends TaskCompleted {
+
+		private static final long serialVersionUID = -7253999118308715077L;
+
+		public static WrapCopier<TaskCompleted, WoTaskCompleted> copier = WrapCopierFactory.wo(TaskCompleted.class,
+				WoTaskCompleted.class, null, JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		private WorkControl control;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public WorkControl getControl() {
+			return control;
+		}
+
+		public void setControl(WorkControl control) {
+			this.control = control;
+		}
+
+	}
+
+	private List<Wo> refercenceWorkLog(Business business, List<WorkLog> list) throws Exception {
+		List<Wo> os = new ArrayList<>();
+		for (WorkLog o : list) {
+			Wo wo = Wo.copier.copy(o);
+			if (BooleanUtils.isNotTrue(o.getConnected())) {
+				this.referenceTask(business, wo);
+			} else {
+				/** 已经完成的不会有待办,返回一个空数组 */
+				wo.setTaskList(new ArrayList<WoTask>());
+			}
+			this.referenceTaskCompleted(business, wo);
+			os.add(wo);
+		}
+		SortTools.asc(os, false, "arrivedTime");
+		return os;
+	}
+
+	private String decideCreatorIdentity(Business business, EffectivePerson effectivePerson, Wi wi) throws Exception {
+		if (TokenType.cipher.equals(effectivePerson.getTokenType())) {
+			return business.organization().identity().get(wi.getIdentity());
+		} else if (StringUtils.isNotEmpty(wi.getIdentity())) {
+			List<String> identities = business.organization().identity()
+					.listWithPerson(effectivePerson.getDistinguishedName());
+			if (ListTools.isEmpty(identities)) {
+				throw new ExceptionNoneIdentity(effectivePerson.getDistinguishedName());
+			} else if (identities.size() == 1) {
+				return identities.get(0);
+			} else {
+				/* 有多个身份需要逐一判断是否包含. */
+				for (String o : identities) {
+					if (StringUtils.equals(o, wi.getIdentity())) {
+						return o;
+					}
+				}
+			}
+		} else {
+			List<String> list = business.organization().identity()
+					.listWithPerson(effectivePerson.getDistinguishedName());
+			if (!list.isEmpty()) {
+				return list.get(0);
+			}
+		}
+		throw new Exception("decideCreatorIdentity error:" + wi.toString());
+	}
+
+	private void referenceTask(Business business, Wo wo) throws Exception {
+		List<String> ids = business.task().listWithActivityToken(wo.getFromActivityToken());
+		List<WoTask> list = WoTask.copier.copy(business.entityManagerContainer().list(Task.class, ids));
+		SortTools.asc(list, false, "startTime");
+		wo.setTaskList(list);
+	}
+
+	private void referenceTaskCompleted(Business business, Wo wo) throws Exception {
+		List<String> ids = business.taskCompleted().listWithActivityToken(wo.getFromActivityToken());
+		List<WoTaskCompleted> list = WoTaskCompleted.copier
+				.copy(business.entityManagerContainer().list(TaskCompleted.class, ids));
+		Collections.sort(list, new Comparator<WoTaskCompleted>() {
+			public int compare(WoTaskCompleted o1, WoTaskCompleted o2) {
+				return ObjectUtils.compare(o1.getCompletedTime(), o2.getCompletedTime(), true);
+			}
+		});
+		/* 补充召回 */
+		List<WoTaskCompleted> results = new ArrayList<>();
+		for (WoTaskCompleted o : list) {
+			results.add(o);
+			if (o.getProcessingType().equals(ProcessingType.retract)) {
+				WoTaskCompleted retract = new WoTaskCompleted();
+				o.copyTo(retract);
+				retract.setRouteName("撤回");
+				retract.setOpinion("撤回");
+				retract.setStartTime(retract.getRetractTime());
+				retract.setCompletedTime(retract.getRetractTime());
+				results.add(retract);
+			}
+		}
+		wo.setTaskCompletedList(results);
+	}
+
+}

+ 3 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateWithApplicationProcess.java

@@ -72,6 +72,9 @@ class ActionCreateWithApplicationProcess extends BaseAction {
 			if (null == process) {
 				throw new ExceptionProcessNotExist(processFlag);
 			}
+			if(StringUtils.isNotEmpty(process.getEdition()) && BooleanUtils.isFalse(process.getEditionEnable())){
+				process = business.process().pickEnabled(process.getApplication(), process.getEdition());
+			}
 			List<String> roles = business.organization().role().listWithPerson(effectivePerson);
 			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
 			List<String> units = business.organization().unit().listWithPersonSupNested(effectivePerson);

+ 380 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCreateWithApplicationProcessForce.java

@@ -0,0 +1,380 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+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.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.TokenType;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Audit;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Unit;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.SortTools;
+import com.x.base.core.project.x_processplatform_service_processing;
+import com.x.organization.core.express.Organization;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.ThisApplication;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.*;
+import com.x.processplatform.core.entity.element.Application;
+import com.x.processplatform.core.entity.element.Process;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/*
+ * 根据应用名称和流程名称进行创建,和直接用process创建基本相同
+ * */
+class ActionCreateWithApplicationProcessForce extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionCreateWithApplicationProcessForce.class);
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String applicationFlag, String processFlag,
+			JsonElement jsonElement) throws Exception {
+		Audit audit = logger.audit(effectivePerson);
+		/* 新建工作id */
+		String workId = "";
+		/* 已存在草稿id */
+		String lastestWorkId = "";
+		String identity = null;
+		List<Wo> wos = new ArrayList<>();
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			identity = this.decideCreatorIdentity(business, effectivePerson, wi);
+			Application application = business.application().pick(applicationFlag);
+			if (null == application) {
+				throw new ExceptionApplicationNotExist(applicationFlag);
+			}
+			Process process = business.process().pick(application, processFlag);
+			if (null == process) {
+				throw new ExceptionProcessNotExist(processFlag);
+			}
+			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 ExceptionApplicationAccessDenied(effectivePerson.getDistinguishedName(), application.getId());
+			}
+			if (BooleanUtils.isTrue(wi.getLatest())) {
+				/* 判断是否是要直接打开之前创建的草稿,草稿的判断标准:有待办无任何已办 */
+				lastestWorkId = this.latest(business, process, identity);
+				workId = lastestWorkId;
+			}
+			if (StringUtils.isEmpty(workId)) {
+				WoId woId = ThisApplication.context().applications()
+						.postQuery(x_processplatform_service_processing.class,
+								"work/process/" + URLEncoder.encode(process.getId(), DefaultCharset.name), wi.getData())
+						.getData(WoId.class);
+				workId = woId.getId();
+			}
+		}
+		/* 设置Work信息 */
+		if (BooleanUtils.isFalse(wi.getLatest()) || (StringUtils.isEmpty(lastestWorkId))) {
+			/* 如果不是草稿那么需要进行设置 */
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				Organization organization = business.organization();
+				emc.beginTransaction(Work.class);
+				Work work = emc.find(workId, Work.class);
+				if (null == work) {
+					throw new ExceptionWorkNotExist(workId);
+				}
+				work.setTitle(wi.getTitle());
+				work.setCreatorIdentity(identity);
+				work.setCreatorPerson(organization.person().getWithIdentity(identity));
+				work.setCreatorUnit(organization.unit().getWithIdentity(identity));
+				if (StringUtils.isNotEmpty(work.getCreatorUnit())) {
+					Unit unit = organization.unit().getObject(work.getCreatorUnit());
+					work.setCreatorUnitLevelName(unit.getLevelName());
+				}
+				emc.commit();
+			}
+			/* 驱动工作 */
+			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
+					"work/" + URLEncoder.encode(workId, DefaultCharset.name) + "/processing", null);
+		} else {
+			/* 如果是草稿,准备后面的直接打开 */
+			workId = lastestWorkId;
+		}
+		/* 拼装返回结果 */
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Work work = emc.find(workId, Work.class);
+			if (null == work) {
+				throw new ExceptionWorkNotExist(workId);
+			}
+			List<String> ids = business.workLog().listWithFromActivityTokenForwardNotConnected(work.getActivityToken());
+			/* 先取得没有结束的WorkLog */
+			List<WorkLog> list = emc.list(WorkLog.class, ids);
+			wos = this.refercenceWorkLog(business, list);
+			/* 标识当前用户的待办 */
+			for (Wo o : wos) {
+				o.setCurrentTaskIndex(-1);
+				for (int i = 0; i < o.getTaskList().size(); i++) {
+					WoTask t = o.getTaskList().get(i);
+					if (StringUtils.equals(effectivePerson.getDistinguishedName(), t.getPerson())) {
+						o.setCurrentTaskIndex(i);
+					}
+				}
+			}
+			audit.log(null, "填单");
+		}
+		result.setData(wos);
+		return result;
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("直接打开指定人员已经有的草稿,草稿判断:工作没有已办,只有一条此人的待办.")
+		private Boolean latest;
+
+		@FieldDescribe("标题.")
+		private String title;
+
+		@FieldDescribe("启动人员身份.")
+		private String identity;
+
+		@FieldDescribe("工作数据.")
+		private JsonElement data;
+
+		public String getTitle() {
+			return title;
+		}
+
+		public void setTitle(String title) {
+			this.title = title;
+		}
+
+		public String getIdentity() {
+			return identity;
+		}
+
+		public void setIdentity(String identity) {
+			this.identity = identity;
+		}
+
+		public JsonElement getData() {
+			return data;
+		}
+
+		public void setData(JsonElement data) {
+			this.data = data;
+		}
+
+		public Boolean getLatest() {
+			return latest;
+		}
+
+		public void setLatest(Boolean latest) {
+			this.latest = latest;
+		}
+
+	}
+
+	public static class Wo extends WorkLog {
+
+		private static final long serialVersionUID = 1307569946729101786L;
+
+		static WrapCopier<WorkLog, Wo> copier = WrapCopierFactory.wo(WorkLog.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("已办对象")
+		private List<WoTaskCompleted> taskCompletedList;
+
+		@FieldDescribe("待办对象")
+		private List<WoTask> taskList;
+
+		@FieldDescribe("当前待办序号")
+		private Integer currentTaskIndex;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public Integer getCurrentTaskIndex() {
+			return currentTaskIndex;
+		}
+
+		public void setCurrentTaskIndex(Integer currentTaskIndex) {
+			this.currentTaskIndex = currentTaskIndex;
+		}
+
+		public List<WoTask> getTaskList() {
+			return taskList;
+		}
+
+		public void setTaskList(List<WoTask> taskList) {
+			this.taskList = taskList;
+		}
+
+		public List<WoTaskCompleted> getTaskCompletedList() {
+			return taskCompletedList;
+		}
+
+		public void setTaskCompletedList(List<WoTaskCompleted> taskCompletedList) {
+			this.taskCompletedList = taskCompletedList;
+		}
+
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 2279846765261247910L;
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class, null,
+				JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		private WorkControl control;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public WorkControl getControl() {
+			return control;
+		}
+
+		public void setControl(WorkControl control) {
+			this.control = control;
+		}
+
+	}
+
+	public static class WoTaskCompleted extends TaskCompleted {
+
+		private static final long serialVersionUID = -7253999118308715077L;
+
+		public static WrapCopier<TaskCompleted, WoTaskCompleted> copier = WrapCopierFactory.wo(TaskCompleted.class,
+				WoTaskCompleted.class, null, JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		private WorkControl control;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+		public WorkControl getControl() {
+			return control;
+		}
+
+		public void setControl(WorkControl control) {
+			this.control = control;
+		}
+
+	}
+
+	private List<Wo> refercenceWorkLog(Business business, List<WorkLog> list) throws Exception {
+		List<Wo> os = new ArrayList<>();
+		for (WorkLog o : list) {
+			Wo wo = Wo.copier.copy(o);
+			if (BooleanUtils.isNotTrue(o.getConnected())) {
+				this.referenceTask(business, wo);
+			} else {
+				/** 已经完成的不会有待办,返回一个空数组 */
+				wo.setTaskList(new ArrayList<WoTask>());
+			}
+			this.referenceTaskCompleted(business, wo);
+			os.add(wo);
+		}
+		SortTools.asc(os, false, "arrivedTime");
+		return os;
+	}
+
+	private String decideCreatorIdentity(Business business, EffectivePerson effectivePerson, Wi wi) throws Exception {
+		if (TokenType.cipher.equals(effectivePerson.getTokenType())) {
+			return business.organization().identity().get(wi.getIdentity());
+		} else if (StringUtils.isNotEmpty(wi.getIdentity())) {
+			List<String> identities = business.organization().identity()
+					.listWithPerson(effectivePerson.getDistinguishedName());
+			if (ListTools.isEmpty(identities)) {
+				throw new ExceptionNoneIdentity(effectivePerson.getDistinguishedName());
+			} else if (identities.size() == 1) {
+				return identities.get(0);
+			} else {
+				/* 有多个身份需要逐一判断是否包含. */
+				for (String o : identities) {
+					if (StringUtils.equals(o, wi.getIdentity())) {
+						return o;
+					}
+				}
+			}
+		} else {
+			List<String> list = business.organization().identity()
+					.listWithPerson(effectivePerson.getDistinguishedName());
+			if (!list.isEmpty()) {
+				return list.get(0);
+			}
+		}
+		throw new Exception("decideCreatorIdentity error:" + wi.toString());
+	}
+
+	private void referenceTask(Business business, Wo wo) throws Exception {
+		List<String> ids = business.task().listWithActivityToken(wo.getFromActivityToken());
+		List<WoTask> list = WoTask.copier.copy(business.entityManagerContainer().list(Task.class, ids));
+		SortTools.asc(list, false, "startTime");
+		wo.setTaskList(list);
+	}
+
+	private void referenceTaskCompleted(Business business, Wo wo) throws Exception {
+		List<String> ids = business.taskCompleted().listWithActivityToken(wo.getFromActivityToken());
+		List<WoTaskCompleted> list = WoTaskCompleted.copier
+				.copy(business.entityManagerContainer().list(TaskCompleted.class, ids));
+		Collections.sort(list, new Comparator<WoTaskCompleted>() {
+			public int compare(WoTaskCompleted o1, WoTaskCompleted o2) {
+				return ObjectUtils.compare(o1.getCompletedTime(), o2.getCompletedTime(), true);
+			}
+		});
+		/* 补充召回 */
+		List<WoTaskCompleted> results = new ArrayList<>();
+		for (WoTaskCompleted o : list) {
+			results.add(o);
+			if (o.getProcessingType().equals(ProcessingType.retract)) {
+				WoTaskCompleted retract = new WoTaskCompleted();
+				o.copyTo(retract);
+				retract.setRouteName("撤回");
+				retract.setOpinion("撤回");
+				retract.setStartTime(retract.getRetractTime());
+				retract.setCompletedTime(retract.getRetractTime());
+				results.add(retract);
+			}
+		}
+		wo.setTaskCompletedList(results);
+	}
+
+}

+ 41 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java

@@ -204,7 +204,7 @@ public class WorkAction extends StandardJaxrsAction {
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("process/{processFlag}")
-	@JaxrsMethodDescribe(value = "创建工作.", action = ActionCreate.class)
+	@JaxrsMethodDescribe(value = "创建工作(创建启动版本的流程).", action = ActionCreate.class)
 	public void create(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("流程标识") @PathParam("processFlag") String processFlag, JsonElement jsonElement) {
 		ActionResult<List<ActionCreate.Wo>> result = new ActionResult<>();
@@ -218,7 +218,25 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "创建工作.", action = ActionCreateWithApplicationProcess.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("process/{processFlag}/force")
+	@JaxrsMethodDescribe(value = "创建工作(强制创建存在的流程).", action = ActionCreateForce.class)
+	public void createForce(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					   @JaxrsParameterDescribe("流程标识") @PathParam("processFlag") String processFlag, JsonElement jsonElement) {
+		ActionResult<List<ActionCreateForce.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCreateForce().execute(effectivePerson, processFlag, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "创建工作(创建启动版本的流程).", action = ActionCreateWithApplicationProcess.class)
 	@POST
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
@@ -239,6 +257,27 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "创建工作(强制创建存在的流程).", action = ActionCreateWithApplicationProcessForce.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("application/{applicationFlag}/process/{processFlag}/force")
+	public void createWithApplicationProcessForce(@Suspended final AsyncResponse asyncResponse,
+											 @Context HttpServletRequest request,
+											 @JaxrsParameterDescribe("应用标识") @PathParam("applicationFlag") String applicationFlag,
+											 @JaxrsParameterDescribe("流程标识") @PathParam("processFlag") String processFlag, JsonElement jsonElement) {
+		ActionResult<List<ActionCreateWithApplicationProcessForce.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCreateWithApplicationProcessForce().execute(effectivePerson, applicationFlag, processFlag,
+					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}")

+ 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;