roo00 6 лет назад
Родитель
Сommit
6e76b7e029
55 измененных файлов с 1609 добавлено и 795 удалено
  1. 112 15
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionGetWithWork.java
  2. 111 18
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionGetWithWorkCompleted.java
  3. 18 14
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionListWithWorkOrWorkCompleted.java
  4. 4 2
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/FormAction.java
  5. 19 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionReset.java
  6. 2 3
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionPress.java
  7. 12 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ExceptionNotAllowPress.java
  8. 1 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/TaskCompletedAction.java
  9. 120 21
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionAddSplit.java
  10. 16 11
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCheckDraft.java
  11. 39 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionGrabRelease.java
  12. 60 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionListNextCreatorWithCurrent.java
  13. 173 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionListNextCreatorWithCurrentFilter.java
  14. 45 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionListPrevCreatorWithCurrent.java
  15. 172 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionListPrevCreatorWithCurrentFilter.java
  16. 2 4
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionProcessing.java
  17. 2 3
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionReroute.java
  18. 18 25
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionRetract.java
  19. 12 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ExceptionEmptySplitValueAfterTrim.java
  20. 13 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ExceptionNoneSplitNode.java
  21. 12 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ExceptionSplitNodeNotExist.java
  22. 12 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ExceptionWorkLogWithActivityTokenNotExist.java
  23. 95 3
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java
  24. 0 7
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListWithWorkOrWorkCompleted.java
  25. 17 5
      o2server/x_processplatform_assemble_surface/src/main/webapp/jest/describe.js
  26. 2 2
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/ReadCompleted.java
  27. 3 3
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Review.java
  28. 32 2
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Task.java
  29. 2 2
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/TaskCompleted.java
  30. 18 9
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Process.java
  31. 1 1
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Route.java
  32. 16 8
      o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/util/WorkLogTree.java
  33. 6 6
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/MessageFactory.java
  34. 0 3
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ThisApplication.java
  35. 5 7
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/WorkContext.java
  36. 0 6
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionCreateWithWork.java
  37. 0 6
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionCreateWithWorkCompleted.java
  38. 0 4
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionReset.java
  39. 31 20
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/task/ActionReset.java
  40. 0 18
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/taskcompleted/ActionPress.java
  41. 121 71
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionAddSplit.java
  42. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionReroute.java
  43. 0 261
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRetract.java
  44. 0 130
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRetractBack.java
  45. 18 6
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRollback.java
  46. 13 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ExceptionActivityNotExist.java
  47. 3 20
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/WorkAction.java
  48. 4 6
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/AbstractProcessor.java
  49. 15 1
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/AeiObjects.java
  50. 1 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/TranslateTaskIdentityTools.java
  51. 85 63
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/ManualProcessor.java
  52. 78 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TaskIdentities.java
  53. 25 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TaskIdentity.java
  54. 24 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TestClient.java
  55. 17 5
      o2server/x_processplatform_service_processing/src/main/webapp/jest/describe.js

+ 112 - 15
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionGetWithWork.java

@@ -1,19 +1,20 @@
 package com.x.processplatform.assemble.surface.jaxrs.attachment;
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.assemble.surface.jaxrs.attachment.ActionListWithWorkOrWorkCompleted.Wo;
 import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.Work;
 
@@ -30,15 +31,24 @@ class ActionGetWithWork extends BaseAction {
 			if (null == attachment) {
 				throw new ExceptionAttachmentNotExist(id);
 			}
-			WoWorkControl workControl = business.getControl(effectivePerson, work, WoWorkControl.class);
-			if (BooleanUtils.isNotTrue(workControl.getAllowVisit())) {
-				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
-						work.getId());
+
+			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, work.getId(),
+					new ExceptionEntityNotExist(work.getId()))) {
+				throw new ExceptionAccessDenied(effectivePerson);
 			}
-//			if (!work.getAttachmentList().contains(id)) {
-//				throw new ExceptionMultiReferenced(attachment.getName(), attachment.getId());
-//			}
+
 			Wo wo = Wo.copier.copy(attachment);
+
+			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
+
+			List<String> units = business.organization().unit().listWithPerson(effectivePerson);
+
+			if (this.read(wo, effectivePerson, identities, units)) {
+				wo.getControl().setAllowRead(true);
+				wo.getControl().setAllowEdit(this.edit(wo, effectivePerson, identities, units));
+				wo.getControl().setAllowControl(this.control(wo, effectivePerson, identities, units));
+			}
+
 			result.setData(wo);
 			return result;
 		}
@@ -48,12 +58,99 @@ class ActionGetWithWork extends BaseAction {
 
 		private static final long serialVersionUID = 1954637399762611493L;
 
-		static WrapCopier<Attachment, Wo> copier = WrapCopierFactory.wo(Attachment.class, Wo.class, null, Wo.Excludes);
+		static WrapCopier<Attachment, Wo> copier = WrapCopierFactory.wo(Attachment.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		private WoControl control = new WoControl();
+
+		public WoControl getControl() {
+			return control;
+		}
+
+		public void setControl(WoControl control) {
+			this.control = control;
+		}
+
+	}
+
+	public static class WoControl extends GsonPropertyObject {
+
+		private Boolean allowRead = false;
+		private Boolean allowEdit = false;
+		private Boolean allowControl = false;
+
+		public Boolean getAllowRead() {
+			return allowRead;
+		}
+
+		public void setAllowRead(Boolean allowRead) {
+			this.allowRead = allowRead;
+		}
+
+		public Boolean getAllowEdit() {
+			return allowEdit;
+		}
+
+		public void setAllowEdit(Boolean allowEdit) {
+			this.allowEdit = allowEdit;
+		}
 
-		public static List<String> Excludes = new ArrayList<>(JpaObject.FieldsInvisible);
+		public Boolean getAllowControl() {
+			return allowControl;
+		}
+
+		public void setAllowControl(Boolean allowControl) {
+			this.allowControl = allowControl;
+		}
 
 	}
 
-	public static class WoWorkControl extends WorkControl {
+	private boolean read(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getReadIdentityList()) && ListTools.isEmpty(wo.getReadUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getReadIdentityList())
+					|| ListTools.containsAny(identities, wo.getReadUnitList())) {
+				value = true;
+			}
+		}
+		wo.getControl().setAllowRead(value);
+		return value;
+	}
+
+	private boolean edit(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getEditIdentityList()) && ListTools.isEmpty(wo.getEditUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getEditIdentityList())
+					|| ListTools.containsAny(identities, wo.getEditUnitList())) {
+				value = true;
+			}
+		}
+		return value;
+	}
+
+	private boolean control(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getControllerUnitList()) && ListTools.isEmpty(wo.getControllerIdentityList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getControllerIdentityList())
+					|| ListTools.containsAny(identities, wo.getControllerUnitList())) {
+				value = true;
+			}
+		}
+		return value;
 	}
-}
+}

+ 111 - 18
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionGetWithWorkCompleted.java

@@ -1,19 +1,19 @@
 package com.x.processplatform.assemble.surface.jaxrs.attachment;
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkCompletedControl;
 import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 
@@ -24,23 +24,30 @@ class ActionGetWithWorkCompleted extends BaseAction {
 			Business business = new Business(emc);
 			WorkCompleted workCompleted = emc.find(workCompletedId, WorkCompleted.class);
 			if (null == workCompleted) {
-				throw new ExceptionWorkCompletedNotExist(workCompletedId);
+				throw new ExceptionWorkNotExist(workCompletedId);
 			}
 			Attachment attachment = emc.find(id, Attachment.class);
 			if (null == attachment) {
 				throw new ExceptionAttachmentNotExist(id);
 			}
-			WoControl control = business.getControl(effectivePerson, workCompleted, WoControl.class);
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(),
-						workCompleted.getTitle(), workCompleted.getId());
-			}
-			List<String> ids = business.attachment().listWithJob(workCompleted.getJob());
-			if (!ids.contains(id)) {
-				throw new ExceptionWorkCompletedNotContainsAttachment(workCompleted.getTitle(), workCompleted.getId(),
-						attachment.getName(), attachment.getId());
+
+			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workCompleted.getId(),
+					new ExceptionEntityNotExist(workCompleted.getId()))) {
+				throw new ExceptionAccessDenied(effectivePerson);
 			}
+
 			Wo wo = Wo.copier.copy(attachment);
+
+			List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
+
+			List<String> units = business.organization().unit().listWithPerson(effectivePerson);
+
+			if (this.read(wo, effectivePerson, identities, units)) {
+				wo.getControl().setAllowRead(true);
+				wo.getControl().setAllowEdit(this.edit(wo, effectivePerson, identities, units));
+				wo.getControl().setAllowControl(this.control(wo, effectivePerson, identities, units));
+			}
+
 			result.setData(wo);
 			return result;
 		}
@@ -50,13 +57,99 @@ class ActionGetWithWorkCompleted extends BaseAction {
 
 		private static final long serialVersionUID = 1954637399762611493L;
 
-		static WrapCopier<Attachment, Wo> copier = WrapCopierFactory.wo(Attachment.class, Wo.class, null, Wo.Excludes);
+		static WrapCopier<Attachment, Wo> copier = WrapCopierFactory.wo(Attachment.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		private WoControl control = new WoControl();
+
+		public WoControl getControl() {
+			return control;
+		}
+
+		public void setControl(WoControl control) {
+			this.control = control;
+		}
+
+	}
+
+	public static class WoControl extends GsonPropertyObject {
+
+		private Boolean allowRead = false;
+		private Boolean allowEdit = false;
+		private Boolean allowControl = false;
+
+		public Boolean getAllowRead() {
+			return allowRead;
+		}
+
+		public void setAllowRead(Boolean allowRead) {
+			this.allowRead = allowRead;
+		}
+
+		public Boolean getAllowEdit() {
+			return allowEdit;
+		}
 
-		public static List<String> Excludes = new ArrayList<>(JpaObject.FieldsInvisible);
+		public void setAllowEdit(Boolean allowEdit) {
+			this.allowEdit = allowEdit;
+		}
+
+		public Boolean getAllowControl() {
+			return allowControl;
+		}
+
+		public void setAllowControl(Boolean allowControl) {
+			this.allowControl = allowControl;
+		}
 
 	}
 
-	public static class WoControl extends WorkCompletedControl {
+	private boolean read(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getReadIdentityList()) && ListTools.isEmpty(wo.getReadUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getReadIdentityList())
+					|| ListTools.containsAny(identities, wo.getReadUnitList())) {
+				value = true;
+			}
+		}
+		wo.getControl().setAllowRead(value);
+		return value;
+	}
 
+	private boolean edit(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getEditIdentityList()) && ListTools.isEmpty(wo.getEditUnitList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getEditIdentityList())
+					|| ListTools.containsAny(identities, wo.getEditUnitList())) {
+				value = true;
+			}
+		}
+		return value;
+	}
+
+	private boolean control(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
+		boolean value = false;
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getControllerUnitList()) && ListTools.isEmpty(wo.getControllerIdentityList())) {
+			value = true;
+		} else {
+			if (ListTools.containsAny(identities, wo.getControllerIdentityList())
+					|| ListTools.containsAny(identities, wo.getControllerUnitList())) {
+				value = true;
+			}
+		}
+		return value;
 	}
-}
+}

+ 18 - 14
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionListWithWorkOrWorkCompleted.java

@@ -45,9 +45,9 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 			List<Wo> wos = new ArrayList<>();
 
 			for (Wo wo : this.list(business, job)) {
-				if (this.read(wo, identities, units)) {
+				if (this.read(wo, effectivePerson, identities, units)) {
 					wo.getControl().setAllowRead(true);
-					wo.getControl().setAllowEdit(this.edit(wo, identities, units));
+					wo.getControl().setAllowEdit(this.edit(wo, effectivePerson, identities, units));
 					wo.getControl().setAllowControl(this.control(wo, effectivePerson, identities, units));
 					wos.add(wo);
 				}
@@ -60,27 +60,32 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 		}
 	}
 
-	private boolean read(Wo wo, List<String> identities, List<String> units) throws Exception {
+	private boolean read(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
 		boolean value = false;
-		if (ListTools.isEmpty(wo.getReadIdentityList()) && ListTools.isEmpty(wo.getReadUnitList())) {
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getReadIdentityList()) && ListTools.isEmpty(wo.getReadUnitList())) {
 			value = true;
 		} else {
 			if (ListTools.containsAny(identities, wo.getReadIdentityList())
-					|| ListTools.containsAny(identities, wo.getReadUnitList())) {
+					|| ListTools.containsAny(units, wo.getReadUnitList())) {
 				value = true;
 			}
 		}
-		wo.getControl().setAllowRead(value);
 		return value;
 	}
 
-	private boolean edit(Wo wo, List<String> identities, List<String> units) throws Exception {
+	private boolean edit(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
+			throws Exception {
 		boolean value = false;
-		if (ListTools.isEmpty(wo.getEditIdentityList()) && ListTools.isEmpty(wo.getEditUnitList())) {
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getEditIdentityList()) && ListTools.isEmpty(wo.getEditUnitList())) {
 			value = true;
 		} else {
 			if (ListTools.containsAny(identities, wo.getEditIdentityList())
-					|| ListTools.containsAny(identities, wo.getEditUnitList())) {
+					|| ListTools.containsAny(units, wo.getEditUnitList())) {
 				value = true;
 			}
 		}
@@ -90,17 +95,16 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 	private boolean control(Wo wo, EffectivePerson effectivePerson, List<String> identities, List<String> units)
 			throws Exception {
 		boolean value = false;
-		if (ListTools.isEmpty(wo.getControllerUnitList()) && ListTools.isEmpty(wo.getControllerIdentityList())) {
+		if (effectivePerson.isPerson(wo.getPerson())) {
+			value = true;
+		} else if (ListTools.isEmpty(wo.getControllerUnitList()) && ListTools.isEmpty(wo.getControllerIdentityList())) {
 			value = true;
 		} else {
 			if (ListTools.containsAny(identities, wo.getControllerIdentityList())
-					|| ListTools.containsAny(identities, wo.getControllerUnitList())) {
+					|| ListTools.containsAny(units, wo.getControllerUnitList())) {
 				value = true;
 			}
 		}
-		if (effectivePerson.isPerson(wo.getPerson())) {
-			value = true;
-		}
 		return value;
 	}
 

+ 4 - 2
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/FormAction.java

@@ -45,7 +45,8 @@ public class FormAction extends StandardJaxrsAction {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);
 		}
-		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+		/* 修改过的方法 */
+		asyncResponse.resume(ResponseFactory.getMaxAgeActionResultResponse(result));
 	}
 
 	@JaxrsMethodDescribe(value = "根据工作或完成工作标识获取移动表单.", action = ActionGetWithWorkOrWorkCompletedMobile.class)
@@ -64,7 +65,8 @@ public class FormAction extends StandardJaxrsAction {
 			logger.error(e, effectivePerson, request, null);
 			result.error(e);
 		}
-		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+		/* 修改过的方法 */
+		asyncResponse.resume(ResponseFactory.getMaxAgeActionResultResponse(result));
 	}
 
 	@JaxrsMethodDescribe(value = "获取表单.", action = ActionGet.class)

+ 19 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionReset.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.task;
 
 import java.util.List;
 
+import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -17,6 +18,7 @@ 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.jaxrs.WoId;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.ThisApplication;
 import com.x.processplatform.assemble.surface.WorkControl;
@@ -31,15 +33,20 @@ public class ActionReset extends BaseAction {
 			Business business = new Business(emc);
 			Task task = emc.find(id, Task.class);
 			if (null == task) {
-				throw new ExceptionEntityNotExist(id,Task.class);
+				throw new ExceptionEntityNotExist(id, Task.class);
 			}
 			WoControl control = business.getControl(effectivePerson, task, WoControl.class);
 
 			if (BooleanUtils.isNotTrue(control.getAllowReset())) {
 				throw new ExceptionAccessDenied(effectivePerson, task);
 			}
+
 			/* 检查reset人员 */
 			List<String> identites = business.organization().identity().list(wi.getIdentityList());
+
+			/* 在新增待办人员中删除当前的处理人 */
+			identites = ListUtils.subtract(identites, ListTools.toList(task.getIdentity()));
+
 			if (!identites.isEmpty()) {
 				emc.beginTransaction(Task.class);
 				/* 如果有选择新的路由那么覆盖之前的选择 */
@@ -73,6 +80,9 @@ public class ActionReset extends BaseAction {
 		@FieldDescribe("重置身份")
 		private List<String> identityList;
 
+		@FieldDescribe("保留自身待办.")
+		private Boolean keep;
+
 		public List<String> getIdentityList() {
 			return identityList;
 		}
@@ -96,6 +106,14 @@ public class ActionReset extends BaseAction {
 		public void setOpinion(String opinion) {
 			this.opinion = opinion;
 		}
+
+		public Boolean getKeep() {
+			return keep;
+		}
+
+		public void setKeep(Boolean keep) {
+			this.keep = keep;
+		}
 	}
 
 	public static class WoControl extends WorkControl {

+ 2 - 3
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ActionPress.java

@@ -10,7 +10,6 @@ import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.config.Config;
-import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -41,7 +40,7 @@ class ActionPress extends BaseAction {
 			}
 			TaskCompleted taskCompleted = emc
 					.listEqualAndEqual(TaskCompleted.class, TaskCompleted.person_FIELDNAME,
-							effectivePerson.getDistinguishedName(), TaskCompleted.job_FIELDNAME, Work.job_FIELDNAME)
+							effectivePerson.getDistinguishedName(), TaskCompleted.job_FIELDNAME, work.getJob())
 					.stream().sorted(Comparator.comparing(TaskCompleted::getCompletedTime,
 							Comparator.nullsLast(Date::compareTo)))
 					.findFirst().orElse(null);
@@ -50,7 +49,7 @@ class ActionPress extends BaseAction {
 			}
 			if (!PropertyTools.getOrElse(business.getActivity(work), Manual.allowPress_FIELDNAME, Boolean.class,
 					false)) {
-				throw new ExceptionAccessDenied(effectivePerson);
+				throw new ExceptionNotAllowPress(work.getActivityName());
 			}
 			if (StringUtils.equals(taskCompleted.getPressActivityToken(), work.getActivityToken())) {
 				if (!NumberTools.nullOrLessThan(taskCompleted.getPressCount(),

+ 12 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/ExceptionNotAllowPress.java

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.surface.jaxrs.taskcompleted;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNotAllowPress extends PromptException {
+
+	private static final long serialVersionUID = 1040883405179987063L;
+
+	ExceptionNotAllowPress(String activityName) {
+		super("{} 节点不允许发起提醒.", activityName);
+	}
+}

+ 1 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/taskcompleted/TaskCompletedAction.java

@@ -413,7 +413,7 @@ public class TaskCompletedAction extends StandardJaxrsAction {
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void press(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("标识") @PathParam("work") String work) {
+			@JaxrsParameterDescribe("工作标识") @PathParam("work") String work) {
 		ActionResult<ActionPress.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {

+ 120 - 21
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionAddSplit.java

@@ -1,7 +1,9 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
+import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -11,27 +13,32 @@ import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.ThisApplication;
-import com.x.processplatform.core.entity.content.TaskCompleted;
+import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.Work;
 import com.x.processplatform.core.entity.content.WorkLog;
 import com.x.processplatform.core.entity.element.ActivityType;
 import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.util.WorkLogTree;
+import com.x.processplatform.core.entity.element.util.WorkLogTree.Node;
+import com.x.processplatform.core.entity.element.util.WorkLogTree.Nodes;
 
 class ActionAddSplit extends BaseAction {
 
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement)
+			throws Exception {
 
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
+
+			ActionResult<List<Wo>> result = new ActionResult<>();
 			Business business = new Business(emc);
 			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
 			/* 校验work是否存在 */
@@ -39,7 +46,7 @@ class ActionAddSplit extends BaseAction {
 			if (null == work) {
 				throw new ExceptionEntityNotExist(id, Work.class);
 			}
-			if (StringUtils.isEmpty(wi.getSplitValue())) {
+			if (ListTools.isEmpty(wi.getSplitValueList())) {
 				throw new ExceptionEmptySplitValue(work.getId());
 			}
 			Manual manual = business.manual().pick(work.getActivity());
@@ -52,41 +59,82 @@ class ActionAddSplit extends BaseAction {
 
 			WorkLogTree tree = new WorkLogTree(workLogs);
 
-			WorkLog workLog = workLogs.stream().filter(o -> StringUtils.equals(o.getId(), wi.getWorkLog())).findFirst()
-					.orElse(null);
+			Node currentNode = tree.location(work);
+
+			if (null == currentNode) {
+				throw new ExceptionWorkLogWithActivityTokenNotExist(work.getActivityToken());
+			}
+
+			Node splitNode = this.findSplitNode(tree, currentNode);
 
-			if (null == workLog) {
-				throw new ExceptionEntityNotExist(wi.getWorkLog(), WorkLog.class);
+			if (null == splitNode) {
+				throw new ExceptionNoneSplitNode(work.getId());
 			}
 
+			Req req = new Req();
+
+			req.setWorkLog(splitNode.getWorkLog().getId());
 
-			Wo wo = ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
-					Applications.joinQueryUri("work", work.getId(), "add", "split"), wi).getData(Wo.class);
+			if (BooleanUtils.isTrue(wi.getTrimExist())) {
+				List<String> splitValues = ListUtils.subtract(wi.getSplitValueList(),
+						this.existSplitValues(tree, splitNode));
+				if (ListTools.isEmpty(splitValues)) {
+					throw new ExceptionEmptySplitValueAfterTrim(work.getId());
+				}
+				req.setSplitValueList(splitValues);
+			} else {
+				req.setSplitValueList(wi.getSplitValueList());
+			}
 
-			result.setData(wo);
+			List<Wo> wos = ThisApplication.context().applications()
+					.putQuery(x_processplatform_service_processing.class,
+							Applications.joinQueryUri("work", work.getId(), "add", "split"), req)
+					.getDataAsList(Wo.class);
+
+			result.setData(wos);
 			return result;
+		}
+	}
 
+	private Node findSplitNode(WorkLogTree tree, Node currentNode) {
+		Nodes nodes = currentNode.upTo(ActivityType.split, ActivityType.manual);
+		if (!nodes.isEmpty()) {
+			return nodes.get(0);
 		}
+		return null;
+	}
+
+	private List<String> existSplitValues(WorkLogTree tree, Node splitNode) {
+		List<String> values = new ArrayList<>();
+		for (Node node : splitNode.parents()) {
+			for (Node o : tree.down(node)) {
+				if (StringUtils.isNotEmpty(o.getWorkLog().getSplitValue())) {
+					values.add(o.getWorkLog().getSplitValue());
+				}
+			}
+		}
+		values = ListTools.trim(values, true, true);
+		return values;
 	}
 
 	private List<WorkLog> listWorkLog(Business business, Work work) throws Exception {
 		return business.entityManagerContainer().listEqual(WorkLog.class, WorkLog.job_FIELDNAME, work.getJob());
 	}
 
-	public static class Wi extends GsonPropertyObject {
+	public static class Req extends GsonPropertyObject {
 
 		@FieldDescribe("添加的拆分值.")
-		private String splitValue;
+		private List<String> splitValueList;
 
-		@FieldDescribe("拆分日志.")
+		@FieldDescribe("工作日志.")
 		private String workLog;
 
-		public String getSplitValue() {
-			return splitValue;
+		public List<String> getSplitValueList() {
+			return splitValueList;
 		}
 
-		public void setSplitValue(String splitValue) {
-			this.splitValue = splitValue;
+		public void setSplitValueList(List<String> splitValueList) {
+			this.splitValueList = splitValueList;
 		}
 
 		public String getWorkLog() {
@@ -99,7 +147,58 @@ class ActionAddSplit extends BaseAction {
 
 	}
 
-	public static class Wo extends WoId {
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("添加的拆分值.")
+		private List<String> splitValueList;
+
+		@FieldDescribe("排除已经存在的拆分值.")
+		private Boolean trimExist;
+
+		public List<String> getSplitValueList() {
+			return splitValueList;
+		}
+
+		public void setSplitValueList(List<String> splitValueList) {
+			this.splitValueList = splitValueList;
+		}
+
+		public Boolean getTrimExist() {
+			return trimExist;
+		}
+
+		public void setTrimExist(Boolean trimExist) {
+			this.trimExist = trimExist;
+		}
+
+	}
+
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = 8122551349295505134L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class,
+				ListTools.toList(Work.id_FIELDNAME, Work.activityName_FIELDNAME), null);
+
+		private List<WoTask> taskList = new ArrayList<>();
+
+		public List<WoTask> getTaskList() {
+			return taskList;
+		}
+
+		public void setTaskList(List<WoTask> taskList) {
+			this.taskList = taskList;
+		}
+
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 5196447462619948056L;
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class,
+				ListTools.toList(Task.person_FIELDNAME, Task.unit_FIELDNAME), null);
+
 	}
 
 }

+ 16 - 11
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCheckDraft.java

@@ -1,22 +1,22 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
-import java.net.URLEncoder;
 import java.util.Objects;
 
 import org.apache.commons.lang3.BooleanUtils;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 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.base.core.project.tools.DefaultCharset;
 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.Work;
 import com.x.processplatform.core.entity.element.ActivityType;
+import com.x.processplatform.core.entity.element.Process;
 
 class ActionCheckDraft extends BaseAction {
 
@@ -27,15 +27,20 @@ class ActionCheckDraft extends BaseAction {
 			Business business = new Business(emc);
 			Work work = emc.find(id, Work.class);
 			if (null != work) {
-				WoControl control = business.getControl(effectivePerson, work, WoControl.class);
-				if (BooleanUtils.isTrue(control.getAllowDelete())) {
-					if (BooleanUtils.isFalse(work.getDataChanged())
-							&& Objects.equals(ActivityType.manual, work.getActivityType())) {
-						wo = ThisApplication.context().applications()
-								.deleteQuery(x_processplatform_service_processing.class,
-										"work/" + URLEncoder.encode(work.getId(), DefaultCharset.name))
-								.getData(Wo.class);
-						wo.setId(work.getId());
+				Process process = business.process().pick(work.getProcess());
+				if (null != process) {
+					if (BooleanUtils.isTrue(process.getCheckDraft())) {
+						WoControl control = business.getControl(effectivePerson, work, WoControl.class);
+						if (BooleanUtils.isTrue(control.getAllowDelete())) {
+							if (BooleanUtils.isFalse(work.getDataChanged())
+									&& Objects.equals(ActivityType.manual, work.getActivityType())) {
+								wo = ThisApplication.context().applications()
+										.deleteQuery(x_processplatform_service_processing.class,
+												Applications.joinQueryUri("work", work.getId()))
+										.getData(Wo.class);
+								wo.setId(work.getId());
+							}
+						}
 					}
 				}
 			}

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

@@ -0,0 +1,39 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.Work;
+
+class ActionGrabRelease extends BaseAction {
+
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			Wo wo = new Wo();
+			Business business = new Business(emc);
+			Work work = emc.find(id, Work.class);
+			if (null == work) {
+				throw new ExceptionEntityNotExist(id, Work.class);
+			}
+			
+			
+			
+			
+			result.setData(wo);
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+	public static class WoControl extends WorkControl {
+	}
+}

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

@@ -0,0 +1,60 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.jaxrs.EqualsTerms;
+import com.x.base.core.project.jaxrs.InTerms;
+import com.x.base.core.project.jaxrs.LikeTerms;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.assemble.surface.jaxrs.work.ActionListNextWithApplication.Wo;
+import com.x.processplatform.assemble.surface.jaxrs.work.ActionListNextWithApplication.WoControl;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkStatus;
+import com.x.processplatform.core.entity.element.Application;
+
+class ActionListNextCreatorWithCurrent extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, Integer count) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EqualsTerms equals = new EqualsTerms();
+			equals.put(Work.creatorPerson_FIELDNAME, effectivePerson.getDistinguishedName());
+			ActionResult<List<Wo>> result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME,
+					equals, null, null, null, null, null, null, null, true, DESC);
+			return result;
+		}
+	}
+
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = -5668264661685818057L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+	}
+
+}

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

@@ -0,0 +1,173 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.jaxrs.EqualsTerms;
+import com.x.base.core.project.jaxrs.InTerms;
+import com.x.base.core.project.jaxrs.LikeTerms;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.assemble.surface.Business;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkStatus;
+
+class ActionListNextCreatorWithCurrentFilter extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, Integer count, JsonElement jsonElement)
+			throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			EqualsTerms equals = new EqualsTerms();
+			InTerms ins = new InTerms();
+			LikeTerms likes = new LikeTerms();
+			equals.put(Work.creatorPerson_FIELDNAME, effectivePerson.getDistinguishedName());
+			if (ListTools.isNotEmpty(wi.getProcessList())) {
+				ins.put(Work.process_FIELDNAME, wi.getProcessList());
+			}
+			if (ListTools.isNotEmpty(wi.getCreatorUnitList())) {
+				ins.put(Work.creatorUnit_FIELDNAME, wi.getCreatorUnitList());
+			}
+			if (ListTools.isNotEmpty(wi.getStartTimeMonthList())) {
+				ins.put(Work.startTimeMonth_FIELDNAME, wi.getStartTimeMonthList());
+			}
+			if (ListTools.isNotEmpty(wi.getActivityNameList())) {
+				ins.put(Work.activityName_FIELDNAME, wi.getActivityNameList());
+			}
+			if (ListTools.isNotEmpty(wi.getWorkStatusList())) {
+				ins.put(Work.workStatus_FIELDNAME, wi.getWorkStatusList());
+			}
+			if (StringUtils.isNotEmpty(wi.getKey())) {
+				String key = StringUtils.trim(StringUtils.replace(wi.getKey(), "\u3000", " "));
+				if (StringUtils.isNotEmpty(key)) {
+					likes.put(Work.title_FIELDNAME, key);
+					likes.put(Work.serial_FIELDNAME, key);
+					likes.put(Work.creatorPerson_FIELDNAME, key);
+					likes.put(Work.creatorUnit_FIELDNAME, key);
+				}
+			}
+
+			result = this.standardListNext(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, equals, null, likes, ins,
+					null, null, null, null, true, DESC);
+
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("流程")
+		private List<String> processList;
+
+		@FieldDescribe("创建组织")
+		private List<String> creatorUnitList;
+
+		@FieldDescribe("启动月份")
+		private List<String> startTimeMonthList;
+
+		@FieldDescribe("活动名称")
+		private List<String> activityNameList;
+
+		@FieldDescribe("工作状态")
+		private List<WorkStatus> workStatusList;
+
+		@FieldDescribe("关键字")
+		private String key;
+
+		public List<String> getProcessList() {
+			return processList;
+		}
+
+		public void setProcessList(List<String> processList) {
+			this.processList = processList;
+		}
+
+		public List<String> getStartTimeMonthList() {
+			return startTimeMonthList;
+		}
+
+		public void setStartTimeMonthList(List<String> startTimeMonthList) {
+			this.startTimeMonthList = startTimeMonthList;
+		}
+
+		public List<String> getActivityNameList() {
+			return activityNameList;
+		}
+
+		public void setActivityNameList(List<String> activityNameList) {
+			this.activityNameList = activityNameList;
+		}
+
+		public List<WorkStatus> getWorkStatusList() {
+			return workStatusList;
+		}
+
+		public void setWorkStatusList(List<WorkStatus> workStatusList) {
+			this.workStatusList = workStatusList;
+		}
+
+		public String getKey() {
+			return key;
+		}
+
+		public void setKey(String key) {
+			this.key = key;
+		}
+
+		public List<String> getCreatorUnitList() {
+			return creatorUnitList;
+		}
+
+		public void setCreatorUnitList(List<String> creatorUnitList) {
+			this.creatorUnitList = creatorUnitList;
+		}
+
+	}
+
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = -5668264661685818057L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("权限")
+		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 WoControl extends WorkControl {
+
+	}
+}

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

@@ -0,0 +1,45 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import java.util.List;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.EqualsTerms;
+import com.x.processplatform.core.entity.content.Work;
+
+class ActionListPrevCreatorWithCurrent extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, Integer count) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EqualsTerms equals = new EqualsTerms();
+			equals.put(Work.creatorPerson_FIELDNAME, effectivePerson.getDistinguishedName());
+			ActionResult<List<Wo>> result = this.standardListPrev(Wo.copier, id, count, JpaObject.sequence_FIELDNAME,
+					equals, null, null, null, null, null, null, null, true, DESC);
+			return result;
+		}
+	}
+
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = -5668264661685818057L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		private Long rank;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+	}
+}

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

@@ -0,0 +1,172 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.jaxrs.EqualsTerms;
+import com.x.base.core.project.jaxrs.InTerms;
+import com.x.base.core.project.jaxrs.LikeTerms;
+import com.x.base.core.project.tools.ListTools;
+import com.x.processplatform.assemble.surface.WorkControl;
+import com.x.processplatform.core.entity.content.Work;
+import com.x.processplatform.core.entity.content.WorkStatus;
+
+class ActionListPrevCreatorWithCurrentFilter extends BaseAction {
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, Integer count, JsonElement jsonElement)
+			throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			EqualsTerms equals = new EqualsTerms();
+			InTerms ins = new InTerms();
+			LikeTerms likes = new LikeTerms();
+			equals.put(Work.creatorPerson_FIELDNAME, effectivePerson.getDistinguishedName());
+			if (ListTools.isNotEmpty(wi.getProcessList())) {
+				ins.put(Work.process_FIELDNAME, wi.getProcessList());
+			}
+			if (ListTools.isNotEmpty(wi.getCreatorUnitList())) {
+				ins.put(Work.creatorUnit_FIELDNAME, wi.getCreatorUnitList());
+			}
+			if (ListTools.isNotEmpty(wi.getStartTimeMonthList())) {
+				ins.put(Work.startTimeMonth_FIELDNAME, wi.getStartTimeMonthList());
+			}
+			if (ListTools.isNotEmpty(wi.getActivityNameList())) {
+				ins.put(Work.activityName_FIELDNAME, wi.getActivityNameList());
+			}
+			if (ListTools.isNotEmpty(wi.getWorkStatusList())) {
+				ins.put(Work.workStatus_FIELDNAME, wi.getWorkStatusList());
+			}
+			if (StringUtils.isNotEmpty(wi.getKey())) {
+				String key = StringUtils.trim(StringUtils.replace(wi.getKey(), "\u3000", " "));
+				if (StringUtils.isNotEmpty(key)) {
+					likes.put(Work.title_FIELDNAME, key);
+					likes.put(Work.serial_FIELDNAME, key);
+					likes.put(Work.creatorPerson_FIELDNAME, key);
+					likes.put(Work.creatorUnit_FIELDNAME, key);
+				}
+			}
+
+			result = this.standardListPrev(Wo.copier, id, count, JpaObject.sequence_FIELDNAME, equals, null, likes, ins,
+					null, null, null, null, true, DESC);
+
+			return result;
+		}
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("流程")
+		private List<String> processList;
+
+		@FieldDescribe("创建组织")
+		private List<String> creatorUnitList;
+
+		@FieldDescribe("启动月份")
+		private List<String> startTimeMonthList;
+
+		@FieldDescribe("活动名称")
+		private List<String> activityNameList;
+
+		@FieldDescribe("工作状态")
+		private List<WorkStatus> workStatusList;
+
+		@FieldDescribe("关键字")
+		private String key;
+
+		public List<String> getProcessList() {
+			return processList;
+		}
+
+		public void setProcessList(List<String> processList) {
+			this.processList = processList;
+		}
+
+		public List<String> getStartTimeMonthList() {
+			return startTimeMonthList;
+		}
+
+		public void setStartTimeMonthList(List<String> startTimeMonthList) {
+			this.startTimeMonthList = startTimeMonthList;
+		}
+
+		public List<String> getActivityNameList() {
+			return activityNameList;
+		}
+
+		public void setActivityNameList(List<String> activityNameList) {
+			this.activityNameList = activityNameList;
+		}
+
+		public List<WorkStatus> getWorkStatusList() {
+			return workStatusList;
+		}
+
+		public void setWorkStatusList(List<WorkStatus> workStatusList) {
+			this.workStatusList = workStatusList;
+		}
+
+		public String getKey() {
+			return key;
+		}
+
+		public void setKey(String key) {
+			this.key = key;
+		}
+
+		public List<String> getCreatorUnitList() {
+			return creatorUnitList;
+		}
+
+		public void setCreatorUnitList(List<String> creatorUnitList) {
+			this.creatorUnitList = creatorUnitList;
+		}
+
+	}
+
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = -5668264661685818057L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		@FieldDescribe("排序号")
+		private Long rank;
+
+		@FieldDescribe("权限")
+		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 WoControl extends WorkControl {
+
+	}
+}

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

@@ -1,14 +1,12 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
-import java.net.URLEncoder;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 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.base.core.project.tools.DefaultCharset;
 import com.x.processplatform.assemble.surface.ThisApplication;
 import com.x.processplatform.core.entity.content.Work;
 
@@ -27,7 +25,7 @@ class ActionProcessing extends BaseAction {
 			emc.commit();
 			ThisApplication.context().applications().putQuery(effectivePerson.getDebugger(),
 					x_processplatform_service_processing.class,
-					"work/" + URLEncoder.encode(work.getId(), DefaultCharset.name) + "/processing", null);
+					Applications.joinQueryUri("work", work.getId(), "processing"), null);
 			Wo wo = new Wo();
 			work = emc.find(id, Work.class);
 			if (null != work) {

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

@@ -1,6 +1,5 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
-import java.net.URLEncoder;
 import java.util.List;
 import java.util.Objects;
 
@@ -9,6 +8,7 @@ import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
@@ -55,8 +55,7 @@ class ActionReroute extends BaseAction {
 				throw new ExceptionProcessNotMatch();
 			}
 			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
-					"work/" + URLEncoder.encode(work.getId(), "UTF-8") + "/reroute/activity/"
-							+ URLEncoder.encode(destinationActivity.getId(), "UTF-8"),
+					Applications.joinQueryUri("work", work.getId(), "reroute", "activity", destinationActivity.getId()),
 					null);
 			Wo wo = new Wo();
 			wo.setId(work.getId());

+ 18 - 25
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionRetract.java

@@ -1,9 +1,8 @@
 package com.x.processplatform.assemble.surface.jaxrs.work;
 
-import java.net.URLEncoder;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
@@ -11,7 +10,6 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.DefaultCharset;
 import com.x.base.core.project.tools.PropertyTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.assemble.surface.ThisApplication;
@@ -70,29 +68,10 @@ class ActionRetract extends BaseAction {
 				throw new ExceptionRetractNoneWorkLog(work.getId());
 			}
 
-//			TaskCompleted taskCompleted = null;
-//			WorkLog workLog = null;
-//
-//			String taskCompletedId = business.taskCompleted().getAllowRetract(effectivePerson.getDistinguishedName(),
-//					work);
-//			if (StringUtils.isEmpty(taskCompletedId)) {
-//				throw new ExceptionRetractNoneTaskCompleted(effectivePerson.getDistinguishedName(), work.getTitle(),
-//						work.getId());
-//			}
-//			taskCompleted = emc.find(taskCompletedId, TaskCompleted.class);
-//			workLog = this.getWorkLog(business, taskCompleted);
-//			if (null == workLog) {
-//				throw new ExceptionRetractNoneWorkLog(effectivePerson.getDistinguishedName(), work.getTitle(),
-//						work.getId(), taskCompletedId);
-//			}
-//			emc.beginTransaction(TaskCompleted.class);
-//			taskCompleted.setProcessingType(ProcessingType.retract);
-//			taskCompleted.setRetractTime(new Date());
-//			emc.commit();
+			Req req = new Req();
+			req.setWorkLog(workLog.getId());
 			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
-					"work/" + URLEncoder.encode(work.getId(), DefaultCharset.name) + "/retract/worklog/"
-							+ URLEncoder.encode(workLog.getId(), DefaultCharset.name),
-					null);
+					Applications.joinQueryUri("work", work.getId(), "rollback"), req);
 			Wo wo = new Wo();
 			wo.setId(work.getId());
 			result.setData(wo);
@@ -100,6 +79,20 @@ class ActionRetract extends BaseAction {
 		}
 	}
 
+	public static class Req {
+
+		private String workLog;
+
+		public String getWorkLog() {
+			return workLog;
+		}
+
+		public void setWorkLog(String workLog) {
+			this.workLog = workLog;
+		}
+
+	}
+
 	public static class Wo extends WoId {
 	}
 

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

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionEmptySplitValueAfterTrim extends PromptException {
+
+	private static final long serialVersionUID = 1040883405179987063L;
+
+	ExceptionEmptySplitValueAfterTrim(String id) {
+		super("工作: {},过滤后的拆分值为空.", id);
+	}
+}

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

@@ -0,0 +1,13 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNoneSplitNode extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionNoneSplitNode(String workId) {
+		super("无法找到工作经过的拆分节点:{}.", workId);
+	}
+
+}

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

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionSplitNodeNotExist extends PromptException {
+
+	private static final long serialVersionUID = -9089355008820123519L;
+
+	ExceptionSplitNodeNotExist() {
+		super("无法找到拆分节点.");
+	}
+}

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

@@ -0,0 +1,12 @@
+package com.x.processplatform.assemble.surface.jaxrs.work;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionWorkLogWithActivityTokenNotExist extends PromptException {
+
+	private static final long serialVersionUID = -9089355008820123519L;
+
+	ExceptionWorkLogWithActivityTokenNotExist(String str) {
+		super("无法根据活动令牌获取工作日志:{}.", str);
+	}
+}

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

@@ -275,6 +275,24 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
 
+	@JaxrsMethodDescribe(value = "完成工作关闭时候的检查,1.检查是否要删除处于草稿状态的工作,没有保存过任何数据将被认为是草稿.2.检查是否需要释放抢办.", action = ActionCloseCheck.class)
+	@GET
+	@Path("{id}/close/check")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void closeCheck(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
+		ActionResult<ActionCloseCheck.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionCloseCheck().execute(effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
 	@JaxrsMethodDescribe(value = "列示指定应用当前用户创建的Work对象,下一页.", action = ActionListNextWithApplication.class)
 	@GET
 	@Path("list/{id}/next/{count}/application/{applicationFlag}")
@@ -409,7 +427,7 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
 
-	@JaxrsMethodDescribe(value = "列示根据过滤条件的Work,下一页,限定范围为我创建的工作.", action = ActionListNextWithFilter.class)
+	@JaxrsMethodDescribe(value = "列示根据过滤条件的Work,下一页,限定范围为我创建的工作以及应用.", action = ActionListNextWithFilter.class)
 	@POST
 	@Path("list/{id}/next/{count}/application/{applicationFlag}/filter")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@@ -429,7 +447,7 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
 
-	@JaxrsMethodDescribe(value = "列示根据过滤条件的Work,上一页,限定范围为我创建的工作.", action = ActionListPrevWithFilter.class)
+	@JaxrsMethodDescribe(value = "列示根据过滤条件的Work,上一页,限定范围为我创建的工作以及应用.", action = ActionListPrevWithFilter.class)
 	@POST
 	@Path("list/{id}/prev/{count}/application/{applicationFlag}/filter")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@@ -450,6 +468,80 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
 
+	@JaxrsMethodDescribe(value = "列示当前用户创建的Work对象,下一页.", action = ActionListNextCreatorWithCurrent.class)
+	@GET
+	@Path("list/{id}/next/{count}/creator/current")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listNextCreatorWithCurrent(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count) {
+		ActionResult<List<ActionListNextCreatorWithCurrent.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListNextCreatorWithCurrent().execute(effectivePerson, id, count);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "列示当前用户创建的Work对象,上一页.", action = ActionListPrevCreatorWithCurrent.class)
+	@GET
+	@Path("list/{id}/prev/{count}/creator/current")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listPrevCreatorWithCurrent(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count) {
+		ActionResult<List<ActionListPrevCreatorWithCurrent.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListPrevCreatorWithCurrent().execute(effectivePerson, id, count);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "列示根据过滤条件的我创建的工作,下一页", action = ActionListNextCreatorWithCurrentFilter.class)
+	@POST
+	@Path("list/{id}/next/{count}/creator/current/filter")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listNextCreatorWithCurrentFilter(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count, JsonElement jsonElement) {
+		ActionResult<List<ActionListNextCreatorWithCurrentFilter.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListNextCreatorWithCurrentFilter().execute(effectivePerson, id, count, jsonElement);
+		} catch (Exception e) {
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
+	@JaxrsMethodDescribe(value = "列示根据过滤条件的我创建的工作,上一页.", action = ActionListPrevCreatorWithCurrentFilter.class)
+	@POST
+	@Path("list/{id}/prev/{count}/creator/current/filter")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listPrevCreatorWithCurrentFilter(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+			@JaxrsParameterDescribe("数量") @PathParam("count") Integer count, JsonElement jsonElement) {
+		ActionResult<List<ActionListPrevCreatorWithCurrentFilter.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListPrevCreatorWithCurrentFilter().execute(effectivePerson, id, count, jsonElement);
+		} catch (Exception e) {
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
+	}
+
 	@JaxrsMethodDescribe(value = "将工作召回。", action = ActionRetract.class)
 	@PUT
 	@Path("{id}/retract")
@@ -495,7 +587,7 @@ public class WorkAction extends StandardJaxrsAction {
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void addSplit(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id, JsonElement jsonElement) {
-		ActionResult<ActionAddSplit.Wo> result = new ActionResult<>();
+		ActionResult<List<ActionAddSplit.Wo>> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
 			result = new ActionAddSplit().execute(effectivePerson, id, jsonElement);

+ 0 - 7
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListWithWorkOrWorkCompleted.java

@@ -7,8 +7,6 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
-import org.apache.commons.lang3.BooleanUtils;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
@@ -24,14 +22,9 @@ import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.ReadCompleted;
-import com.x.processplatform.core.entity.content.Review;
 import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.TaskCompleted;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkLog;
-import com.x.processplatform.core.entity.element.Application;
-import com.x.processplatform.core.entity.element.Process;
 
 class ActionListWithWorkOrWorkCompleted extends BaseAction {
 

+ 17 - 5
o2server/x_processplatform_assemble_surface/src/main/webapp/jest/describe.js

@@ -1,5 +1,5 @@
 var Describe = function() {
-//20180730
+	// 20180730
 }
 
 Describe.splitValue = function(str) {
@@ -38,7 +38,7 @@ Describe.doPost = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		}).always(function(resultJson) {
 			$('#result').html(JSON.stringify(resultJson, null, 4));
 			Describe.writeOut(m.outs, resultJson);
@@ -55,7 +55,7 @@ Describe.doPost = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		});
 	}
 }
@@ -74,7 +74,7 @@ Describe.doPut = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		}).always(function(resultJson) {
 			$('#result').html(JSON.stringify(resultJson, null, 4));
 			Describe.writeOut(m.outs, resultJson);
@@ -91,7 +91,7 @@ Describe.doPut = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		});
 	}
 }
@@ -269,6 +269,14 @@ Describe.prototype = {
 									txt += '</table>';
 									txt += '</fieldset>';
 								}
+								if (m.useStringParameter) {
+									txt += '<fieldset><legend>String</legend>';
+									txt += '<table><tr><td>';
+									txt += '<textarea id="string" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
+									txt += '</td><td>string</td></tr>';
+									txt += '</table>';
+									txt += '</fieldset>';
+								}
 								if (m.outs && m.outs.length > 0) {
 									txt += '<fieldset id="outs"><legend>Out</legend>';
 									txt += '<table>';
@@ -318,6 +326,8 @@ Describe.prototype = {
 												});
 											} else if (m.useJsonElementParameter) {
 												data = $.parseJSON($('#jsonElement').val());
+											} else if (m.useStringParameter) {
+												data = $('#string').val();
 											}
 											Describe.doPost(address, m, data);
 											break;
@@ -340,6 +350,8 @@ Describe.prototype = {
 												});
 											} else if (m.useJsonElementParameter) {
 												data = $.parseJSON($('#jsonElement').val());
+											} else if (m.useStringParameter) {
+												data = $('#string').val();
 											}
 											Describe.doPut(address, m, data);
 											break;

+ 2 - 2
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/ReadCompleted.java

@@ -343,7 +343,7 @@ public class ReadCompleted extends SliceJpaObject {
 	private String startTimeMonth;
 
 	public static final String completedTime_FIELDNAME = "completedTime";
-	@FieldDescribe("完成时间.")
+	@FieldDescribe("read转成readCompleted的完成时间,也就是任务的完成时间.")
 	@Temporal(TemporalType.TIMESTAMP)
 	/* 结束时间不能为空,如果为空排序可能出错 */
 	@Column(name = ColumnNamePrefix + completedTime_FIELDNAME)
@@ -352,7 +352,7 @@ public class ReadCompleted extends SliceJpaObject {
 	private Date completedTime;
 
 	public static final String completedTimeMonth_FIELDNAME = "completedTimeMonth";
-	@FieldDescribe("用于在Filter中分类使用.")
+	@FieldDescribe("read转成readCompleted的完成月份,也就是任务的完成时间,用于filter过滤..")
 	@Column(length = JpaObject.length_16B, name = ColumnNamePrefix + completedTimeMonth_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + completedTimeMonth_FIELDNAME)
 	@CheckPersist(allowEmpty = true)

+ 3 - 3
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Review.java

@@ -135,7 +135,7 @@ public class Review extends SliceJpaObject {
 	private String workCompleted;
 
 	public static final String completed_FIELDNAME = "completed";
-	@FieldDescribe("工作是否已经完成.")
+	@FieldDescribe("整个job是否已经完成.")
 	@Column(name = ColumnNamePrefix + completed_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + completed_FIELDNAME)
 	@CheckPersist(allowEmpty = false)
@@ -172,7 +172,7 @@ public class Review extends SliceJpaObject {
 	private String startTimeMonth;
 
 	public static final String completedTime_FIELDNAME = "completedTime";
-	@FieldDescribe("任务完成时间.")
+	@FieldDescribe("work的任务完成时间,review本身并没有完成时间.")
 	@Temporal(TemporalType.TIMESTAMP)
 	/* 结束时间不能为空,如果为空排序可能出错 */
 	@Column(name = ColumnNamePrefix + completedTime_FIELDNAME)
@@ -181,7 +181,7 @@ public class Review extends SliceJpaObject {
 	private Date completedTime;
 
 	public static final String completedTimeMonth_FIELDNAME = "completedTimeMonth";
-	@FieldDescribe("用于在Filter中分类使用.")
+	@FieldDescribe("work的任务完成月份,review本身并没有完成时间,用于filter过滤.")
 	@Column(length = JpaObject.length_16B, name = ColumnNamePrefix + completedTimeMonth_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + completedTimeMonth_FIELDNAME)
 	@CheckPersist(allowEmpty = true)

+ 32 - 2
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Task.java

@@ -102,8 +102,8 @@ public class Task extends SliceJpaObject {
 	public Task() {
 	}
 
-	public Task(Work work, String identity, String person, String unit, Date startTime, Date expireTime,
-			List<Route> routes, Boolean allowRapid) {
+	public Task(Work work, String identity, String person, String unit, String trustIdentity, Date startTime,
+			Date expireTime, List<Route> routes, Boolean allowRapid) {
 		this.job = work.getJob();
 		this.title = work.getTitle();
 		this.startTime = startTime;
@@ -118,6 +118,7 @@ public class Task extends SliceJpaObject {
 		this.person = person;
 		this.identity = identity;
 		this.unit = unit;
+		this.trustIdentity = trustIdentity;
 		this.activity = work.getActivity();
 		this.activityName = work.getActivityName();
 		this.activityAlias = work.getActivityAlias();
@@ -251,6 +252,13 @@ public class Task extends SliceJpaObject {
 	@CheckPersist(allowEmpty = false)
 	private String unit;
 
+	public static final String trustIdentity_FIELDNAME = "trustIdentity";
+	@FieldDescribe("委托人Identity")
+	@Column(length = length_255B, name = ColumnNamePrefix + trustIdentity_FIELDNAME)
+	@Index(name = TABLE + IndexNameMiddle + trustIdentity_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private String trustIdentity;
+
 	public static final String activity_FIELDNAME = "activity";
 	@FieldDescribe("活动ID.")
 	@Column(length = JpaObject.length_id, name = ColumnNamePrefix + activity_FIELDNAME)
@@ -433,6 +441,12 @@ public class Task extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true)
 	private String mediaOpinion;
 
+	public static final String first_FIELDNAME = "first";
+	@FieldDescribe("是否是第一条待办.")
+	@CheckPersist(allowEmpty = true)
+	@Column(name = ColumnNamePrefix + first_FIELDNAME)
+	private Boolean first;
+
 	public String getProcess() {
 		return process;
 	}
@@ -745,4 +759,20 @@ public class Task extends SliceJpaObject {
 		this.routeDecisionOpinionList = routeDecisionOpinionList;
 	}
 
+	public String getTrustIdentity() {
+		return trustIdentity;
+	}
+
+	public void setTrustIdentity(String trustIdentity) {
+		this.trustIdentity = trustIdentity;
+	}
+
+	public Boolean getFirst() {
+		return first;
+	}
+
+	public void setFirst(Boolean first) {
+		this.first = first;
+	}
+
 }

+ 2 - 2
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/TaskCompleted.java

@@ -227,7 +227,7 @@ public class TaskCompleted extends SliceJpaObject {
 	private String startTimeMonth;
 
 	public static final String completedTime_FIELDNAME = "completedTime";
-	@FieldDescribe("任务完成时间.")
+	@FieldDescribe("task转成taskCompleted的完成时间,也就是任务完成时间.")
 	@Temporal(TemporalType.TIMESTAMP)
 	/* 结束时间不能为空,如果为空排序可能出错 */
 	@Column(name = ColumnNamePrefix + completedTime_FIELDNAME)
@@ -236,7 +236,7 @@ public class TaskCompleted extends SliceJpaObject {
 	private Date completedTime;
 
 	public static final String completedTimeMonth_FIELDNAME = "completedTimeMonth";
-	@FieldDescribe("用于在Filter中分类使用.")
+	@FieldDescribe("task转成taskCompleted的完成月份,也就是任务的完成时间,用于filter过滤.")
 	@Column(length = JpaObject.length_16B, name = ColumnNamePrefix + completedTimeMonth_FIELDNAME)
 	@Index(name = TABLE + IndexNameMiddle + completedTimeMonth_FIELDNAME)
 	@CheckPersist(allowEmpty = true)

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

@@ -23,7 +23,6 @@ import org.apache.openjpa.persistence.jdbc.ElementColumn;
 import org.apache.openjpa.persistence.jdbc.ElementIndex;
 import org.apache.openjpa.persistence.jdbc.Index;
 
-import com.x.base.core.entity.AbstractPersistenceProperties;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.SliceJpaObject;
 import com.x.base.core.entity.annotation.CheckPersist;
@@ -126,7 +125,7 @@ public class Process extends SliceJpaObject {
 	public static final String controllerList_FIELDNAME = "controllerList";
 	@FieldDescribe("流程管理者.")
 	@PersistentCollection(fetch = FetchType.EAGER)
-	@OrderColumn(name =  ORDERCOLUMNCOLUMN)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
 	@ContainerTable(name = TABLE + ContainerTableNameMiddle + controllerList_FIELDNAME, joinIndex = @Index(name = TABLE
 			+ IndexNameMiddle + controllerList_FIELDNAME + JoinIndexNameSuffix))
 	@ElementColumn(length = length_255B, name = ColumnNamePrefix + controllerList_FIELDNAME)
@@ -145,7 +144,7 @@ public class Process extends SliceJpaObject {
 	public static final String reviewIdentityList_FIELDNAME = "reviewIdentityList";
 	@FieldDescribe("Work的参阅人员.")
 	@PersistentCollection(fetch = FetchType.EAGER)
-	@OrderColumn(name =  ORDERCOLUMNCOLUMN)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
 	@ContainerTable(name = TABLE + ContainerTableNameMiddle
 			+ reviewIdentityList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle
 					+ reviewIdentityList_FIELDNAME + JoinIndexNameSuffix))
@@ -224,7 +223,7 @@ public class Process extends SliceJpaObject {
 	@ContainerTable(name = TABLE + ContainerTableNameMiddle
 			+ startableIdentityList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle
 					+ startableIdentityList_FIELDNAME))
-	@OrderColumn(name =  ORDERCOLUMNCOLUMN)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
 	@ElementColumn(length = length_255B, name = ColumnNamePrefix + startableIdentityList_FIELDNAME)
 	@ElementIndex(name = TABLE + IndexNameMiddle + startableIdentityList_FIELDNAME + JoinIndexNameSuffix)
 	@CheckPersist(allowEmpty = true)
@@ -236,7 +235,7 @@ public class Process extends SliceJpaObject {
 	@ContainerTable(name = TABLE + ContainerTableNameMiddle
 			+ startableUnitList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle
 					+ startableUnitList_FIELDNAME + JoinIndexNameSuffix))
-	@OrderColumn(name =  ORDERCOLUMNCOLUMN)
+	@OrderColumn(name = ORDERCOLUMNCOLUMN)
 	@ElementColumn(length = length_255B, name = ColumnNamePrefix + startableUnitList_FIELDNAME)
 	@ElementIndex(name = TABLE + IndexNameMiddle + startableUnitList_FIELDNAME + ElementIndexNameSuffix)
 	@CheckPersist(allowEmpty = true)
@@ -300,11 +299,13 @@ public class Process extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true)
 	private String expireScriptText;
 
-	/* flag标志位 */
-	// public static String[] FLA GS = new String[] { id_FIELDNAME, alias_FIELDNAME
-	// };
+	public static final String checkDraft_FIELDNAME = "checkDraft";
+	@FieldDescribe("是否进行无内容的草稿删除校验.")
+	@Column(name = ColumnNamePrefix + checkDraft_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private Boolean checkDraft;
 
-	// public static String[] RESTRICTFLA GS = new String[] { name_FIELDNAME };
+	/* flag标志位 */
 
 	public String getName() {
 		return name;
@@ -530,4 +531,12 @@ public class Process extends SliceJpaObject {
 		this.icon = icon;
 	}
 
+	public Boolean getCheckDraft() {
+		return checkDraft;
+	}
+
+	public void setCheckDraft(Boolean checkDraft) {
+		this.checkDraft = checkDraft;
+	}
+
 }

+ 1 - 1
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/Route.java

@@ -126,7 +126,7 @@ public class Route extends SliceJpaObject {
 
 	public static final String position_FIELDNAME = "position";
 	@FieldDescribe("文本位置.")
-	@Column(length = JpaObject.length_64B, name = ColumnNamePrefix + position_FIELDNAME)
+	@Column(length = JpaObject.length_255B, name = ColumnNamePrefix + position_FIELDNAME)
 	@CheckPersist(allowEmpty = true)
 	private String position;
 

+ 16 - 8
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/element/util/WorkLogTree.java

@@ -43,9 +43,10 @@ public class WorkLogTree {
 			throw new ExceptionBeginNotFound();
 		}
 		root = this.find(begin);
-		for (Node o : nodes) {
-			this.associate();
-		}
+//		for (Node o : nodes) {
+//			this.associate();
+//		}
+		this.associate();
 	}
 
 	private void associate() {
@@ -53,7 +54,7 @@ public class WorkLogTree {
 			this.nodes.stream().filter(
 					o -> StringUtils.equals(node.workLog.getFromActivityToken(), o.workLog.getArrivedActivityToken()))
 					.forEach(o -> {
-						node.parent.add(o);
+						node.parents.add(o);
 					});
 			this.nodes.stream().filter(
 					o -> StringUtils.equals(node.workLog.getArrivedActivityToken(), o.workLog.getFromActivityToken()))
@@ -114,7 +115,7 @@ public class WorkLogTree {
 		}
 
 		private WorkLog workLog;
-		private Nodes parent = new Nodes();
+		private Nodes parents = new Nodes();
 		private Nodes children = new Nodes();
 
 		public Nodes upTo(ActivityType activityType, ActivityType... pass) {
@@ -128,7 +129,7 @@ public class WorkLogTree {
 		}
 
 		private void upTo(ActivityType activityType, List<ActivityType> pass, Nodes result) {
-			for (Node o : this.parent) {
+			for (Node o : this.parents) {
 				if (Objects.equals(o.workLog.getFromActivityType(), activityType)) {
 					result.add(o);
 				} else {
@@ -139,6 +140,14 @@ public class WorkLogTree {
 			}
 		}
 
+		public Nodes parents() {
+			return parents;
+		}
+
+		public Nodes children() {
+			return children;
+		}
+
 		public WorkLog getWorkLog() {
 			return workLog;
 		}
@@ -201,7 +210,7 @@ public class WorkLogTree {
 	}
 
 	private void up(Node node, Nodes result) {
-		for (Node o : node.parent) {
+		for (Node o : node.parents) {
 			result.add(o);
 			up(o, result);
 		}
@@ -249,7 +258,6 @@ public class WorkLogTree {
 			}
 		}
 		return node;
-
 	}
 
 }

+ 6 - 6
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/MessageFactory.java

@@ -106,7 +106,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(Task o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();
@@ -117,7 +117,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(Read o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();
@@ -128,7 +128,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(TaskCompleted o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();
@@ -139,7 +139,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(ReadCompleted o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();
@@ -150,7 +150,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(Review o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();
@@ -161,7 +161,7 @@ public class MessageFactory {
 
 	private static String adjustTitle(Work o) {
 		String title = "";
-		if (StringUtils.isNotEmpty(o.getTitle())) {
+		if (StringUtils.isEmpty(o.getTitle())) {
 			title = "无标题 " + DateTools.format(o.getStartTime());
 		} else {
 			title = o.getTitle();

+ 0 - 3
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/ThisApplication.java

@@ -6,7 +6,6 @@ import com.x.base.core.project.Context;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.message.MessageConnector;
-import com.x.collaboration.core.message.Collaboration;
 import com.x.processplatform.service.processing.processor.embed.SyncEmbedQueue;
 import com.x.processplatform.service.processing.processor.invoke.SyncJaxrsInvokeQueue;
 import com.x.processplatform.service.processing.processor.invoke.SyncJaxwsInvokeQueue;
@@ -33,7 +32,6 @@ public class ThisApplication {
 		try {
 			LoggerFactory.setLevel(Config.logLevel().x_processplatform_service_processing());
 			ScriptHelperFactory.initialScriptText = Config.initialScriptText();
-			Collaboration.start(context());
 			MessageConnector.start(context());
 			context().startQueue(syncJaxrsInvokeQueue);
 			context().startQueue(syncJaxwsInvokeQueue);
@@ -57,7 +55,6 @@ public class ThisApplication {
 
 	public static void destroy() {
 		try {
-			Collaboration.stop();
 			MessageConnector.stop();
 		} catch (Exception e) {
 			e.printStackTrace();

+ 5 - 7
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/WorkContext.java

@@ -45,13 +45,6 @@ public class WorkContext {
 		this.processingAttributes = aeiObjects.getProcessingAttributes();
 	}
 
-//	WorkContext(Business business, Work work, Activity activity) throws Exception {
-//		this.business = business;
-//		this.work = work;
-//		this.activity = activity;
-//		this.gson = XGsonBuilder.instance();
-//	}
-
 	WorkContext(Business business, Work work, Activity activity, Task task) throws Exception {
 		this.business = business;
 		this.work = work;
@@ -90,6 +83,11 @@ public class WorkContext {
 		try {
 			List<String> ids = business.workLog().listWithWork(work.getId());
 			List<WorkLog> list = business.entityManagerContainer().list(WorkLog.class, ids);
+			/* 保持和前台一直顺序 */
+			list = list.stream()
+					.sorted(Comparator.comparing(WorkLog::getFromTime, Comparator.nullsLast(Date::compareTo))
+							.thenComparing(WorkLog::getArrivedTime, Comparator.nullsLast(Date::compareTo)))
+					.collect(Collectors.toList());
 			return gson.toJson(list);
 		} catch (Exception e) {
 			throw new Exception("getWorkLogList error.", e);

+ 0 - 6
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionCreateWithWork.java

@@ -25,8 +25,6 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
-import com.x.collaboration.core.message.Collaboration;
-import com.x.collaboration.core.message.notification.ReadMessage;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.Read_;
 import com.x.processplatform.core.entity.content.Work;
@@ -99,13 +97,9 @@ class ActionCreateWithWork extends BaseAction {
 				emc.commit();
 				if (BooleanUtils.isNotFalse(wi.getNotify())) {
 					for (Read read : adds) {
-						ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
-						Collaboration.send(message);
 						MessageFactory.read_create(read);
 					}
 					for (Read read : updates) {
-						ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
-						Collaboration.send(message);
 						MessageFactory.read_create(read);
 					}
 				}

+ 0 - 6
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionCreateWithWorkCompleted.java

@@ -25,8 +25,6 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
-import com.x.collaboration.core.message.Collaboration;
-import com.x.collaboration.core.message.notification.ReadMessage;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.Read_;
 import com.x.processplatform.core.entity.content.WorkCompleted;
@@ -96,13 +94,9 @@ class ActionCreateWithWorkCompleted extends BaseAction {
 				emc.commit();
 				if (BooleanUtils.isNotFalse(wi.getNotify())) {
 					for (Read read : adds) {
-						ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
-						Collaboration.send(message);
 						MessageFactory.read_create(read);
 					}
 					for (Read read : updates) {
-						ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
-						Collaboration.send(message);
 						MessageFactory.read_create(read);
 					}
 				}

+ 0 - 4
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/read/ActionReset.java

@@ -21,8 +21,6 @@ import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.base.core.project.tools.ListTools;
-import com.x.collaboration.core.message.Collaboration;
-import com.x.collaboration.core.message.notification.ReadMessage;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.ReadCompleted;
 import com.x.processplatform.core.entity.content.ReadCompleted_;
@@ -99,8 +97,6 @@ class ActionReset extends BaseAction {
 				emc.commit();
 				MessageFactory.read_delete(read);
 				for (Read obj : list) {
-					ReadMessage message = new ReadMessage(obj.getPerson(), obj.getWork(), obj.getId());
-					Collaboration.send(message);
 					MessageFactory.read_create(obj);
 				}
 				Wo wo = new Wo();

+ 31 - 20
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/task/ActionReset.java

@@ -1,11 +1,10 @@
 package com.x.processplatform.service.processing.jaxrs.task;
 
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.BooleanUtils;
 
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
@@ -50,33 +49,34 @@ class ActionReset extends BaseAction {
 				throw new ExceptionEntityNotExist(task.getWork(), Work.class);
 			}
 			/* 检查reset人员 */
-			List<String> identites = new ArrayList<>();
-			for (String str : ListTools.trim(business.organization().identity().list(wi.getIdentityList()), true,
-					true)) {
-				/** 去掉重置给自己 */
-				if (!StringUtils.equals(task.getIdentity(), str)) {
-					identites.add(str);
-				}
-			}
+			List<String> identites = ListTools.trim(business.organization().identity().list(wi.getIdentityList()), true,
+					true);
+
+			/* 在新增待办人员中删除当前的处理人 */
+
+			identites = ListUtils.subtract(identites, ListTools.toList(task.getIdentity()));
+
 			if (identites.isEmpty()) {
 				throw new ExceptionResetEmpty();
 			}
-			Date now = new Date();
-			Long duration = Config.workTime().betweenMinutes(task.getStartTime(), now);
-			TaskCompleted taskCompleted = new TaskCompleted(task, ProcessingType.reset, now, duration);
-			emc.beginTransaction(TaskCompleted.class);
-			emc.beginTransaction(Task.class);
 			emc.beginTransaction(Work.class);
-			emc.persist(taskCompleted, CheckPersistType.all);
-			emc.remove(task, CheckRemoveType.all);
 			List<String> os = ListTools.trim(work.getManualTaskIdentityList(), true, true);
-			os.remove(task.getIdentity());
+			if (BooleanUtils.isNotTrue(wi.getKeep())) {
+				Date now = new Date();
+				Long duration = Config.workTime().betweenMinutes(task.getStartTime(), now);
+				TaskCompleted taskCompleted = new TaskCompleted(task, ProcessingType.reset, now, duration);
+				emc.beginTransaction(TaskCompleted.class);
+				emc.beginTransaction(Task.class);
+				emc.persist(taskCompleted, CheckPersistType.all);
+				emc.remove(task, CheckRemoveType.all);
+				os.remove(task.getIdentity());
+				MessageFactory.taskCompleted_create(taskCompleted);
+				MessageFactory.task_delete(task);
+			}
 			os = ListUtils.union(os, identites);
 			work.setManualTaskIdentityList(ListTools.trim(os, true, true));
 			emc.check(work, CheckPersistType.all);
 			emc.commit();
-			MessageFactory.taskCompleted_create(taskCompleted);
-			MessageFactory.task_delete(task);
 			ProcessingAttributes processingAttributes = new ProcessingAttributes();
 			processingAttributes.setDebugger(effectivePerson.getDebugger());
 			Processing processing = new Processing(processingAttributes);
@@ -93,6 +93,9 @@ class ActionReset extends BaseAction {
 		@FieldDescribe("身份")
 		private List<String> identityList;
 
+		@FieldDescribe("保留自身待办.")
+		private Boolean keep;
+
 		public List<String> getIdentityList() {
 			return identityList;
 		}
@@ -100,6 +103,14 @@ class ActionReset extends BaseAction {
 		public void setIdentityList(List<String> identityList) {
 			this.identityList = identityList;
 		}
+
+		public Boolean getKeep() {
+			return keep;
+		}
+
+		public void setKeep(Boolean keep) {
+			this.keep = keep;
+		}
 	}
 
 	public static class Wo extends WoId {

+ 0 - 18
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/taskcompleted/ActionPress.java

@@ -15,16 +15,11 @@ import com.x.base.core.project.jaxrs.WrapStringList;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DateTools;
-import com.x.base.core.project.tools.PropertyTools;
-import com.x.processplatform.core.entity.content.Data;
 import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.element.Activity;
-import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.service.processing.Business;
 import com.x.processplatform.service.processing.MessageFactory;
-import com.x.processplatform.service.processing.WorkDataHelper;
 
 class ActionPress extends BaseAction {
 
@@ -45,19 +40,6 @@ class ActionPress extends BaseAction {
 
 			List<Task> list = emc.listEqual(Task.class, Task.work_FIELDNAME, work.getId());
 
-			Activity activity = business.element().getActivity(work.getActivity());
-
-			if (null == activity) {
-
-			}
-
-//			String script = PropertyTools.getOrElse(activity, Manual.manualPressScript_FIELDNAME, String.class, "");
-//
-//			String scriptText = PropertyTools.getOrElse(activity, Manual.manualPressScriptText_FIELDNAME, String.class,
-//					"");
-
-//			Data data = new WorkDataHelper(business.entityManagerContainer(), work).get();
-
 			Wo wo = new Wo();
 
 			for (Task task : list) {

+ 121 - 71
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionAddSplit.java

@@ -1,5 +1,6 @@
 package com.x.processplatform.service.processing.jaxrs.work;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -10,11 +11,14 @@ 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.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 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.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.StringTools;
+import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.Work;
 import com.x.processplatform.core.entity.content.WorkLog;
 import com.x.processplatform.core.entity.element.Activity;
@@ -25,13 +29,14 @@ import com.x.processplatform.service.processing.ProcessingAttributes;
 
 class ActionAddSplit extends BaseAction {
 
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement)
+			throws Exception {
 
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 
 			Business business = new Business(emc);
 
-			ActionResult<Wo> result = new ActionResult<>();
+			ActionResult<List<Wo>> result = new ActionResult<>();
 
 			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
 			/* 校验work是否存在 */
@@ -46,7 +51,7 @@ class ActionAddSplit extends BaseAction {
 				throw new ExceptionNotSplit(work.getId());
 			}
 
-			if (StringUtils.isEmpty(wi.getSplitValue())) {
+			if (ListTools.isEmpty(wi.getSplitValueList())) {
 				throw new ExceptionEmptySplitValue(work.getId());
 			}
 
@@ -70,83 +75,103 @@ class ActionAddSplit extends BaseAction {
 
 			Activity activity = business.element().getActivity(from.getFromActivity());
 
-			emc.beginTransaction(Work.class);
-			emc.beginTransaction(WorkLog.class);
-
-			Work workCopy = new Work(work);
-			workCopy.setActivity(activity.getId());
-			workCopy.setActivityAlias(activity.getAlias());
-			workCopy.setActivityArrivedTime(new Date());
-			workCopy.setActivityDescription(activity.getDescription());
-			workCopy.setActivityName(activity.getName());
-			workCopy.setActivityToken(StringTools.uniqueToken());
-			workCopy.setActivityType(activity.getActivityType());
-			workCopy.setSplitTokenList(arrived.getSplitTokenList());
-			workCopy.setSplitToken(arrived.getSplitToken());
-			workCopy.setSplitting(from.getSplitting());
-			workCopy.getManualTaskIdentityList().clear();
-			workCopy.setSplitValue(wi.getSplitValue());
-			workCopy.getManualTaskIdentityList().clear();
-			workCopy.setBeforeExecuted(false);
-			workCopy.setDestinationActivity(null);
-			workCopy.setDestinationActivityType(null);
-			workCopy.setDestinationRoute(null);
-			workCopy.setDestinationRouteName(null);
-
-			WorkLog arrivedCopy = new WorkLog(arrived);
-			arrivedCopy.setArrivedActivity(activity.getId());
-			arrivedCopy.setArrivedActivityAlias(activity.getAlias());
-			arrivedCopy.setArrivedActivityName(activity.getName());
-			arrivedCopy.setArrivedActivityToken(workCopy.getActivityToken());
-			arrivedCopy.setArrivedActivityType(activity.getActivityType());
-			arrivedCopy.setWork(workCopy.getId());
-			arrivedCopy.setArrivedTime(workCopy.getActivityArrivedTime());
-			arrivedCopy.setSplitValue(workCopy.getSplitValue());
-
-			WorkLog fromCopy = new WorkLog(from);
-			fromCopy.setConnected(false);
-			fromCopy.setFromActivity(activity.getId());
-			fromCopy.setFromActivityAlias(activity.getAlias());
-			fromCopy.setFromActivityName(activity.getName());
-			fromCopy.setFromActivityType(activity.getActivityType());
-			fromCopy.setFromActivityToken(workCopy.getActivityToken());
-			fromCopy.setFromTime(workCopy.getActivityArrivedTime());
-			fromCopy.setWork(workCopy.getId());
-			arrivedCopy.setSplitValue(workCopy.getSplitValue());
-			fromCopy.setArrivedActivity("");
-			fromCopy.setArrivedActivityAlias("");
-			fromCopy.setArrivedActivityName("");
-			fromCopy.setArrivedActivityToken("");
-			fromCopy.setArrivedActivityType(null);
-			fromCopy.setArrivedTime(null);
-
-			emc.persist(workCopy, CheckPersistType.all);
-			emc.persist(arrivedCopy, CheckPersistType.all);
-			emc.persist(fromCopy, CheckPersistType.all);
-			emc.commit();
-			Processing processing = new Processing(wi);
-			processing.processing(workCopy.getId());
-			Wo wo = new Wo();
-			wo.setId(workCopy.getId());
-			result.setData(wo);
+			List<Wo> wos = new ArrayList<>();
+
+			for (String splitValue : wi.getSplitValueList()) {
+
+				emc.beginTransaction(Work.class);
+				emc.beginTransaction(WorkLog.class);
+
+				Work workCopy = new Work(work);
+				workCopy.setActivity(activity.getId());
+				workCopy.setActivityAlias(activity.getAlias());
+				workCopy.setActivityArrivedTime(new Date());
+				workCopy.setActivityDescription(activity.getDescription());
+				workCopy.setActivityName(activity.getName());
+				workCopy.setActivityToken(StringTools.uniqueToken());
+				workCopy.setActivityType(activity.getActivityType());
+				workCopy.setSplitTokenList(arrived.getSplitTokenList());
+				workCopy.setSplitToken(arrived.getSplitToken());
+				workCopy.setSplitting(from.getSplitting());
+				workCopy.getManualTaskIdentityList().clear();
+				workCopy.setSplitValue(splitValue);
+				workCopy.getManualTaskIdentityList().clear();
+				workCopy.setBeforeExecuted(false);
+				workCopy.setDestinationActivity(null);
+				workCopy.setDestinationActivityType(null);
+				workCopy.setDestinationRoute(null);
+				workCopy.setDestinationRouteName(null);
+
+				WorkLog arrivedCopy = new WorkLog(arrived);
+				arrivedCopy.setArrivedActivity(activity.getId());
+				arrivedCopy.setArrivedActivityAlias(activity.getAlias());
+				arrivedCopy.setArrivedActivityName(activity.getName());
+				arrivedCopy.setArrivedActivityToken(workCopy.getActivityToken());
+				arrivedCopy.setArrivedActivityType(activity.getActivityType());
+				arrivedCopy.setWork(workCopy.getId());
+				arrivedCopy.setArrivedTime(workCopy.getActivityArrivedTime());
+				arrivedCopy.setSplitValue(workCopy.getSplitValue());
+
+				WorkLog fromCopy = new WorkLog(from);
+				fromCopy.setConnected(false);
+				fromCopy.setFromActivity(activity.getId());
+				fromCopy.setFromActivityAlias(activity.getAlias());
+				fromCopy.setFromActivityName(activity.getName());
+				fromCopy.setFromActivityType(activity.getActivityType());
+				fromCopy.setFromActivityToken(workCopy.getActivityToken());
+				fromCopy.setFromTime(workCopy.getActivityArrivedTime());
+				fromCopy.setWork(workCopy.getId());
+				arrivedCopy.setSplitValue(workCopy.getSplitValue());
+				fromCopy.setArrivedActivity("");
+				fromCopy.setArrivedActivityAlias("");
+				fromCopy.setArrivedActivityName("");
+				fromCopy.setArrivedActivityToken("");
+				fromCopy.setArrivedActivityType(null);
+				fromCopy.setArrivedTime(null);
+
+				emc.persist(workCopy, CheckPersistType.all);
+				emc.persist(arrivedCopy, CheckPersistType.all);
+				emc.persist(fromCopy, CheckPersistType.all);
+				emc.commit();
+				Processing processing = new Processing(wi);
+				processing.processing(workCopy.getId());
+
+				Wo wo = this.wo(business, workCopy);
+				wos.add(wo);
+			}
+			result.setData(wos);
 			return result;
 		}
 	}
 
+	private Wo wo(Business business, Work copy) throws Exception {
+		Wo wo = business.entityManagerContainer().fetch(copy.getId(), Wo.copier);
+		if (null != wo) {
+			wo.setTaskList(this.woTasks(business, copy));
+			return wo;
+		}
+		return null;
+	}
+
+	private List<WoTask> woTasks(Business business, Work copy) throws Exception {
+		return business.entityManagerContainer().fetchEqual(Task.class, WoTask.copier, Task.work_FIELDNAME,
+				copy.getId());
+	}
+
 	public static class Wi extends ProcessingAttributes {
 
-		@FieldDescribe("增加的拆分值")
-		private String splitValue;
+		@FieldDescribe("添加的拆分值.")
+		private List<String> splitValueList;
 
-		@FieldDescribe("拆分到的日志")
+		@FieldDescribe("工作日志.")
 		private String workLog;
 
-		public String getSplitValue() {
-			return splitValue;
+		public List<String> getSplitValueList() {
+			return splitValueList;
 		}
 
-		public void setSplitValue(String splitValue) {
-			this.splitValue = splitValue;
+		public void setSplitValueList(List<String> splitValueList) {
+			this.splitValueList = splitValueList;
 		}
 
 		public String getWorkLog() {
@@ -159,7 +184,32 @@ class ActionAddSplit extends BaseAction {
 
 	}
 
-	public static class Wo extends WoId {
+	public static class Wo extends Work {
+
+		private static final long serialVersionUID = 8122551349295505134L;
+
+		static WrapCopier<Work, Wo> copier = WrapCopierFactory.wo(Work.class, Wo.class,
+				ListTools.toList(Work.id_FIELDNAME, Work.activityName_FIELDNAME), null);
+
+		private List<WoTask> taskList = new ArrayList<>();
+
+		public List<WoTask> getTaskList() {
+			return taskList;
+		}
+
+		public void setTaskList(List<WoTask> taskList) {
+			this.taskList = taskList;
+		}
+
+	}
+
+	public static class WoTask extends Task {
+
+		private static final long serialVersionUID = 5196447462619948056L;
+
+		static WrapCopier<Task, WoTask> copier = WrapCopierFactory.wo(Task.class, WoTask.class,
+				ListTools.toList(Task.person_FIELDNAME, Task.unit_FIELDNAME), null);
+
 	}
 
 }

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionReroute.java

@@ -1,6 +1,5 @@
 package com.x.processplatform.service.processing.jaxrs.work;
 
-import java.net.URLEncoder;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
@@ -10,6 +9,7 @@ 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.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
@@ -52,7 +52,7 @@ class ActionReroute extends BaseAction {
 			this.removeTask(business, work);
 			emc.commit();
 			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
-					"work/" + URLEncoder.encode(work.getId(), "UTF-8") + "/processing", null);
+					Applications.joinQueryUri("work", work.getId(), "processing"), null);
 			Wo wo = new Wo();
 			wo.setId(work.getId());
 			result.setData(wo);

+ 0 - 261
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRetract.java

@@ -1,261 +0,0 @@
-package com.x.processplatform.service.processing.jaxrs.work;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.collections4.list.SetUniqueList;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.x.base.core.container.EntityManagerContainer;
-import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.exception.ExceptionEntityNotExist;
-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.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.ListTools;
-import com.x.processplatform.core.entity.content.Read;
-import com.x.processplatform.core.entity.content.ReadCompleted;
-import com.x.processplatform.core.entity.content.Review;
-import com.x.processplatform.core.entity.content.Task;
-import com.x.processplatform.core.entity.content.TaskCompleted;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.content.WorkLog;
-import com.x.processplatform.core.entity.content.WorkStatus;
-import com.x.processplatform.core.entity.element.Application;
-import com.x.processplatform.core.entity.element.Process;
-import com.x.processplatform.core.entity.element.util.WorkLogTree;
-import com.x.processplatform.core.entity.element.util.WorkLogTree.Node;
-import com.x.processplatform.core.entity.element.util.WorkLogTree.Nodes;
-import com.x.processplatform.service.processing.Business;
-import com.x.processplatform.service.processing.MessageFactory;
-import com.x.processplatform.service.processing.Processing;
-import com.x.processplatform.service.processing.ProcessingAttributes;
-import com.x.processplatform.service.processing.configurator.ProcessingConfigurator;
-import com.x.processplatform.service.processing.jaxrs.work.ActionRollback.Wi;
-import com.x.processplatform.service.processing.jaxrs.work.ActionRollback.Wo;
-
-/**
- * 根据WorkLogId进行召回
- * 
- * @author Rui
- *
- */
-class ActionRetract extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionRetract.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String workLogId) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-
-			ActionResult<Wo> result = new ActionResult<>();
-
-			Business business = new Business(emc);
-
-			Work work = emc.find(id, Work.class);
-
-			if (null == work) {
-				throw new ExceptionEntityNotExist(id, Work.class);
-			}
-
-			Application application = business.element().get(work.getApplication(), Application.class);
-
-			if (null == application) {
-				throw new ExceptionEntityNotExist(work.getApplication(), Application.class);
-			}
-
-			Process process = business.element().get(work.getProcess(), Process.class);
-
-			if (null == process) {
-				throw new ExceptionEntityNotExist(work.getProcess(), Process.class);
-			}
-
-			WorkLog workLog = emc.find(workLogId, WorkLog.class);
-
-			if (null == workLog) {
-				throw new ExceptionEntityNotExist(workLogId, WorkLog.class);
-			}
-
-			if (BooleanUtils.isTrue(workLog.getSplitting())) {
-				throw new ExceptionSplittingNotRollback(work.getId(), workLog.getId());
-			}
-
-			List<WorkLog> workLogs = emc.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, workLog.getJob());
-
-			WorkLogTree workLogTree = new WorkLogTree(workLogs);
-
-			Node node = workLogTree.find(workLog);
-
-			Nodes nodes = workLogTree.rootTo(node);
-
-			emc.beginTransaction(Work.class);
-			emc.beginTransaction(WorkLog.class);
-			emc.beginTransaction(Task.class);
-			emc.beginTransaction(TaskCompleted.class);
-			emc.beginTransaction(Read.class);
-			emc.beginTransaction(ReadCompleted.class);
-			emc.beginTransaction(Review.class);
-
-			this.rollbackWork(work, workLog);
-
-			this.disconnectWorkLog(work, workLog);
-
-			this.rollbackTask(business, emc.listEqual(Task.class, Task.job_FIELDNAME, work.getJob()));
-
-			this.rollbackTaskCompleted(business, work, nodes, workLog,
-					emc.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, work.getJob()));
-
-			this.rollbackRead(business, work, nodes, workLog,
-					emc.listEqual(Read.class, Read.job_FIELDNAME, work.getJob()));
-
-			this.rollbackReadCompleted(business, work, nodes, workLog,
-					emc.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, work.getJob()));
-
-			this.rollbackReview(business, nodes, emc.listEqual(Review.class, Review.job_FIELDNAME, work.getJob()));
-
-			this.rollbackWorkLog(business, work, nodes, workLogs);
-
-			emc.commit();
-
-			Processing processing = new Processing(0, new ProcessingAttributes(), emc);
-			processing.processing(work.getId());
-			Wo wo = new Wo();
-			wo.setId(work.getId());
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	private void rollbackWork(Work work, WorkLog workLog) throws Exception {
-		work.setSplitting(false);
-		work.setActivityName(workLog.getFromActivityName());
-		work.setManualTaskIdentityList(new ArrayList<String>());
-		work.setActivity(workLog.getFromActivity());
-		work.setActivityAlias(workLog.getFromActivityAlias());
-		work.setActivityArrivedTime(workLog.getFromTime());
-		work.setActivityDescription("");
-		work.setActivityToken(workLog.getFromActivityToken());
-		work.setActivityType(workLog.getFromActivityType());
-		work.setErrorRetry(0);
-		work.setWorkStatus(WorkStatus.processing);
-	}
-
-	private void disconnectWorkLog(Work work, WorkLog workLog) {
-		workLog.setConnected(false);
-		workLog.setArrivedActivity("");
-		workLog.setArrivedActivityAlias("");
-		workLog.setArrivedActivityName("");
-		workLog.setArrivedActivityToken("");
-		workLog.setArrivedActivityType(null);
-		workLog.setArrivedTime(null);
-		workLog.setDuration(0L);
-		workLog.setWorkCompleted("");
-		workLog.setWork(work.getId());
-	}
-
-	private void rollbackTask(Business business, List<Task> list) throws Exception {
-		for (Task o : list) {
-			business.entityManagerContainer().remove(o);
-			MessageFactory.task_delete(o);
-		}
-	}
-
-	private void rollbackTaskCompleted(Business business, Work work, Nodes nodes, WorkLog workLog,
-			List<TaskCompleted> list) throws Exception {
-		for (TaskCompleted o : list) {
-			if (!nodes.containsWorkLogWithActivityToken(o.getActivityToken())
-					|| StringUtils.equals(o.getActivityToken(), workLog.getFromActivityToken())) {
-				business.entityManagerContainer().remove(o);
-				MessageFactory.taskCompleted_delete(o);
-			} else {
-				o.setCompleted(false);
-				o.setCompletedTime(null);
-				o.setCompletedTimeMonth("");
-				o.setWorkCompleted("");
-				o.setWork(work.getId());
-			}
-		}
-	}
-
-	private void rollbackRead(Business business, Work work, Nodes nodes, WorkLog workLog, List<Read> list)
-			throws Exception {
-		for (Read o : list) {
-			if (!nodes.containsWorkLogWithActivityToken(o.getActivityToken())
-					|| StringUtils.equals(o.getActivityToken(), workLog.getFromActivityToken())) {
-				business.entityManagerContainer().remove(o);
-				MessageFactory.read_delete(o);
-			} else {
-				o.setCompleted(false);
-				o.setWorkCompleted("");
-				o.setWork(work.getId());
-			}
-		}
-	}
-
-	private void rollbackReadCompleted(Business business, Work work, Nodes nodes, WorkLog workLog,
-			List<ReadCompleted> list) throws Exception {
-		for (ReadCompleted o : list) {
-			if (!nodes.containsWorkLogWithActivityToken(o.getActivityToken())
-					|| StringUtils.equals(o.getActivityToken(), workLog.getFromActivityToken())) {
-				business.entityManagerContainer().remove(o);
-				MessageFactory.readCompleted_delete(o);
-			} else {
-				o.setCompleted(false);
-				o.setCompletedTime(null);
-				o.setCompletedTimeMonth("");
-				o.setWorkCompleted("");
-				o.setWork(work.getId());
-			}
-		}
-	}
-
-	private void rollbackReview(Business business, Nodes nodes, List<Review> list) throws Exception {
-		Date date = nodes.latestArrivedTime();
-		if (null != date) {
-			for (Review o : list) {
-				if (null != o.getStartTime() && o.getStartTime().after(date)) {
-					business.entityManagerContainer().remove(o);
-					MessageFactory.review_delete(o);
-				} else {
-					o.setCompleted(false);
-					o.setCompletedTime(null);
-					o.setCompletedTimeMonth("");
-				}
-			}
-		}
-	}
-
-	private void rollbackWorkLog(Business business, Work work, Nodes nodes, List<WorkLog> list) throws Exception {
-		for (WorkLog o : list) {
-			if (!nodes.containsWorkLog(o)) {
-				business.entityManagerContainer().remove(o);
-			} else {
-				o.setCompleted(false);
-				o.setWorkCompleted("");
-				o.setWork(work.getId());
-			}
-		}
-	}
-
-	public static class Wi extends ProcessingAttributes {
-
-		@FieldDescribe("工作日志标识")
-		private String workLog;
-
-		public String getWorkLog() {
-			return workLog;
-		}
-
-		public void setWorkLog(String workLog) {
-			this.workLog = workLog;
-		}
-
-	}
-
-	public static class Wo extends WoId {
-	}
-}

+ 0 - 130
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRetractBack.java

@@ -1,130 +0,0 @@
-package com.x.processplatform.service.processing.jaxrs.work;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.collections4.list.SetUniqueList;
-import org.apache.commons.lang3.StringUtils;
-
-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.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.ListTools;
-import com.x.processplatform.core.entity.content.Read;
-import com.x.processplatform.core.entity.content.ReadCompleted;
-import com.x.processplatform.core.entity.content.Review;
-import com.x.processplatform.core.entity.content.Task;
-import com.x.processplatform.core.entity.content.TaskCompleted;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.content.WorkLog;
-import com.x.processplatform.service.processing.Business;
-import com.x.processplatform.service.processing.Processing;
-import com.x.processplatform.service.processing.ProcessingAttributes;
-import com.x.processplatform.service.processing.configurator.ProcessingConfigurator;
-
-/**
- * 根据WorkLogId进行召回
- * 
- * @author Rui
- *
- */
-class ActionRetractBack extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionRetractBack.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String workLogId) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			Work work = null;
-			WorkLog workLog = null;
-			work = emc.find(id, Work.class);
-			if (null == work) {
-				throw new ExceptionWorkNotExist(id);
-			}
-			workLog = emc.find(workLogId, WorkLog.class);
-			if (null == workLog) {
-				throw new ExceptionWorkLogNotExist(workLogId);
-			}
-			if (!StringUtils.equals(work.getJob(), workLog.getJob())) {
-				throw new ExceptionWorkNotMatchWithWorkLog(work.getTitle(), work.getId(), work.getJob(),
-						workLog.getId(), workLog.getJob());
-			}
-			List<Work> works = this.listForwardWork(business, workLog);
-			emc.beginTransaction(Work.class);
-			emc.beginTransaction(Task.class);
-			emc.beginTransaction(TaskCompleted.class);
-			emc.beginTransaction(Read.class);
-			emc.beginTransaction(ReadCompleted.class);
-			emc.beginTransaction(Review.class);
-			emc.beginTransaction(WorkLog.class);
-			for (Work o : works) {
-				this.cleanComplex(business, o);
-				if (!StringUtils.equals(work.getId(), o.getId())) {
-					business.entityManagerContainer().remove(o);
-				}
-			}
-			this.retractAsWorkLog(work, workLog);
-			emc.delete(WorkLog.class,
-					business.workLog().listWithFromActivityTokenForward(workLog.getFromActivityToken()));
-			emc.commit();
-			Processing processing = new Processing(0, new ProcessingAttributes(), emc);
-			ProcessingConfigurator processingConfigurator = new ProcessingConfigurator();
-			processingConfigurator.setContinueLoop(false);
-			processingConfigurator.setActivityCreateRead(false);
-			processingConfigurator.setActivityCreateReview(false);
-			processingConfigurator.setChangeActivityToken(false);
-			processingConfigurator.setJoinAtExecute(false);
-			processingConfigurator.setActivityStampArrivedWorkLog(false);
-			processing.processing(work.getId(), processingConfigurator);
-			Wo wo = new Wo();
-			wo.setId(id);
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends WoId {
-
-	}
-
-	private void cleanComplex(Business business, Work work) throws Exception {
-		business.entityManagerContainer().delete(Task.class,
-				business.task().listWithActivityToken(work.getActivityToken()));
-		business.entityManagerContainer().delete(TaskCompleted.class,
-				business.taskCompleted().listWithActivityToken(work.getActivityToken()));
-		business.entityManagerContainer().delete(Read.class,
-				business.read().listWithActivityToken(work.getActivityToken()));
-		business.entityManagerContainer().delete(ReadCompleted.class,
-				business.readCompleted().listWithActivityToken(work.getActivityToken()));
-		// business.entityManagerContainer().delete(Review.class,
-		// business.review().listWithActivityToken(work.getActivityToken()));
-	}
-
-	private List<Work> listForwardWork(Business business, WorkLog workLog) throws Exception {
-		List<String> ids = business.workLog()
-				.listWithFromActivityTokenForwardNotConnected(workLog.getFromActivityToken());
-		List<String> activityTokens = SetUniqueList.setUniqueList(new ArrayList<String>());
-		for (WorkLog o : business.entityManagerContainer().fetch(ids, WorkLog.class,
-				ListTools.toList(WorkLog.fromActivityToken_FIELDNAME))) {
-			activityTokens.add(o.getFromActivityToken());
-		}
-		List<String> workIds = business.work().listWithActivityToken(activityTokens);
-		return business.entityManagerContainer().list(Work.class, workIds);
-	}
-
-	private void retractAsWorkLog(Work work, WorkLog workLog) throws Exception {
-		work.setDestinationActivity(workLog.getFromActivity());
-		work.setDestinationActivityType(workLog.getFromActivityType());
-		work.setActivityToken(workLog.getFromActivityToken());
-		work.setSplitting(workLog.getSplitting());
-		work.setSplitValue(workLog.getSplitValue());
-		work.setSplitToken(workLog.getSplitToken());
-		work.setSplitTokenList(workLog.getSplitTokenList());
-	}
-
-}

+ 18 - 6
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionRollback.java

@@ -14,6 +14,7 @@ import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.tools.PropertyTools;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.ReadCompleted;
 import com.x.processplatform.core.entity.content.Review;
@@ -22,7 +23,9 @@ import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Work;
 import com.x.processplatform.core.entity.content.WorkLog;
 import com.x.processplatform.core.entity.content.WorkStatus;
+import com.x.processplatform.core.entity.element.Activity;
 import com.x.processplatform.core.entity.element.Application;
+import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.Process;
 import com.x.processplatform.core.entity.element.util.WorkLogTree;
 import com.x.processplatform.core.entity.element.util.WorkLogTree.Node;
@@ -72,6 +75,12 @@ class ActionRollback extends BaseAction {
 				throw new ExceptionSplittingNotRollback(work.getId(), workLog.getId());
 			}
 
+			Activity activity = business.element().getActivity(workLog.getFromActivity());
+
+			if (null == activity) {
+				throw new ExceptionActivityNotExist(workLog.getFromActivity());
+			}
+
 			List<WorkLog> workLogs = emc.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, workLog.getJob());
 
 			WorkLogTree workLogTree = new WorkLogTree(workLogs);
@@ -88,7 +97,7 @@ class ActionRollback extends BaseAction {
 			emc.beginTransaction(ReadCompleted.class);
 			emc.beginTransaction(Review.class);
 
-			this.rollbackWork(work, workLog);
+			this.rollbackWork(work, workLog, activity);
 
 			this.disconnectWorkLog(work, workLog);
 
@@ -118,7 +127,7 @@ class ActionRollback extends BaseAction {
 		}
 	}
 
-	private void rollbackWork(Work work, WorkLog workLog) throws Exception {
+	private void rollbackWork(Work work, WorkLog workLog, Activity activity) throws Exception {
 		work.setSplitting(false);
 		work.setActivityName(workLog.getFromActivityName());
 		work.setActivity(workLog.getFromActivity());
@@ -127,6 +136,12 @@ class ActionRollback extends BaseAction {
 		work.setActivityDescription("");
 		work.setActivityToken(workLog.getFromActivityToken());
 		work.setActivityType(workLog.getFromActivityType());
+		/* 清除掉当前的待办人准备重新生成 */
+		work.getManualTaskIdentityList().clear();
+		String formId = PropertyTools.getOrElse(activity, Manual.form_FIELDNAME, String.class, "");
+		if (StringUtils.isNotEmpty(formId)) {
+			work.setForm(formId);
+		}
 		work.setErrorRetry(0);
 		work.setWorkStatus(WorkStatus.processing);
 	}
@@ -160,8 +175,6 @@ class ActionRollback extends BaseAction {
 				MessageFactory.taskCompleted_delete(o);
 			} else {
 				o.setCompleted(false);
-				o.setCompletedTime(null);
-				o.setCompletedTimeMonth("");
 				o.setWorkCompleted("");
 				o.setWork(work.getId());
 			}
@@ -192,8 +205,6 @@ class ActionRollback extends BaseAction {
 				MessageFactory.readCompleted_delete(o);
 			} else {
 				o.setCompleted(false);
-				o.setCompletedTime(null);
-				o.setCompletedTimeMonth("");
 				o.setWorkCompleted("");
 				o.setWork(work.getId());
 			}
@@ -211,6 +222,7 @@ class ActionRollback extends BaseAction {
 					o.setCompleted(false);
 					o.setCompletedTime(null);
 					o.setCompletedTimeMonth("");
+					o.setWorkCompleted("");
 				}
 			}
 		}

+ 13 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ExceptionActivityNotExist.java

@@ -0,0 +1,13 @@
+package com.x.processplatform.service.processing.jaxrs.work;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionActivityNotExist extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionActivityNotExist(String activityId) {
+		super("活动节点不存在:{}.", activityId);
+	}
+
+}

+ 3 - 20
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/WorkAction.java

@@ -1,5 +1,7 @@
 package com.x.processplatform.service.processing.jaxrs.work;
 
+import java.util.List;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -121,25 +123,6 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
 	}
 
-	@JaxrsMethodDescribe(value = "召回,文件往回撤一步.", action = ActionRetract.class)
-	@PUT
-	@Path("{id}/retract/worklog/{workLogId}")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void retract(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
-			@JaxrsParameterDescribe("工作日志标识") @PathParam("workLogId") String workLogId) {
-		ActionResult<ActionRetract.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionRetract().execute(effectivePerson, id, workLogId);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getDefaultActionResultResponse(result));
-	}
-
 	@JaxrsMethodDescribe(value = "指定文件增加一个副本.", action = ActionAddSplit.class)
 	@PUT
 	@Path("{id}/add/split")
@@ -147,7 +130,7 @@ public class WorkAction extends StandardJaxrsAction {
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void addSplit(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id, JsonElement jsonElement) {
-		ActionResult<ActionAddSplit.Wo> result = new ActionResult<>();
+		ActionResult<List<ActionAddSplit.Wo>> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		try {
 			result = new ActionAddSplit().execute(effectivePerson, id, jsonElement);

+ 4 - 6
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/AbstractProcessor.java

@@ -13,8 +13,6 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.scripting.ScriptingEngine;
 import com.x.base.core.project.tools.ListTools;
-import com.x.collaboration.core.message.Collaboration;
-import com.x.collaboration.core.message.notification.ReadMessage;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.Review;
 import com.x.processplatform.core.entity.content.Work;
@@ -102,10 +100,10 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
 			aeiObjects.commit();
 			this.arriveCommitted(aeiObjects);
 			/* 待阅需要在数据提交后再发出提醒 */
-			for (Read read : aeiObjects.getCreateReads()) {
-				ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
-				Collaboration.send(message);
-			}
+//			for (Read read : aeiObjects.getCreateReads()) {
+//				ReadMessage message = new ReadMessage(read.getPerson(), read.getWork(), read.getId());
+//				Collaboration.send(message);
+//			}
 			/* 运行AfterArriveScript时间 */
 			this.callAfterArriveScript(aeiObjects);
 			return work.getId();

+ 15 - 1
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/AeiObjects.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -191,8 +192,13 @@ public class AeiObjects extends GsonPropertyObject {
 
 	public List<WorkLog> getWorkLogs() throws Exception {
 		if (null == this.workLogs) {
-			this.workLogs = this.business.entityManagerContainer().listEqual(WorkLog.class, WorkLog.job_FIELDNAME,
+			List<WorkLog> os = this.business.entityManagerContainer().listEqual(WorkLog.class, WorkLog.job_FIELDNAME,
 					this.work.getJob());
+			/* 保持和前端得到的相同排序 */
+			this.workLogs = os.stream()
+					.sorted(Comparator.comparing(WorkLog::getFromTime, Comparator.nullsLast(Date::compareTo))
+							.thenComparing(WorkLog::getArrivedTime, Comparator.nullsLast(Date::compareTo)))
+					.collect(Collectors.toList());
 		}
 		return this.workLogs;
 	}
@@ -550,6 +556,14 @@ public class AeiObjects extends GsonPropertyObject {
 					MessageFactory.task_create(o);
 					/* 创建待办的参阅 */
 					this.createReview(new Review(this.getWork(), o.getPerson()));
+					/* 创建授权的review */
+					if (StringUtils.isNotEmpty(o.getTrustIdentity())) {
+						String trustPerson = this.business().organization().person()
+								.getWithIdentity(o.getTrustIdentity());
+						if (StringUtils.isNotEmpty(trustPerson)) {
+							this.createReview(new Review(this.getWork(), trustPerson));
+						}
+					}
 				} catch (Exception e) {
 					logger.error(e);
 				}

+ 1 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/TranslateTaskIdentityTools.java

@@ -12,6 +12,7 @@ import com.google.gson.JsonObject;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Trust;
 import com.x.base.core.project.tools.ListTools;
 import com.x.organization.core.express.Organization.ClassifyDistinguishedName;
 import com.x.processplatform.core.entity.content.Data;

+ 85 - 63
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/ManualProcessor.java

@@ -14,15 +14,14 @@ import org.apache.commons.lang3.time.DateUtils;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.config.Config;
-import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Trust;
+import com.x.base.core.project.organization.TrustLog;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.NumberTools;
 import com.x.base.core.project.utils.time.WorkTime;
-import com.x.collaboration.core.message.Collaboration;
-import com.x.collaboration.core.message.notification.TaskMessage;
 import com.x.processplatform.core.entity.content.Hint;
 import com.x.processplatform.core.entity.content.ProcessingType;
 import com.x.processplatform.core.entity.content.Task;
@@ -75,7 +74,6 @@ public class ManualProcessor extends AbstractManualProcessor {
 							manual.getName(), manual.getId());
 				}
 			}
-			identities.add(effectiveCreatorIdentity);
 			aeiObjects.createHint(Hint.EmptyTaskIdentityOnManual(aeiObjects.getWork(), manual));
 		}
 		aeiObjects.getWork().setManualTaskIdentityList(identities);
@@ -156,49 +154,58 @@ public class ManualProcessor extends AbstractManualProcessor {
 		 * TranslateTaskIdentityTools.translate(aeiObjects, manual)
 		 * 将全部重新计算人员,那么重置处理人将被去掉
 		 */
-		List<String> identities = aeiObjects.business().organization().identity()
-				.list(aeiObjects.getWork().getManualTaskIdentityList());
-		if (identities.isEmpty()) {
-			identities = TranslateTaskIdentityTools.translate(aeiObjects, manual);
+		TaskIdentities taskIdentities = new TaskIdentities(
+				aeiObjects.business().organization().identity().list(aeiObjects.getWork().getManualTaskIdentityList()));
+		if (taskIdentities.isEmpty()) {
+			List<String> identities = TranslateTaskIdentityTools.translate(aeiObjects, manual);
+			taskIdentities.addIdentities(identities);
 			logger.info("工作设置的处理人已经全部无效,重新计算当前环节所有处理人进行处理,标题:{}, id:{}, 设置的处理人:{}.", aeiObjects.getWork().getTitle(),
 					aeiObjects.getWork().getId(), identities);
 		}
-		if (identities.isEmpty()) {
+		if (taskIdentities.isEmpty()) {
 			/* 如果活动没有找到任何可用的处理人,那么强制设置处理人为文档创建者,或者配置的 maintenanceIdentity */
 			String effectiveCreatorIdentity = aeiObjects.business().organization().identity()
 					.get(aeiObjects.getWork().getCreatorIdentity());
 			if (StringUtils.isNotEmpty(effectiveCreatorIdentity)) {
 				logger.info("人工活动执行未找到指定的处理身份, 标题:{}, id:{}, 强制指定为工作的创建身份:{}.", aeiObjects.getWork().getTitle(),
 						aeiObjects.getWork().getId(), effectiveCreatorIdentity);
-				identities.add(effectiveCreatorIdentity);
+				taskIdentities.addIdentity(effectiveCreatorIdentity);
 			} else {
 				effectiveCreatorIdentity = aeiObjects.business().organization().identity()
 						.get(Config.processPlatform().getMaintenanceIdentity());
 				if (StringUtils.isNotEmpty(effectiveCreatorIdentity)) {
 					logger.info("人工活动执行未找到指定的处理身份, 标题:{}, id:{}, 强制指定为系统维护身份:{}.", aeiObjects.getWork().getTitle(),
 							aeiObjects.getWork().getId(), effectiveCreatorIdentity);
-					identities.add(effectiveCreatorIdentity);
+					taskIdentities.addIdentity(effectiveCreatorIdentity);
 				} else {
 					throw new ExceptionExpectedEmpty(aeiObjects.getWork().getTitle(), aeiObjects.getWork().getId(),
 							manual.getName(), manual.getId());
 				}
 			}
-			identities.add(effectiveCreatorIdentity);
+			// identities.add(effectiveCreatorIdentity);
 			aeiObjects.createHint(Hint.EmptyTaskIdentityOnManual(aeiObjects.getWork(), manual));
 		}
-		aeiObjects.getWork().setManualTaskIdentityList(identities);
+
+		aeiObjects.getWork().setManualTaskIdentityList(taskIdentities.identities());
+
+		List<Trust> trusts = aeiObjects.business().organization().trust().listWithIdentityObject(
+				aeiObjects.getWork().getApplication(), aeiObjects.getWork().getProcess(),
+				aeiObjects.getWork().getManualTaskIdentityList());
+
+		taskIdentities.update(trusts);
+
 		switch (manual.getManualMode()) {
 		case single:
-			passThrough = this.single(aeiObjects, manual);
+			passThrough = this.single(aeiObjects, manual, taskIdentities);
 			break;
 		case parallel:
-			passThrough = this.parallel(aeiObjects, manual);
+			passThrough = this.parallel(aeiObjects, manual, taskIdentities);
 			break;
 		case queue:
-			passThrough = this.queue(aeiObjects, manual);
+			passThrough = this.queue(aeiObjects, manual, taskIdentities);
 			break;
 		case grab:
-			passThrough = this.single(aeiObjects, manual);
+			passThrough = this.single(aeiObjects, manual, taskIdentities);
 			break;
 		default:
 			throw new ExceptionManualModeError(manual.getId());
@@ -211,11 +218,11 @@ public class ManualProcessor extends AbstractManualProcessor {
 
 	@Override
 	protected void executingCommitted(AeiObjects aeiObjects, Manual manual) throws Exception {
-		for (Task o : aeiObjects.getCreateTasks()) {
-			TaskMessage message = new TaskMessage(o.getPerson(), o.getWork(), o.getId());
-			logger.debug("concrete task message:{}.", XGsonBuilder.toText(message));
-			Collaboration.send(message);
-		}
+//		for (Task o : aeiObjects.getCreateTasks()) {
+//			TaskMessage message = new TaskMessage(o.getPerson(), o.getWork(), o.getId());
+//			logger.debug("concrete task message:{}.", XGsonBuilder.toText(message));
+//			Collaboration.send(message);
+//		}
 	}
 
 	@Override
@@ -276,7 +283,7 @@ public class ManualProcessor extends AbstractManualProcessor {
 		return result;
 	}
 
-	private boolean single(AeiObjects aeiObjects, Manual manual) throws Exception {
+	private boolean single(AeiObjects aeiObjects, Manual manual, TaskIdentities taskIdentities) throws Exception {
 		boolean passThrough = false;
 		/* 找到所有的已办 */
 		Long count = aeiObjects.getTaskCompleteds().stream().filter(o -> {
@@ -299,44 +306,39 @@ public class ManualProcessor extends AbstractManualProcessor {
 			passThrough = true;
 		} else {
 			/* 取到期望的待办人员,由于要进行处理需要转换成可读写List */
-			List<String> expected = this.business().organization().identity()
-					.list(aeiObjects.getWork().getManualTaskIdentityList());
-			if (ListTools.isEmpty(expected)) {
+			if (ListTools.isEmpty(taskIdentities)) {
 				throw new ExceptionExpectedEmpty(aeiObjects.getWork().getTitle(), aeiObjects.getWork().getId(),
 						manual.getName(), manual.getId());
 			}
 			/* 删除多余的待办 */
 			aeiObjects.getTasks().stream()
 					.filter(o -> StringUtils.equals(aeiObjects.getWork().getActivityToken(), o.getActivityToken())
-							&& (!ListTools.contains(expected, o.getIdentity())))
+							&& (!ListTools.contains(taskIdentities.identities(), o.getIdentity())))
 					.forEach(o -> {
 						aeiObjects.deleteTask(o);
 					});
 			/* 将待办已经产生的人从预期值中删除 */
 			aeiObjects.getTasks().stream()
 					.filter(o -> StringUtils.equals(aeiObjects.getWork().getActivityToken(), o.getActivityToken())
-							&& (ListTools.contains(expected, o.getIdentity())))
+							&& (ListTools.contains(taskIdentities.identities(), o.getIdentity())))
 					.forEach(o -> {
-						expected.remove(o.getIdentity());
+						taskIdentities.removeIdentity(o.getIdentity());
 					});
 			/* 这里剩余的应该是没有生成待办的人员 */
-			if (!expected.isEmpty()) {
-				for (String str : expected) {
-					aeiObjects.createTask(this.createTask(aeiObjects, manual, str));
+			if (!taskIdentities.isEmpty()) {
+				for (TaskIdentity taskIdentity : taskIdentities) {
+					aeiObjects.createTask(this.createTask(aeiObjects, manual, taskIdentity));
 				}
 			}
 		}
 		return passThrough;
 	}
 
-	private boolean parallel(AeiObjects aeiObjects, Manual manual) throws Exception {
+	private boolean parallel(AeiObjects aeiObjects, Manual manual, TaskIdentities taskIdentities) throws Exception {
 		boolean passThrough = false;
-		/** 取到期望的待办人员,由于要进行处理需要转换成可读写List */
-		List<String> expected = this.business().organization().identity()
-				.list(aeiObjects.getWork().getManualTaskIdentityList());
 		/** 取得本环节已经处理的已办 */
-		List<TaskCompleted> taskCompleteds = this.listEffectiveTaskCompleted(aeiObjects.getWork());
-		if (ListTools.isEmpty(expected)) {
+		List<TaskCompleted> taskCompleteds = this.listEffectiveTaskCompleted(aeiObjects.getWork(), taskIdentities);
+		if (ListTools.isEmpty(taskIdentities)) {
 			if (ListTools.isNotEmpty(taskCompleteds)) {
 				/** 预计的处理人全部不存在,且已经有人处理过了 */
 				passThrough = true;
@@ -350,16 +352,16 @@ public class ManualProcessor extends AbstractManualProcessor {
 		aeiObjects.getTaskCompleteds().stream().filter(o -> {
 			return StringUtils.equals(aeiObjects.getWork().getActivityToken(), o.getActivityToken());
 		}).forEach(o -> {
-			expected.remove(o.getIdentity());
+			taskIdentities.removeIdentity(o.getIdentity());
 		});
 		/* 清空可能的多余的待办 */
 		aeiObjects.getTasks().stream().filter(o -> {
 			return StringUtils.equals(aeiObjects.getWork().getActivityToken(), o.getActivityToken())
-					&& (!ListTools.contains(expected, o.getIdentity()));
+					&& (!ListTools.contains(taskIdentities.identities(), o.getIdentity()));
 		}).forEach(o -> {
 			aeiObjects.deleteTask(o);
 		});
-		if (expected.isEmpty()) {
+		if (taskIdentities.isEmpty()) {
 			/* 所有人已经处理完成。 */
 			passThrough = true;
 		} else {
@@ -368,38 +370,35 @@ public class ManualProcessor extends AbstractManualProcessor {
 			aeiObjects.getTasks().stream().filter(o -> {
 				return StringUtils.equals(aeiObjects.getWork().getActivityToken(), o.getActivityToken());
 			}).forEach(o -> {
-				expected.remove(o.getIdentity());
+				taskIdentities.removeIdentity(o.getIdentity());
 			});
 			/* 这里剩余的应该是没有生成待办的人员 */
-			if (!expected.isEmpty()) {
-				for (String str : expected) {
-					aeiObjects.createTask(this.createTask(aeiObjects, manual, str));
+			if (!taskIdentities.isEmpty()) {
+				for (TaskIdentity taskIdentity : taskIdentities) {
+					aeiObjects.createTask(this.createTask(aeiObjects, manual, taskIdentity));
 				}
 			}
 		}
 		return passThrough;
 	}
 
-	private boolean queue(AeiObjects aeiObjects, Manual manual) throws Exception {
+	private boolean queue(AeiObjects aeiObjects, Manual manual, TaskIdentities taskIdentities) throws Exception {
 		boolean passThrough = false;
-		/** 取到期望的待办人员,由于要进行处理需要转换成可读写List */
-		List<String> expected = this.business().organization().identity()
-				.list(aeiObjects.getWork().getManualTaskIdentityList());
-		if (expected.isEmpty() || StringUtils.isBlank(StringUtils.join(expected, ""))) {
+		if (taskIdentities.isEmpty()) {
 			throw new ExceptionExpectedEmpty(aeiObjects.getWork().getTitle(), aeiObjects.getWork().getId(),
 					manual.getName(), manual.getId());
 		}
-		List<TaskCompleted> done = this.listEffectiveTaskCompleted(aeiObjects.getWork());
+		List<TaskCompleted> done = this.listEffectiveTaskCompleted(aeiObjects.getWork(), taskIdentities);
 		/** 将已经处理的人从期望值中移除 */
 		for (TaskCompleted o : done) {
-			expected.remove(o.getIdentity());
+			taskIdentities.removeIdentity(o.getIdentity());
 		}
-		if (expected.isEmpty()) {
+		if (taskIdentities.isEmpty()) {
 			/** 所有人已经处理完成。 */
 			passThrough = true;
 		} else {
 			passThrough = false;
-			String next = expected.get(0);
+			TaskIdentity taskIdentity = taskIdentities.get(0);
 			/** 还有人没有处理,开始判断待办,取到本环节的所有待办,理论上只能有一条待办 */
 			List<Task> existed = this.entityManagerContainer().fetch(
 					this.business().task().listWithActivityToken(aeiObjects.getWork().getActivityToken()), Task.class,
@@ -407,7 +406,7 @@ public class ManualProcessor extends AbstractManualProcessor {
 			/** 理论上只能有一条待办 */
 			boolean find = false;
 			for (Task _o : existed) {
-				if (!StringUtils.equals(_o.getIdentity(), next)) {
+				if (!StringUtils.equals(_o.getIdentity(), taskIdentity.getIdentity())) {
 					this.entityManagerContainer().delete(Task.class, _o.getId());
 					MessageFactory.task_delete(_o);
 				} else {
@@ -416,16 +415,16 @@ public class ManualProcessor extends AbstractManualProcessor {
 			}
 			/** 当前处理人没有待办 */
 			if (!find) {
-				aeiObjects.createTask(this.createTask(aeiObjects, manual, next));
+				aeiObjects.createTask(this.createTask(aeiObjects, manual, taskIdentity));
 			}
 		}
 		return passThrough;
 	}
 
 	/** 所有有效的已办,去除 reset,retract */
-	private List<TaskCompleted> listEffectiveTaskCompleted(Work work) throws Exception {
+	private List<TaskCompleted> listEffectiveTaskCompleted(Work work, TaskIdentities taskIdentities) throws Exception {
 		List<String> ids = this.business().taskCompleted().listWithActivityTokenInIdentityList(work.getActivityToken(),
-				work.getManualTaskIdentityList());
+				taskIdentities.identities());
 		List<TaskCompleted> list = new ArrayList<>();
 		for (TaskCompleted o : this.business().entityManagerContainer().list(TaskCompleted.class, ids)) {
 			if ((!o.getProcessingType().equals(ProcessingType.retract))
@@ -557,15 +556,38 @@ public class ManualProcessor extends AbstractManualProcessor {
 		}
 	}
 
-	private Task createTask(AeiObjects aeiObjects, Manual manual, String identity) throws Exception {
-		String person = aeiObjects.business().organization().person().getWithIdentity(identity);
-		String unit = aeiObjects.business().organization().unit().getWithIdentity(identity);
-		Task task = new Task(aeiObjects.getWork(), identity, person, unit, new Date(), null, aeiObjects.getRoutes(),
-				manual.getAllowRapid());
+	private Task createTask(AeiObjects aeiObjects, Manual manual, TaskIdentity taskIdentity) throws Exception {
+		String person = aeiObjects.business().organization().person().getWithIdentity(taskIdentity.getIdentity());
+		String unit = aeiObjects.business().organization().unit().getWithIdentity(taskIdentity.getIdentity());
+		Task task = new Task(aeiObjects.getWork(), taskIdentity.getIdentity(), person, unit,
+				taskIdentity.getFromIdentity(), new Date(), null, aeiObjects.getRoutes(), manual.getAllowRapid());
+		/* 是第一条待办,进行标记 */
+		if (ListTools.isEmpty(aeiObjects.getTaskCompleteds())) {
+			task.setFirst(true);
+		} else {
+			task.setFirst(false);
+		}
 		this.calculateExpire(aeiObjects, manual, task);
+		if (StringUtils.isNotEmpty(taskIdentity.getFromIdentity())) {
+			aeiObjects.business().organization().trustLog()
+					.log(this.createTrustLog(aeiObjects.getWork(), taskIdentity));
+			task.setTrustIdentity(taskIdentity.getFromIdentity());
+		}
 		return task;
 	}
 
+	private TrustLog createTrustLog(Work work, TaskIdentity taskIdentity) {
+		TrustLog trustLog = new TrustLog().setApplication(work.getApplication())
+				.setApplicationAlias(work.getApplicationAlias()).setApplicationName(work.getApplicationName())
+				.setProcess(work.getProcess()).setProcessAlias(work.getProcessAlias())
+				.setProcessName(work.getProcessName()).setTitle(work.getTitle()).setWork(work.getId())
+				.setJob(work.getJob()).setFromIdentity(taskIdentity.getFromIdentity())
+				.setToIdentity(taskIdentity.getIdentity()).setActivity(work.getActivity())
+				.setActivityAlias(work.getActivityAlias()).setActivityName(work.getActivityName())
+				.setTrustTime(new Date());
+		return trustLog;
+	}
+
 	public class ExpireScriptResult {
 		Integer hour;
 		Integer workHour;

+ 78 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TaskIdentities.java

@@ -0,0 +1,78 @@
+package com.x.processplatform.service.processing.processor.manual;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.organization.Trust;
+
+public class TaskIdentities extends ArrayList<TaskIdentity> {
+
+	public TaskIdentities(List<String> list) {
+		for (String str : list) {
+			TaskIdentity taskIdentity = new TaskIdentity();
+			taskIdentity.setIdentity(str);
+			this.add(taskIdentity);
+		}
+	}
+
+	public void update(List<Trust> list) {
+		for (Trust trust : list) {
+			if (StringUtils.isNotEmpty(trust.getFromIdentity()) && StringUtils.isNotEmpty(trust.getToIdentity())) {
+				for (TaskIdentity taskIdentity : this) {
+					if (StringUtils.equals(taskIdentity.getIdentity(), trust.getFromIdentity())) {
+						taskIdentity.setIdentity(trust.getToIdentity());
+						taskIdentity.setFromIdentity(trust.getFromIdentity());
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	public TaskIdentities addIdentity(String str) {
+		if (StringUtils.isNotEmpty(str)) {
+			for (TaskIdentity taskIdentity : this) {
+				if (StringUtils.equals(taskIdentity.getIdentity(), str)) {
+					return this;
+				}
+			}
+			TaskIdentity taskIdentity = new TaskIdentity();
+			taskIdentity.setIdentity(str);
+			this.add(taskIdentity);
+		}
+		return this;
+	}
+
+	public TaskIdentities removeIdentity(String str) {
+		if (StringUtils.isNotEmpty(str)) {
+			for (TaskIdentity taskIdentity : this) {
+				if (StringUtils.equals(taskIdentity.getIdentity(), str)) {
+					this.remove(taskIdentity);
+					return this;
+				}
+			}
+		}
+		return this;
+	}
+
+	public TaskIdentities addIdentities(Collection<String> collections) {
+		for (String str : collections) {
+			this.addIdentity(str);
+		}
+		return this;
+	}
+
+	public List<String> identities() {
+		List<String> list = new ArrayList<>();
+		for (TaskIdentity taskIdentity : this) {
+			list.add(taskIdentity.getIdentity());
+		}
+		return list;
+	}
+
+	private static final long serialVersionUID = -5874962038380255744L;
+
+}

+ 25 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TaskIdentity.java

@@ -0,0 +1,25 @@
+package com.x.processplatform.service.processing.processor.manual;
+
+public   class TaskIdentity {
+
+	private String identity;
+
+	private String fromIdentity;
+
+	public String getIdentity() {
+		return identity;
+	}
+
+	public void setIdentity(String identity) {
+		this.identity = identity;
+	}
+
+	public String getFromIdentity() {
+		return fromIdentity;
+	}
+
+	public void setFromIdentity(String fromIdentity) {
+		this.fromIdentity = fromIdentity;
+	}
+
+}

+ 24 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/manual/TestClient.java

@@ -0,0 +1,24 @@
+package com.x.processplatform.service.processing.processor.manual;
+
+import org.junit.Test;
+
+import com.x.base.core.project.gson.XGsonBuilder;
+import com.x.base.core.project.tools.ListTools;
+
+public class TestClient {
+
+	@Test
+	public void test() {
+
+		TaskIdentities taskIdentities = new TaskIdentities(ListTools.toList("a", "b", "c"));
+
+		taskIdentities.addIdentity("d");
+
+		System.out.println(XGsonBuilder.toJson(taskIdentities));
+
+		taskIdentities.removeIdentity("c");
+
+		System.out.println(XGsonBuilder.toJson(taskIdentities));
+	}
+
+}

+ 17 - 5
o2server/x_processplatform_service_processing/src/main/webapp/jest/describe.js

@@ -1,5 +1,5 @@
 var Describe = function() {
-//20180730
+	// 20180730
 }
 
 Describe.splitValue = function(str) {
@@ -38,7 +38,7 @@ Describe.doPost = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		}).always(function(resultJson) {
 			$('#result').html(JSON.stringify(resultJson, null, 4));
 			Describe.writeOut(m.outs, resultJson);
@@ -55,7 +55,7 @@ Describe.doPost = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		});
 	}
 }
@@ -74,7 +74,7 @@ Describe.doPut = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		}).always(function(resultJson) {
 			$('#result').html(JSON.stringify(resultJson, null, 4));
 			Describe.writeOut(m.outs, resultJson);
@@ -91,7 +91,7 @@ Describe.doPut = function(address, m, data) {
 			xhrFields : {
 				'withCredentials' : true
 			},
-			data : ((m.contentType.indexOf('application/json') > -1) ? JSON.stringify(data) : data)
+			data : ((m.contentType.indexOf('application/json') > -1) && (!m.useStringParameter) ? JSON.stringify(data) : data)
 		});
 	}
 }
@@ -269,6 +269,14 @@ Describe.prototype = {
 									txt += '</table>';
 									txt += '</fieldset>';
 								}
+								if (m.useStringParameter) {
+									txt += '<fieldset><legend>String</legend>';
+									txt += '<table><tr><td>';
+									txt += '<textarea id="string" style="height:300px; width:600px; padding:1px; border:1px #000000 solid"/>';
+									txt += '</td><td>string</td></tr>';
+									txt += '</table>';
+									txt += '</fieldset>';
+								}
 								if (m.outs && m.outs.length > 0) {
 									txt += '<fieldset id="outs"><legend>Out</legend>';
 									txt += '<table>';
@@ -318,6 +326,8 @@ Describe.prototype = {
 												});
 											} else if (m.useJsonElementParameter) {
 												data = $.parseJSON($('#jsonElement').val());
+											} else if (m.useStringParameter) {
+												data = $('#string').val();
 											}
 											Describe.doPost(address, m, data);
 											break;
@@ -340,6 +350,8 @@ Describe.prototype = {
 												});
 											} else if (m.useJsonElementParameter) {
 												data = $.parseJSON($('#jsonElement').val());
+											} else if (m.useStringParameter) {
+												data = $('#string').val();
 											}
 											Describe.doPut(address, m, data);
 											break;