Ver Fonte

修改多线程的entityManagerContainer

zhourui há 5 anos atrás
pai
commit
a6a1fae0df
31 ficheiros alterados com 2295 adições e 2313 exclusões
  1. 48 54
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionListWithWorkOrWorkCompleted.java
  2. 33 34
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/control/ActionGetWorkOrWorkCompleted.java
  3. 62 52
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2Get.java
  4. 63 52
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2GetMobile.java
  5. 98 81
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2LookupWorkOrWorkCompleted.java
  6. 101 83
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2LookupWorkOrWorkCompletedMobile.java
  7. 41 42
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/ActionListWithWorkOrWorkCompleted.java
  8. 46 48
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/ActionListWithWorkOrWorkCompletedPaging.java
  9. 54 54
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplex.java
  10. 54 54
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexAppointForm.java
  11. 54 54
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexAppointFormMobile.java
  12. 55 55
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexMobile.java
  13. 59 57
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCountWithPerson.java
  14. 77 76
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionGetWithWorkOrWorkCompleted.java
  15. 6 8
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionRefer.java
  16. 293 305
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/BaseAction.java
  17. 86 83
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/V2GetWorkOrWorkCompleted.java
  18. 90 90
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/WorkAction.java
  19. 49 49
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplex.java
  20. 49 49
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexAppointForm.java
  21. 48 48
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexAppointFormMobile.java
  22. 49 49
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexMobile.java
  23. 81 81
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageGetAssignment.java
  24. 192 204
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/BaseAction.java
  25. 49 83
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/WorkCompletedAction.java
  26. 26 28
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListRollbackWithWorkOrWorkCompleted.java
  27. 49 52
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListWithJob.java
  28. 105 106
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListWithWorkOrWorkCompleted.java
  29. 21 19
      o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/CmsPlan.java
  30. 225 234
      o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/Plan.java
  31. 32 29
      o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/ProcessPlatformPlan.java

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

@@ -29,65 +29,59 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionListWithWorkOrWorkCompleted.class);
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
-
-			Business business = new Business(emc);
-			CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
-				List<Wo> wos = new ArrayList<>();
-				try {
-					List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
-					List<String> units = business.organization().unit().listWithPerson(effectivePerson);
-					final String job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
-					for (Attachment attachment : this.list(business, job)) {
-						Wo wo = Wo.copier.copy(attachment);
-						boolean canControl = this.control(attachment, effectivePerson, identities, units, business);
-						boolean canEdit = this.edit(attachment, effectivePerson, identities, units, business);
-						boolean canRead = this.read(attachment, effectivePerson, identities, units, business);
-						if (canRead) {
-							wo.getControl().setAllowRead(true);
-							wo.getControl().setAllowEdit(canEdit);
-							wo.getControl().setAllowControl(canControl);
-							wos.add(wo);
-						}
+
+		ActionResult<List<Wo>> result = new ActionResult<>();
+
+		CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
+			List<Wo> wos = new ArrayList<>();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
+				List<String> units = business.organization().unit().listWithPerson(effectivePerson);
+				final String job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
+				for (Attachment attachment : business.entityManagerContainer().listEqual(Attachment.class,
+						Attachment.job_FIELDNAME, job)) {
+					Wo wo = Wo.copier.copy(attachment);
+					boolean canControl = this.control(attachment, effectivePerson, identities, units, business);
+					boolean canEdit = this.edit(attachment, effectivePerson, identities, units, business);
+					boolean canRead = this.read(attachment, effectivePerson, identities, units, business);
+					if (canRead) {
+						wo.getControl().setAllowRead(true);
+						wo.getControl().setAllowEdit(canEdit);
+						wo.getControl().setAllowControl(canControl);
+						wos.add(wo);
 					}
-					wos = wos
-							.stream().sorted(
-									Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
-											.thenComparing(Comparator.comparing(Wo::getCreateTime,
-													Comparator.nullsLast(Date::compareTo))))
-							.collect(Collectors.toList());
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				return wos;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+				wos = wos.stream()
+						.sorted(Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+								.thenComparing(
+										Comparator.comparing(Wo::getCreateTime, Comparator.nullsLast(Date::compareTo))))
+						.collect(Collectors.toList());
+			} catch (Exception e) {
+				logger.error(e);
 			}
+			return wos;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return value;
+		});
 
-			result.setData(_wos.get());
-
-			return result;
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
-	}
 
-	private List<Attachment> list(Business business, String job) throws Exception {
-		List<Attachment> os = business.entityManagerContainer().listEqual(Attachment.class, Attachment.job_FIELDNAME,
-				job);
-		return os;
+		result.setData(_wos.get());
+
+		return result;
 	}
 
 	public static class Wo extends Attachment {
@@ -110,7 +104,7 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 	}
 
 	public static class WoControl extends GsonPropertyObject {
-
+		private static final long serialVersionUID = -7283783148043076205L;
 		private Boolean allowRead = false;
 		private Boolean allowEdit = false;
 		private Boolean allowControl = false;

+ 33 - 34
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/control/ActionGetWorkOrWorkCompleted.java

@@ -46,45 +46,44 @@ class ActionGetWorkOrWorkCompleted extends BaseAction {
 	private Map<String, Boolean> hasTaskCompletedWithActivityToken = new HashMap<>();
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
-				Wo wo = null;
-				try {
-					Work work = emc.find(workOrWorkCompleted, Work.class);
-					if (null != work) {
-						wo = this.work(business, effectivePerson, work);
-					} else {
-						WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
-						if (null != workCompleted) {
-							wo = this.workCompleted(business, effectivePerson, workCompleted);
-						}
+		ActionResult<Wo> result = new ActionResult<>();
+		CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
+			Wo wo = null;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				Work work = emc.find(workOrWorkCompleted, Work.class);
+				if (null != work) {
+					wo = this.work(business, effectivePerson, work);
+				} else {
+					WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+					if (null != workCompleted) {
+						wo = this.workCompleted(business, effectivePerson, workCompleted);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return wo;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+			} catch (Exception e) {
+				logger.error(e);
 			}
+			return wo;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return value;
+		});
 
-			result.setData(_wo.get());
-			return result;
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
+
+		result.setData(_wo.get());
+		return result;
 	}
 
 	private Wo workCompleted(Business business, EffectivePerson effectivePerson, WorkCompleted workCompleted)

+ 62 - 52
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2Get.java

@@ -15,11 +15,13 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties.RelatedForm;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties.RelatedScript;
 import com.x.processplatform.core.entity.element.Form;
+import com.x.processplatform.core.entity.element.FormProperties;
 import com.x.processplatform.core.entity.element.Script;
 
 class V2Get extends BaseAction {
@@ -27,77 +29,85 @@ class V2Get extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(V2Get.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			CacheKey cacheKey = new CacheKey(this.getClass(), id);
-			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
-			if (optional.isPresent()) {
-				result.setData((Wo) optional.get());
-			} else {
-				Wo wo = this.get(business, id);
-				CacheManager.put(cacheCategory, cacheKey, wo);
-				result.setData(wo);
-			}
-			return result;
+		ActionResult<Wo> result = new ActionResult<>();
+		CacheKey cacheKey = new CacheKey(this.getClass(), id);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			result.setData((Wo) optional.get());
+		} else {
+			Wo wo = this.get(id);
+			CacheManager.put(cacheCategory, cacheKey, wo);
+			result.setData(wo);
 		}
+		return result;
 	}
 
-	private Wo get(Business business, String id) throws Exception {
-		Form form = business.form().pick(id);
+	private Wo get(String id) throws Exception {
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(id);
+		}
 		if (null == form) {
 			throw new ExceptionEntityNotExist(id, Form.class);
 		}
 		Wo wo = new Wo();
+		final FormProperties properties = form.getProperties();
 		wo.setFastETag(form.getId() + form.getUpdateTime().getTime());
 		wo.setForm(new RelatedForm(form, form.getDataOrMobileData()));
 		CompletableFuture<Map<String, RelatedForm>> _relatedForm = CompletableFuture.supplyAsync(() -> {
-			Map<String, RelatedForm> map = new TreeMap<String, RelatedForm>();
-			try {
-				Form _f;
-				for (String _id : form.getProperties().getRelatedFormList()) {
-					_f = business.form().pick(_id);
-					if (null != _f) {
-						map.put(_id, new RelatedForm(_f, _f.getDataOrMobileData()));
+			Map<String, RelatedForm> map = new TreeMap<>();
+			if (ListTools.isNotEmpty(properties.getRelatedFormList())) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					Form _f;
+					for (String _id : properties.getRelatedFormList()) {
+						_f = bus.form().pick(_id);
+						if (null != _f) {
+							map.put(_id, new RelatedForm(_f, _f.getDataOrMobileData()));
+						}
 					}
+				} catch (Exception e) {
+					logger.error(e);
 				}
-			} catch (Exception e) {
-				logger.error(e);
 			}
 			return map;
 		});
 		CompletableFuture<Map<String, RelatedScript>> _relatedScript = CompletableFuture.supplyAsync(() -> {
-			Map<String, RelatedScript> map = new TreeMap<String, RelatedScript>();
-			try {
-				for (Entry<String, String> entry : form.getProperties().getRelatedScriptMap().entrySet()) {
-					switch (entry.getValue()) {
-					case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
-						Script _pp = business.script().pick(entry.getKey());
-						if (null != _pp) {
-							map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
-									_pp.getText(), entry.getValue()));
-						}
-						break;
-					case WorkCompletedProperties.RelatedScript.TYPE_CMS:
-						com.x.cms.core.entity.element.Script _cms = business.cms().script().pick(entry.getKey());
-						if (null != _cms) {
-							map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
-									_cms.getText(), entry.getValue()));
-						}
-						break;
-					case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
-						com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
-						if (null != _p) {
-							map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
-									_p.getText(), entry.getValue()));
+			Map<String, RelatedScript> map = new TreeMap<>();
+			if ((null != properties.getRelatedScriptMap()) && (properties.getRelatedScriptMap().size() > 0)) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					for (Entry<String, String> entry : properties.getRelatedScriptMap().entrySet()) {
+						switch (entry.getValue()) {
+						case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
+							Script _pp = bus.script().pick(entry.getKey());
+							if (null != _pp) {
+								map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
+										_pp.getText(), entry.getValue()));
+							}
+							break;
+						case WorkCompletedProperties.RelatedScript.TYPE_CMS:
+							com.x.cms.core.entity.element.Script _cms = bus.cms().script().pick(entry.getKey());
+							if (null != _cms) {
+								map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
+										_cms.getText(), entry.getValue()));
+							}
+							break;
+						case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
+							com.x.portal.core.entity.Script _p = bus.portal().script().pick(entry.getKey());
+							if (null != _p) {
+								map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
+										_p.getText(), entry.getValue()));
+							}
+							break;
+						default:
+							break;
 						}
-						break;
-					default:
-						break;
 					}
+				} catch (Exception e) {
+					logger.error(e);
 				}
-			} catch (Exception e) {
-				logger.error(e);
 			}
 			return map;
 		});

+ 63 - 52
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2GetMobile.java

@@ -15,11 +15,13 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties.RelatedForm;
 import com.x.processplatform.core.entity.content.WorkCompletedProperties.RelatedScript;
 import com.x.processplatform.core.entity.element.Form;
+import com.x.processplatform.core.entity.element.FormProperties;
 import com.x.processplatform.core.entity.element.Script;
 
 class V2GetMobile extends BaseAction {
@@ -27,77 +29,86 @@ class V2GetMobile extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(V2GetMobile.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			CacheKey cacheKey = new CacheKey(this.getClass(), id);
-			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
-			if (optional.isPresent()) {
-				result.setData((Wo) optional.get());
-			} else {
-				Wo wo = this.get(business, id);
-				CacheManager.put(cacheCategory, cacheKey, wo);
-				result.setData(wo);
-			}
-			return result;
+		ActionResult<Wo> result = new ActionResult<>();
+		CacheKey cacheKey = new CacheKey(this.getClass(), id);
+		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
+		if (optional.isPresent()) {
+			result.setData((Wo) optional.get());
+		} else {
+			Wo wo = this.get(id);
+			CacheManager.put(cacheCategory, cacheKey, wo);
+			result.setData(wo);
 		}
+		return result;
 	}
 
-	private Wo get(Business business, String id) throws Exception {
-		Form form = business.form().pick(id);
+	private Wo get(String id) throws Exception {
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(id);
+		}
 		if (null == form) {
 			throw new ExceptionEntityNotExist(id, Form.class);
 		}
 		Wo wo = new Wo();
+		final FormProperties properties = form.getProperties();
 		wo.setFastETag(form.getId() + form.getUpdateTime().getTime());
 		wo.setForm(new RelatedForm(form, form.getMobileDataOrData()));
 		CompletableFuture<Map<String, RelatedForm>> _relatedForm = CompletableFuture.supplyAsync(() -> {
-			Map<String, RelatedForm> map = new TreeMap<String, RelatedForm>();
-			try {
-				Form _f;
-				for (String _id : form.getProperties().getMobileRelatedFormList()) {
-					_f = business.form().pick(_id);
-					if (null != _f) {
-						map.put(_id, new RelatedForm(_f, _f.getMobileDataOrData()));
+			Map<String, RelatedForm> map = new TreeMap<>();
+			if (ListTools.isNotEmpty(properties.getMobileRelatedFormList())) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					Form _f;
+					for (String _id : properties.getMobileRelatedFormList()) {
+						_f = bus.form().pick(_id);
+						if (null != _f) {
+							map.put(_id, new RelatedForm(_f, _f.getMobileDataOrData()));
+						}
 					}
+				} catch (Exception e) {
+					logger.error(e);
 				}
-			} catch (Exception e) {
-				logger.error(e);
 			}
 			return map;
 		});
 		CompletableFuture<Map<String, RelatedScript>> _relatedScript = CompletableFuture.supplyAsync(() -> {
-			Map<String, RelatedScript> map = new TreeMap<String, RelatedScript>();
-			try {
-				for (Entry<String, String> entry : form.getProperties().getMobileRelatedScriptMap().entrySet()) {
-					switch (entry.getValue()) {
-					case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
-						Script _pp = business.script().pick(entry.getKey());
-						if (null != _pp) {
-							map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
-									_pp.getText(), entry.getValue()));
-						}
-						break;
-					case WorkCompletedProperties.RelatedScript.TYPE_CMS:
-						com.x.cms.core.entity.element.Script _cms = business.cms().script().pick(entry.getKey());
-						if (null != _cms) {
-							map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
-									_cms.getText(), entry.getValue()));
-						}
-						break;
-					case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
-						com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
-						if (null != _p) {
-							map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
-									_p.getText(), entry.getValue()));
+			Map<String, RelatedScript> map = new TreeMap<>();
+			if ((null != properties.getMobileRelatedScriptMap())
+					&& (properties.getMobileRelatedScriptMap().size() > 0)) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					Business bus = new Business(emc);
+					for (Entry<String, String> entry : properties.getMobileRelatedScriptMap().entrySet()) {
+						switch (entry.getValue()) {
+						case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
+							Script _pp = bus.script().pick(entry.getKey());
+							if (null != _pp) {
+								map.put(entry.getKey(), new RelatedScript(_pp.getId(), _pp.getName(), _pp.getAlias(),
+										_pp.getText(), entry.getValue()));
+							}
+							break;
+						case WorkCompletedProperties.RelatedScript.TYPE_CMS:
+							com.x.cms.core.entity.element.Script _cms = bus.cms().script().pick(entry.getKey());
+							if (null != _cms) {
+								map.put(entry.getKey(), new RelatedScript(_cms.getId(), _cms.getName(), _cms.getAlias(),
+										_cms.getText(), entry.getValue()));
+							}
+							break;
+						case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
+							com.x.portal.core.entity.Script _p = bus.portal().script().pick(entry.getKey());
+							if (null != _p) {
+								map.put(entry.getKey(), new RelatedScript(_p.getId(), _p.getName(), _p.getAlias(),
+										_p.getText(), entry.getValue()));
+							}
+							break;
+						default:
+							break;
 						}
-						break;
-					default:
-						break;
 					}
+				} catch (Exception e) {
+					logger.error(e);
 				}
-			} catch (Exception e) {
-				logger.error(e);
 			}
 			return map;
 		});

+ 98 - 81
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2LookupWorkOrWorkCompleted.java

@@ -37,67 +37,72 @@ class V2LookupWorkOrWorkCompleted extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(V2LookupWorkOrWorkCompleted.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-					new ExceptionEntityNotExist(workOrWorkCompleted))) {
-				throw new ExceptionAccessDenied(effectivePerson);
-			}
 
-			CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
-				Wo wo = new Wo();
-				try {
-					Work work = emc.fetch(workOrWorkCompleted, Work.class, ListTools.toList(JpaObject.id_FIELDNAME,
+		ActionResult<Wo> result = new ActionResult<>();
+
+		CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
+			Wo wo = new Wo();
+			try {
+				Work work = null;
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					work = emc.fetch(workOrWorkCompleted, Work.class, ListTools.toList(JpaObject.id_FIELDNAME,
 							Work.form_FIELDNAME, Work.activity_FIELDNAME, Work.activityType_FIELDNAME));
-					if (null != work) {
-						wo = this.work(business, work);
-					} else {
-						WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
-						if (null != workCompleted) {
-							wo = this.workCompleted(business, workCompleted);
-						}
-					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return wo;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
+				if (null != work) {
+					wo = this.work(work);
+				} else {
+					WorkCompleted workCompleted = null;
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+					}
+					if (null != workCompleted) {
+						wo = this.workCompleted(workCompleted);
+					}
 				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+			} catch (Exception e) {
+				logger.error(e);
 			}
-			result.setData(_wo.get());
-			return result;
+			return wo;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return value;
+		});
+
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
+		result.setData(_wo.get());
+		return result;
 	}
 
-	private Wo work(Business business, Work work) throws Exception {
-		Form form = business.form().pick(work.getForm());
-		if (null == form) {
-			Activity activity = business.getActivity(work);
-			if (null != activity) {
-				form = business.form().pick(activity.getForm());
+	private Wo work(Work work) throws Exception {
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(work.getForm());
+			if (null == form) {
+				Activity activity = business.getActivity(work);
+				if (null != activity) {
+					form = business.form().pick(activity.getForm());
+				}
 			}
 		}
 		if (null != form) {
-			return this.get(business, form);
+			return this.get(form);
 		}
 		return new Wo();
 	}
 
-	private Wo get(Business business, Form form) throws Exception {
+	private Wo get(Form form) throws Exception {
 		CacheKey cacheKey = new CacheKey(this.getClass(), form.getId());
 		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
 		if (optional.isPresent()) {
@@ -105,46 +110,54 @@ class V2LookupWorkOrWorkCompleted extends BaseAction {
 		} else {
 			List<String> list = new CopyOnWriteArrayList<>();
 			CompletableFuture<Void> _relatedForm = CompletableFuture.runAsync(() -> {
-				try {
-					Form _f;
-					for (String _id : form.getProperties().getRelatedFormList()) {
-						_f = business.form().pick(_id);
-						if (null != _f) {
-							list.add(_f.getId() + _f.getUpdateTime().getTime());
+				if (ListTools.isNotEmpty(form.getProperties().getRelatedFormList())) {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						Business business = new Business(emc);
+						Form _f;
+						for (String _id : form.getProperties().getRelatedFormList()) {
+							_f = business.form().pick(_id);
+							if (null != _f) {
+								list.add(_f.getId() + _f.getUpdateTime().getTime());
+							}
 						}
+					} catch (Exception e) {
+						logger.error(e);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
 			});
 			CompletableFuture<Void> _relatedScript = CompletableFuture.runAsync(() -> {
-				try {
-					for (Entry<String, String> entry : form.getProperties().getRelatedScriptMap().entrySet()) {
-						switch (entry.getValue()) {
-						case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
-							Script _pp = business.script().pick(entry.getKey());
-							if (null != _pp) {
-								list.add(_pp.getId() + _pp.getUpdateTime().getTime());
-							}
-							break;
-						case WorkCompletedProperties.RelatedScript.TYPE_CMS:
-							com.x.cms.core.entity.element.Script _cms = business.cms().script().pick(entry.getKey());
-							if (null != _cms) {
-								list.add(_cms.getId() + _cms.getUpdateTime().getTime());
-							}
-							break;
-						case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
-							com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
-							if (null != _p) {
-								list.add(_p.getId() + _p.getUpdateTime().getTime());
+				if ((null != form.getProperties().getRelatedScriptMap())
+						&& (form.getProperties().getRelatedScriptMap().size() > 0)) {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						Business business = new Business(emc);
+						for (Entry<String, String> entry : form.getProperties().getRelatedScriptMap().entrySet()) {
+							switch (entry.getValue()) {
+							case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
+								Script _pp = business.script().pick(entry.getKey());
+								if (null != _pp) {
+									list.add(_pp.getId() + _pp.getUpdateTime().getTime());
+								}
+								break;
+							case WorkCompletedProperties.RelatedScript.TYPE_CMS:
+								com.x.cms.core.entity.element.Script _cms = business.cms().script()
+										.pick(entry.getKey());
+								if (null != _cms) {
+									list.add(_cms.getId() + _cms.getUpdateTime().getTime());
+								}
+								break;
+							case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
+								com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
+								if (null != _p) {
+									list.add(_p.getId() + _p.getUpdateTime().getTime());
+								}
+								break;
+							default:
+								break;
 							}
-							break;
-						default:
-							break;
 						}
+					} catch (Exception e) {
+						logger.error(e);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
 			});
 			_relatedForm.get();
@@ -159,12 +172,16 @@ class V2LookupWorkOrWorkCompleted extends BaseAction {
 		}
 	}
 
-	private Wo workCompleted(Business business, WorkCompleted workCompleted) throws Exception {
+	private Wo workCompleted(WorkCompleted workCompleted) throws Exception {
 		// 先使用当前库的表单,如果不存在使用储存的表单.
 		Wo wo = new Wo();
-		Form form = business.form().pick(workCompleted.getForm());
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(workCompleted.getForm());
+		}
 		if (null != form) {
-			return this.get(business, form);
+			return this.get(form);
 		} else if (null != workCompleted.getProperties().getStoreForm()) {
 			StoreForm storeForm = workCompleted.getProperties().getStoreForm();
 			wo = XGsonBuilder.convert(storeForm, Wo.class);

+ 101 - 83
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/form/V2LookupWorkOrWorkCompletedMobile.java

@@ -37,67 +37,72 @@ class V2LookupWorkOrWorkCompletedMobile extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(V2LookupWorkOrWorkCompletedMobile.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-					new ExceptionEntityNotExist(workOrWorkCompleted))) {
-				throw new ExceptionAccessDenied(effectivePerson);
-			}
 
-			CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
-				Wo wo = new Wo();
-				try {
-					Work work = emc.fetch(workOrWorkCompleted, Work.class, ListTools.toList(JpaObject.id_FIELDNAME,
+		ActionResult<Wo> result = new ActionResult<>();
+
+		CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
+			Wo wo = new Wo();
+			try {
+				Work work = null;
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					work = emc.fetch(workOrWorkCompleted, Work.class, ListTools.toList(JpaObject.id_FIELDNAME,
 							Work.form_FIELDNAME, Work.activity_FIELDNAME, Work.activityType_FIELDNAME));
-					if (null != work) {
-						wo = this.work(business, work);
-					} else {
-						WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
-						if (null != workCompleted) {
-							wo = this.workCompleted(business, workCompleted);
-						}
-					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return wo;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
+				if (null != work) {
+					wo = this.work(work);
+				} else {
+					WorkCompleted workCompleted = null;
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+					}
+					if (null != workCompleted) {
+						wo = this.workCompleted(workCompleted);
+					}
 				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+			} catch (Exception e) {
+				logger.error(e);
 			}
-			result.setData(_wo.get());
-			return result;
+			return wo;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return value;
+		});
+
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
+		result.setData(_wo.get());
+		return result;
 	}
 
-	private Wo work(Business business, Work work) throws Exception {
-		Form form = business.form().pick(work.getForm());
-		if (null == form) {
-			Activity activity = business.getActivity(work);
-			if (null != activity) {
-				form = business.form().pick(activity.getForm());
+	private Wo work(Work work) throws Exception {
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(work.getForm());
+			if (null == form) {
+				Activity activity = business.getActivity(work);
+				if (null != activity) {
+					form = business.form().pick(activity.getForm());
+				}
 			}
 		}
 		if (null != form) {
-			return this.get(business, form);
+			return this.get(form);
 		}
 		return new Wo();
 	}
 
-	private Wo get(Business business, Form form) throws Exception {
+	private Wo get(Form form) throws Exception {
 		CacheKey cacheKey = new CacheKey(this.getClass(), form.getId());
 		Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
 		if (optional.isPresent()) {
@@ -105,46 +110,55 @@ class V2LookupWorkOrWorkCompletedMobile extends BaseAction {
 		} else {
 			List<String> list = new CopyOnWriteArrayList<>();
 			CompletableFuture<Void> _relatedForm = CompletableFuture.runAsync(() -> {
-				try {
-					Form _f;
-					for (String _id : form.getProperties().getMobileRelatedFormList()) {
-						_f = business.form().pick(_id);
-						if (null != _f) {
-							list.add(_f.getId() + _f.getUpdateTime().getTime());
+				if (ListTools.isNotEmpty(form.getProperties().getMobileRelatedFormList())) {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						Business business = new Business(emc);
+						Form _f;
+						for (String _id : form.getProperties().getMobileRelatedFormList()) {
+							_f = business.form().pick(_id);
+							if (null != _f) {
+								list.add(_f.getId() + _f.getUpdateTime().getTime());
+							}
 						}
+					} catch (Exception e) {
+						logger.error(e);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
 			});
 			CompletableFuture<Void> _relatedScript = CompletableFuture.runAsync(() -> {
-				try {
-					for (Entry<String, String> entry : form.getProperties().getMobileRelatedScriptMap().entrySet()) {
-						switch (entry.getValue()) {
-						case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
-							Script _pp = business.script().pick(entry.getKey());
-							if (null != _pp) {
-								list.add(_pp.getId() + _pp.getUpdateTime().getTime());
-							}
-							break;
-						case WorkCompletedProperties.RelatedScript.TYPE_CMS:
-							com.x.cms.core.entity.element.Script _cms = business.cms().script().pick(entry.getKey());
-							if (null != _cms) {
-								list.add(_cms.getId() + _cms.getUpdateTime().getTime());
-							}
-							break;
-						case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
-							com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
-							if (null != _p) {
-								list.add(_p.getId() + _p.getUpdateTime().getTime());
+				if ((null != form.getProperties().getMobileRelatedScriptMap())
+						&& (form.getProperties().getMobileRelatedScriptMap().size() > 0)) {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						Business business = new Business(emc);
+						for (Entry<String, String> entry : form.getProperties().getMobileRelatedScriptMap()
+								.entrySet()) {
+							switch (entry.getValue()) {
+							case WorkCompletedProperties.RelatedScript.TYPE_PROCESSPLATFORM:
+								Script _pp = business.script().pick(entry.getKey());
+								if (null != _pp) {
+									list.add(_pp.getId() + _pp.getUpdateTime().getTime());
+								}
+								break;
+							case WorkCompletedProperties.RelatedScript.TYPE_CMS:
+								com.x.cms.core.entity.element.Script _cms = business.cms().script()
+										.pick(entry.getKey());
+								if (null != _cms) {
+									list.add(_cms.getId() + _cms.getUpdateTime().getTime());
+								}
+								break;
+							case WorkCompletedProperties.RelatedScript.TYPE_PORTAL:
+								com.x.portal.core.entity.Script _p = business.portal().script().pick(entry.getKey());
+								if (null != _p) {
+									list.add(_p.getId() + _p.getUpdateTime().getTime());
+								}
+								break;
+							default:
+								break;
 							}
-							break;
-						default:
-							break;
 						}
+					} catch (Exception e) {
+						logger.error(e);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
 			});
 			_relatedForm.get();
@@ -159,14 +173,18 @@ class V2LookupWorkOrWorkCompletedMobile extends BaseAction {
 		}
 	}
 
-	private Wo workCompleted(Business business, WorkCompleted workCompleted) throws Exception {
+	private Wo workCompleted(WorkCompleted workCompleted) throws Exception {
 		// 先使用当前库的表单,如果不存在使用储存的表单.
 		Wo wo = new Wo();
-		Form form = business.form().pick(workCompleted.getForm());
+		Form form = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			form = business.form().pick(workCompleted.getForm());
+		}
 		if (null != form) {
-			return this.get(business, form);
-		} else if (null != workCompleted.getProperties().getStoreForm()) {
-			StoreForm storeForm = workCompleted.getProperties().getStoreForm();
+			return this.get(form);
+		} else if (null != workCompleted.getProperties().getStoreFormMobile()) {
+			StoreForm storeForm = workCompleted.getProperties().getStoreFormMobile();
 			wo = XGsonBuilder.convert(storeForm, Wo.class);
 		}
 		return wo;

+ 41 - 42
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/ActionListWithWorkOrWorkCompleted.java

@@ -30,56 +30,55 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionListWithWorkOrWorkCompleted.class);
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
-			Business business = new Business(emc);
-			CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
-				List<Wo> wos = new ArrayList<>();
-				try {
-					String job = business.job().findWithWork(workOrWorkCompleted);
-					if (null != job) {
-						wos = emc.fetchEqual(Record.class, Wo.copier, Record.job_FIELDNAME, job);
+
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
+			List<Wo> wos = new ArrayList<>();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				String job = business.job().findWithWork(workOrWorkCompleted);
+				if (null != job) {
+					wos = emc.fetchEqual(Record.class, Wo.copier, Record.job_FIELDNAME, job);
+				} else {
+					job = business.job().findWithWorkCompleted(workOrWorkCompleted);
+					WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, job);
+					if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
+						wos = Wo.copier.copy(workCompleted.getProperties().getRecordList());
 					} else {
-						job = business.job().findWithWorkCompleted(workOrWorkCompleted);
-						WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME,
-								job);
-						if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
-							wos = Wo.copier.copy(workCompleted.getProperties().getRecordList());
-						} else {
-							wos = emc.fetchEqual(Record.class, Wo.copier, Record.job_FIELDNAME, job);
-						}
-					}
-					wos = wos.stream().sorted(Comparator.comparing(Wo::getOrder)).collect(Collectors.toList());
-					for (Task task : emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
-							.sorted(Comparator.comparing(Task::getStartTime)).collect(Collectors.toList())) {
-						Record record = this.taskToRecord(task);
-						wos.add(Wo.copier.copy(record));
+						wos = emc.fetchEqual(Record.class, Wo.copier, Record.job_FIELDNAME, job);
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return wos;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
+				wos = wos.stream().sorted(Comparator.comparing(Wo::getOrder)).collect(Collectors.toList());
+				for (Task task : emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
+						.sorted(Comparator.comparing(Task::getStartTime)).collect(Collectors.toList())) {
+					Record record = this.taskToRecord(task);
+					wos.add(Wo.copier.copy(record));
 				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return wos;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
 			}
+			return value;
+		});
 
-			result.setData(_wos.get());
-			return result;
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
 
+		result.setData(_wos.get());
+		return result;
+
 	}
 
 	private Record taskToRecord(Task task) {

+ 46 - 48
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/ActionListWithWorkOrWorkCompletedPaging.java

@@ -31,64 +31,62 @@ class ActionListWithWorkOrWorkCompletedPaging extends BaseAction {
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted, Integer page,
 			Integer size) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
 
-			Business business = new Business(emc);
-
-			CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
-				List<Wo> wos = new ArrayList<>();
-				try {
-					String job = business.job().findWithWork(workOrWorkCompleted);
-					if (null != job) {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+
+		CompletableFuture<List<Wo>> _wos = CompletableFuture.supplyAsync(() -> {
+			List<Wo> wos = new ArrayList<>();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				String job = business.job().findWithWork(workOrWorkCompleted);
+				if (null != job) {
+					wos = emc.fetchEqualAscPaging(Record.class, Wo.copier, Record.job_FIELDNAME, job, page, size,
+							Record.order_FIELDNAME);
+				} else {
+					job = business.job().findWithWorkCompleted(workOrWorkCompleted);
+					WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, job);
+					if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
+						List<Record> os = workCompleted.getProperties().getRecordList();
+						int start = (page - 1) * size;
+						start = Math.min(start, os.size());
+						wos = Wo.copier.copy(os.stream().sorted(Comparator.comparing(Record::getOrder)).skip(start)
+								.limit(size).collect(Collectors.toList()));
+					} else {
 						wos = emc.fetchEqualAscPaging(Record.class, Wo.copier, Record.job_FIELDNAME, job, page, size,
 								Record.order_FIELDNAME);
-					} else {
-						job = business.job().findWithWorkCompleted(workOrWorkCompleted);
-						WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME,
-								job);
-						if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
-							List<Record> os = workCompleted.getProperties().getRecordList();
-							int start = (page - 1) * size;
-							start = Math.min(start, os.size());
-							wos = Wo.copier.copy(os.stream().sorted(Comparator.comparing(Record::getOrder)).skip(start)
-									.limit(size).collect(Collectors.toList()));
-						} else {
-							wos = emc.fetchEqualAscPaging(Record.class, Wo.copier, Record.job_FIELDNAME, job, page,
-									size, Record.order_FIELDNAME);
-						}
-					}
-
-					for (Task task : emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
-							.sorted(Comparator.comparing(Task::getStartTime)).collect(Collectors.toList())) {
-						Record record = this.taskToRecord(task);
-						wos.add(Wo.copier.copy(record));
 					}
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return wos;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				return value;
-			});
 
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+				for (Task task : emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
+						.sorted(Comparator.comparing(Task::getStartTime)).collect(Collectors.toList())) {
+					Record record = this.taskToRecord(task);
+					wos.add(Wo.copier.copy(record));
+				}
+			} catch (Exception e) {
+				logger.error(e);
 			}
+			return wos;
+		});
+
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return value;
+		});
 
-			result.setData(_wos.get());
-			return result;
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
 
+		result.setData(_wos.get());
+		return result;
+
 	}
 
 	private Record taskToRecord(Task task) {

+ 54 - 54
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplex.java

@@ -1,54 +1,54 @@
-package com.x.processplatform.assemble.surface.jaxrs.work;
-
-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.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplex extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionComplex.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) 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 ExceptionWorkNotExist(id);
-			}
-			Wo wo = this.get(business, effectivePerson, work, Wo.class);
-			WoControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
-						work.getId());
-			}
-			wo.setForm(this.referenceForm(business, work));
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	private WoForm referenceForm(Business business, Work work) throws Exception {
-		Form form = business.form().pick(work.getForm());
-		if (null == form) {
-			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
-			return null;
-		}
-		WoForm woForm = new WoForm();
-		form.copyTo(woForm, "data", "mobileData");
-		woForm.setData(form.getDataOrMobileData());
-		return woForm;
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.work;
+//
+//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.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.base.core.project.logger.Logger;
+//import com.x.base.core.project.logger.LoggerFactory;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.core.entity.content.Work;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplex extends BaseAction {
+//
+//	private static Logger logger = LoggerFactory.getLogger(ActionComplex.class);
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) 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 ExceptionWorkNotExist(id);
+//			}
+//			Wo wo = this.get(business, effectivePerson, work, Wo.class);
+//			WoControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
+//						work.getId());
+//			}
+//			wo.setForm(this.referenceForm(business, work));
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	private WoForm referenceForm(Business business, Work work) throws Exception {
+//		Form form = business.form().pick(work.getForm());
+//		if (null == form) {
+//			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
+//			return null;
+//		}
+//		WoForm woForm = new WoForm();
+//		form.copyTo(woForm, "data", "mobileData");
+//		woForm.setData(form.getDataOrMobileData());
+//		return woForm;
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//}

+ 54 - 54
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexAppointForm.java

@@ -1,54 +1,54 @@
-package com.x.processplatform.assemble.surface.jaxrs.work;
-
-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.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.jaxrs.work.BaseAction.AbstractWo;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexAppointForm extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionComplexAppointForm.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) 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 ExceptionWorkNotExist(id);
-			}
-			Wo wo = this.get(business, effectivePerson, work, Wo.class);
-			WoControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
-						work.getId());
-			}
-			wo.setForm(this.referenceForm(business, work, formFlag));
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	private WoForm referenceForm(Business business, Work work, String formFlag) throws Exception {
-		Form form = business.form().pick(formFlag);
-		if (null == form) {
-			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
-			return null;
-		}
-		WoForm woForm = new WoForm();
-		form.copyTo(woForm, "data", "mobileData");
-		woForm.setData(form.getDataOrMobileData());
-		return woForm;
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-}
+//package com.x.processplatform.assemble.surface.jaxrs.work;
+//
+//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.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.base.core.project.logger.Logger;
+//import com.x.base.core.project.logger.LoggerFactory;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.jaxrs.work.BaseAction.AbstractWo;
+//import com.x.processplatform.core.entity.content.Work;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexAppointForm extends BaseAction {
+//
+//	private static Logger logger = LoggerFactory.getLogger(ActionComplexAppointForm.class);
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) 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 ExceptionWorkNotExist(id);
+//			}
+//			Wo wo = this.get(business, effectivePerson, work, Wo.class);
+//			WoControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
+//						work.getId());
+//			}
+//			wo.setForm(this.referenceForm(business, work, formFlag));
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	private WoForm referenceForm(Business business, Work work, String formFlag) throws Exception {
+//		Form form = business.form().pick(formFlag);
+//		if (null == form) {
+//			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
+//			return null;
+//		}
+//		WoForm woForm = new WoForm();
+//		form.copyTo(woForm, "data", "mobileData");
+//		woForm.setData(form.getDataOrMobileData());
+//		return woForm;
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//}

+ 54 - 54
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexAppointFormMobile.java

@@ -1,54 +1,54 @@
-package com.x.processplatform.assemble.surface.jaxrs.work;
-
-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.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexAppointFormMobile extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionComplexAppointFormMobile.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) 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 ExceptionWorkNotExist(id);
-			}
-			Wo wo = this.get(business, effectivePerson, work, Wo.class);
-			WoControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
-						work.getId());
-			}
-			wo.setForm(this.referenceForm(business, work, formFlag));
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm referenceForm(Business business, Work work, String formFlag) throws Exception {
-		Form form = business.form().pick(formFlag);
-		if (null == form) {
-			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
-			return null;
-		}
-		WoForm woForm = new WoForm();
-		form.copyTo(woForm, "data", "mobileData");
-		woForm.setData(form.getMobileDataOrData());
-		return woForm;
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.work;
+//
+//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.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.base.core.project.logger.Logger;
+//import com.x.base.core.project.logger.LoggerFactory;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.core.entity.content.Work;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexAppointFormMobile extends BaseAction {
+//
+//	private static Logger logger = LoggerFactory.getLogger(ActionComplexAppointFormMobile.class);
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) 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 ExceptionWorkNotExist(id);
+//			}
+//			Wo wo = this.get(business, effectivePerson, work, Wo.class);
+//			WoControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
+//						work.getId());
+//			}
+//			wo.setForm(this.referenceForm(business, work, formFlag));
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm referenceForm(Business business, Work work, String formFlag) throws Exception {
+//		Form form = business.form().pick(formFlag);
+//		if (null == form) {
+//			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
+//			return null;
+//		}
+//		WoForm woForm = new WoForm();
+//		form.copyTo(woForm, "data", "mobileData");
+//		woForm.setData(form.getMobileDataOrData());
+//		return woForm;
+//	}
+//
+//}

+ 55 - 55
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionComplexMobile.java

@@ -1,55 +1,55 @@
-package com.x.processplatform.assemble.surface.jaxrs.work;
-
-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.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.jaxrs.work.BaseAction.AbstractWo;
-import com.x.processplatform.core.entity.content.Work;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexMobile extends BaseAction {
-
-	private static Logger logger = LoggerFactory.getLogger(ActionComplexMobile.class);
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) 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 ExceptionWorkNotExist(id);
-			}
-			Wo wo = this.get(business, effectivePerson, work, Wo.class);
-			WoControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
-						work.getId());
-			}
-			wo.setForm(this.referenceForm(business, work));
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm referenceForm(Business business, Work work) throws Exception {
-		Form form = business.form().pick(work.getForm());
-		if (null == form) {
-			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
-			return null;
-		}
-		WoForm wo = new WoForm();
-		form.copyTo(wo, "data", "mobileData");
-		wo.setData(form.getMobileDataOrData());
-		return wo;
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.work;
+//
+//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.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.base.core.project.logger.Logger;
+//import com.x.base.core.project.logger.LoggerFactory;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.jaxrs.work.BaseAction.AbstractWo;
+//import com.x.processplatform.core.entity.content.Work;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexMobile extends BaseAction {
+//
+//	private static Logger logger = LoggerFactory.getLogger(ActionComplexMobile.class);
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) 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 ExceptionWorkNotExist(id);
+//			}
+//			Wo wo = this.get(business, effectivePerson, work, Wo.class);
+//			WoControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkAccessDenied(effectivePerson.getDistinguishedName(), work.getTitle(),
+//						work.getId());
+//			}
+//			wo.setForm(this.referenceForm(business, work));
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm referenceForm(Business business, Work work) throws Exception {
+//		Form form = business.form().pick(work.getForm());
+//		if (null == form) {
+//			logger.info("work title:{}, id:{}, can not find form:{}.", work.getTitle(), work.getId(), work.getForm());
+//			return null;
+//		}
+//		WoForm wo = new WoForm();
+//		form.copyTo(wo, "data", "mobileData");
+//		wo.setData(form.getMobileDataOrData());
+//		return wo;
+//	}
+//
+//}

+ 59 - 57
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionCountWithPerson.java

@@ -26,71 +26,73 @@ import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.TaskCompleted_;
 
-class ActionCountWithPerson extends ActionComplex {
+class ActionCountWithPerson extends BaseAction {
 
 	private static Logger logger = LoggerFactory.getLogger(ActionCountWithPerson.class);
 
 	ActionResult<Wo> execute(String credential) throws Exception {
+
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		String person = null;
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Wo wo = new Wo();
 			Business business = new Business(emc);
-			String person = business.organization().person().get(credential);
-			if (StringUtils.isNotEmpty(person)) {
-				CompletableFuture<Void> future_task = CompletableFuture.runAsync(() -> {
-					try {
-						wo.setTask(emc.countEqual(Task.class, Task.person_FIELDNAME, person));
-					} catch (Exception e) {
-						logger.error(e);
-					}
-				});
-				/* 已办仅取latest */
-				CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
+			person = business.organization().person().get(credential);
+		}
+		if (StringUtils.isNotEmpty(person)) {
+			final String dn = person;
+			CompletableFuture<Void> future_task = CompletableFuture.runAsync(() -> {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					wo.setTask(emc.countEqual(Task.class, Task.person_FIELDNAME, dn));
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			});
+			/* 已办仅取latest */
+			CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					EntityManager em;
-					try {
-						em = business.entityManagerContainer().get(TaskCompleted.class);
-						CriteriaBuilder cb = em.getCriteriaBuilder();
-						CriteriaQuery<Long> cq = cb.createQuery(Long.class);
-						Root<TaskCompleted> root = cq.from(TaskCompleted.class);
-						Predicate p = cb.equal(root.get(TaskCompleted_.person), person);
-						p = cb.and(p, cb.or(cb.equal(root.get(TaskCompleted_.latest), true),
-								cb.isNull(root.get(TaskCompleted_.latest))));
-						wo.setTaskCompleted(em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult());
-					} catch (Exception e) {
-						logger.error(e);
-					}
-				});
-				CompletableFuture<Void> future_read = CompletableFuture.runAsync(() -> {
-					try {
-						wo.setRead(emc.countEqual(Read.class, Read.person_FIELDNAME, person));
-					} catch (Exception e) {
-						logger.error(e);
-					}
-				});
-				CompletableFuture<Void> future_readCompleted = CompletableFuture.runAsync(() -> {
-					try {
-						wo.setReadCompleted(
-								emc.countEqual(ReadCompleted.class, ReadCompleted.person_FIELDNAME, person));
-					} catch (Exception e) {
-						logger.error(e);
-					}
-				});
-				CompletableFuture<Void> future_review = CompletableFuture.runAsync(() -> {
-					try {
-						wo.setReview(emc.countEqual(Review.class, Review.person_FIELDNAME, person));
-					} catch (Exception e) {
-						logger.error(e);
-					}
-				});
-				future_task.get(300, TimeUnit.SECONDS);
-				future_taskCompleted.get(300, TimeUnit.SECONDS);
-				future_read.get(300, TimeUnit.SECONDS);
-				future_readCompleted.get(300, TimeUnit.SECONDS);
-				future_review.get(300, TimeUnit.SECONDS);
-			}
-			result.setData(wo);
-			return result;
+					em = emc.get(TaskCompleted.class);
+					CriteriaBuilder cb = em.getCriteriaBuilder();
+					CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+					Root<TaskCompleted> root = cq.from(TaskCompleted.class);
+					Predicate p = cb.equal(root.get(TaskCompleted_.person), dn);
+					p = cb.and(p, cb.or(cb.equal(root.get(TaskCompleted_.latest), true),
+							cb.isNull(root.get(TaskCompleted_.latest))));
+					wo.setTaskCompleted(em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult());
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			});
+			CompletableFuture<Void> future_read = CompletableFuture.runAsync(() -> {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					wo.setRead(emc.countEqual(Read.class, Read.person_FIELDNAME, dn));
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			});
+			CompletableFuture<Void> future_readCompleted = CompletableFuture.runAsync(() -> {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					wo.setReadCompleted(emc.countEqual(ReadCompleted.class, ReadCompleted.person_FIELDNAME, dn));
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			});
+			CompletableFuture<Void> future_review = CompletableFuture.runAsync(() -> {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					wo.setReview(emc.countEqual(Review.class, Review.person_FIELDNAME, dn));
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			});
+			future_task.get(300, TimeUnit.SECONDS);
+			future_taskCompleted.get(300, TimeUnit.SECONDS);
+			future_read.get(300, TimeUnit.SECONDS);
+			future_readCompleted.get(300, TimeUnit.SECONDS);
+			future_review.get(300, TimeUnit.SECONDS);
 		}
+		result.setData(wo);
+		return result;
 	}
 
 	public static class Wo extends GsonPropertyObject {

+ 77 - 76
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionGetWithWorkOrWorkCompleted.java

@@ -25,7 +25,6 @@ import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.content.Data;
 import com.x.processplatform.core.entity.content.Read;
@@ -42,60 +41,64 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionGetWithWorkOrWorkCompleted.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
-				Wo wo = null;
-				try {
-					Work work = emc.find(workOrWorkCompleted, Work.class);
-					if (null != work) {
-						wo = this.work(business, effectivePerson, work);
-					} else {
-						WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
-						if (null != workCompleted) {
-							wo = this.workCompleted(business, effectivePerson, workCompleted);
-						}
-					}
-				} catch (Exception e) {
-					logger.error(e);
+		ActionResult<Wo> result = new ActionResult<>();
+		CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
+			Wo wo = null;
+			try {
+				Work work = null;
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					work = emc.find(workOrWorkCompleted, Work.class);
 				}
-				return wo;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
+				if (null != work) {
+					wo = this.work(effectivePerson, work);
+				} else {
+					WorkCompleted workCompleted = null;
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+					}
+					if (null != workCompleted) {
+						wo = this.workCompleted(effectivePerson, workCompleted);
+					}
 				}
-				return value;
-			});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return wo;
+		});
 
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
 			}
+			return value;
+		});
 
-			result.setData(_wo.get());
-			return result;
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
+
+		result.setData(_wo.get());
+		return result;
 	}
 
-	private Wo work(Business business, EffectivePerson effectivePerson, Work work) throws Exception {
+	private Wo work(EffectivePerson effectivePerson, Work work) throws Exception {
 		Wo wo = new Wo();
 		wo.setWork(gson.toJsonTree(WoWork.copier.copy(work)));
-		wo.setActivity(this.activity(business, work));
+		wo.setActivity(this.activity(work));
 		CompletableFuture<Data> future_data = CompletableFuture.supplyAsync(() -> {
-			return this.data(business, work.getJob());
+			return this.data(work.getJob());
 		});
 		CompletableFuture<List<WoTask>> future_task = CompletableFuture.supplyAsync(() -> {
-			return this.tasks(business, work.getId());
+			return this.tasks(work.getId());
 		});
 		CompletableFuture<List<WoRead>> future_read = CompletableFuture.supplyAsync(() -> {
-			return this.reads(business, work.getJob());
+			return this.reads(work.getJob());
 		});
 		wo.setData(future_data.get());
 		wo.setTaskList(future_task.get());
@@ -105,8 +108,7 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 		return wo;
 	}
 
-	private Wo workCompleted(Business business, EffectivePerson effectivePerson, WorkCompleted workCompleted)
-			throws Exception {
+	private Wo workCompleted(EffectivePerson effectivePerson, WorkCompleted workCompleted) throws Exception {
 		Wo wo = new Wo();
 		wo.setWork(gson.toJsonTree(WoWorkCompleted.copier.copy(workCompleted)));
 		CompletableFuture<Data> future_data = CompletableFuture.supplyAsync(() -> {
@@ -114,11 +116,11 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 				/* 如果data已经merged */
 				return workCompleted.getProperties().getData();
 			} else {
-				return this.data(business, workCompleted.getJob());
+				return this.data(workCompleted.getJob());
 			}
 		});
 		CompletableFuture<List<WoRead>> future_read = CompletableFuture.supplyAsync(() -> {
-			return this.reads(business, workCompleted.getJob());
+			return this.reads(workCompleted.getJob());
 		});
 		wo.setData(future_data.get());
 		wo.setReadList(future_read.get());
@@ -126,29 +128,26 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 		return wo;
 	}
 
-	private Data data(Business business, String job) {
-		try {
-			try {
-				EntityManager em = business.entityManagerContainer().get(Item.class);
-				CriteriaBuilder cb = em.getCriteriaBuilder();
-				CriteriaQuery<Item> cq = cb.createQuery(Item.class);
-				Root<Item> root = cq.from(Item.class);
-				Predicate p = cb.equal(root.get(Item_.bundle), job);
-				p = cb.and(p, cb.equal(root.get(Item_.itemCategory), ItemCategory.pp));
-				List<Item> list = em.createQuery(cq.where(p)).getResultList();
-				if (list.isEmpty()) {
-					return new Data();
+	private Data data(String job) {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			EntityManager em = business.entityManagerContainer().get(Item.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<Item> cq = cb.createQuery(Item.class);
+			Root<Item> root = cq.from(Item.class);
+			Predicate p = cb.equal(root.get(Item_.bundle), job);
+			p = cb.and(p, cb.equal(root.get(Item_.itemCategory), ItemCategory.pp));
+			List<Item> list = em.createQuery(cq.where(p)).getResultList();
+			if (list.isEmpty()) {
+				return new Data();
+			} else {
+				JsonElement jsonElement = itemConverter.assemble(list);
+				if (jsonElement.isJsonObject()) {
+					return gson.fromJson(jsonElement, Data.class);
 				} else {
-					JsonElement jsonElement = itemConverter.assemble(list);
-					if (jsonElement.isJsonObject()) {
-						return gson.fromJson(jsonElement, Data.class);
-					} else {
-						/* 如果不是Object强制返回一个Map对象 */
-						return new Data();
-					}
+					/* 如果不是Object强制返回一个Map对象 */
+					return new Data();
 				}
-			} catch (Exception e) {
-				throw new ExceptionData(e, job);
 			}
 		} catch (Exception e) {
 			logger.error(e);
@@ -156,32 +155,34 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
 		return null;
 	}
 
-	private List<WoTask> tasks(Business business, String workId) {
-		try {
-			return WoTask.copier
-					.copy(business.entityManagerContainer().listEqual(Task.class, Task.work_FIELDNAME, workId));
+	private List<WoTask> tasks(String workId) {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return WoTask.copier.copy(emc.listEqual(Task.class, Task.work_FIELDNAME, workId));
 		} catch (Exception e) {
 			logger.error(e);
 		}
 		return null;
 	}
 
-	private List<WoRead> reads(Business business, String job) {
-		try {
-			return WoRead.copier.copy(business.entityManagerContainer().listEqual(Read.class, Read.job_FIELDNAME, job));
+	private List<WoRead> reads(String job) {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return WoRead.copier.copy(emc.listEqual(Read.class, Read.job_FIELDNAME, job));
 		} catch (Exception e) {
 			logger.error(e);
 		}
 		return null;
 	}
 
-	private WoActivity activity(Business business, Work work) throws Exception {
+	private WoActivity activity(Work work) throws Exception {
 		WoActivity woActivity = new WoActivity();
-		Activity activity = business.getActivity(work);
-		if (null != activity) {
-			activity.copyTo(woActivity);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Activity activity = business.getActivity(work);
+			if (null != activity) {
+				activity.copyTo(woActivity);
+			}
+			return woActivity;
 		}
-		return woActivity;
 	}
 
 	private void setCurrentTaskIndex(EffectivePerson effectivePerson, Wo wo) {

+ 6 - 8
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/ActionRefer.java

@@ -28,12 +28,11 @@ class ActionRefer extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionRefer.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workId) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			TimeStamp stamp = new TimeStamp();
+
 			ActionResult<Wo> result = new ActionResult<>();
 			Wo wo = new Wo();
 			CompletableFuture<Void> future_task = CompletableFuture.runAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					List<Task> os = emc.listEqualAndEqual(Task.class, Task.work_FIELDNAME, workId,
 							Task.person_FIELDNAME, effectivePerson.getDistinguishedName());
 					wo.getTaskList().addAll(WoTask.copier.copy(os));
@@ -43,7 +42,7 @@ class ActionRefer extends BaseAction {
 				}
 			});
 			CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					List<TaskCompleted> os = emc.listEqualAndEqual(TaskCompleted.class, TaskCompleted.work_FIELDNAME,
 							workId, TaskCompleted.person_FIELDNAME, effectivePerson.getDistinguishedName());
 					wo.getTaskCompletedList().addAll(WoTaskCompleted.copier.copy(os));
@@ -53,7 +52,7 @@ class ActionRefer extends BaseAction {
 				}
 			});
 			CompletableFuture<Void> future_read = CompletableFuture.runAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					List<Read> os = emc.listEqualAndEqual(Read.class, Read.work_FIELDNAME, workId,
 							Read.person_FIELDNAME, effectivePerson.getDistinguishedName());
 					wo.getReadList().addAll(WoRead.copier.copy(os));
@@ -63,7 +62,7 @@ class ActionRefer extends BaseAction {
 				}
 			});
 			CompletableFuture<Void> future_readCompleted = CompletableFuture.runAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					List<ReadCompleted> os = emc.listEqualAndEqual(ReadCompleted.class, ReadCompleted.work_FIELDNAME,
 							workId, ReadCompleted.person_FIELDNAME, effectivePerson.getDistinguishedName());
 					wo.getReadCompletedList().addAll(WoReadCompleted.copier.copy(os));
@@ -73,7 +72,7 @@ class ActionRefer extends BaseAction {
 				}
 			});
 			CompletableFuture<Void> future_review = CompletableFuture.runAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					List<Review> os = emc.listEqualAndEqual(Review.class, Review.work_FIELDNAME, workId,
 							Review.person_FIELDNAME, effectivePerson.getDistinguishedName());
 					wo.getReviewList().addAll(WoReview.copier.copy(os));
@@ -90,7 +89,6 @@ class ActionRefer extends BaseAction {
 			result.setData(wo);
 
 			return result;
-		}
 	}
 
 	public static class Wo extends GsonPropertyObject {

+ 293 - 305
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/BaseAction.java

@@ -4,10 +4,6 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -15,10 +11,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
@@ -33,24 +26,19 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.organization.OrganizationDefinition;
 import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
 import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.Data;
 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.Work_;
-import com.x.processplatform.core.entity.element.Activity;
-import com.x.processplatform.core.entity.element.ActivityType;
 import com.x.processplatform.core.entity.element.Application;
 import com.x.processplatform.core.entity.element.Form;
-import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.Process;
 import com.x.query.core.entity.Item;
 import com.x.query.core.entity.Item_;
@@ -593,299 +581,299 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 	}
 
-	protected <T extends AbstractWo> T get(Business business, EffectivePerson effectivePerson, Work work, Class<T> cls)
-			throws Exception {
-		T t = cls.newInstance();
-		List<WoTaskCompleted> woTaskCompleteds = new ArrayList<>();
-		List<WoReadCompleted> woReadCompleteds = new ArrayList<>();
-		Application application = null;
-		Process process = null;
-		Activity activity = null;
-		Long reviewCount = 0L;
-
-		CompletableFuture<Void> future_tasks = CompletableFuture.runAsync(() -> {
-			try {
-				List<Task> os = business.entityManagerContainer()
-						.listEqual(Task.class, WoTask.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.getTaskList().addAll(WoTask.copier.copy(os));
-				t.setCurrentTaskIndex(-1);
-				for (int i = 0; i < t.getTaskList().size(); i++) {
-					if (StringUtils.equals(t.getTaskList().get(i).getPerson(),
-							effectivePerson.getDistinguishedName())) {
-						t.setCurrentTaskIndex(i);
-						break;
-					}
-				}
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-
-		CompletableFuture<Void> future_taskCompleteds = CompletableFuture.runAsync(() -> {
-			try {
-				List<TaskCompleted> os = business.entityManagerContainer()
-						.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(TaskCompleted::getStartTime,
-								Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				woTaskCompleteds.addAll(WoTaskCompleted.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-
-		CompletableFuture<Void> future_reads = CompletableFuture.runAsync(() -> {
-			try {
-				List<Read> os = business.entityManagerContainer()
-						.listEqual(Read.class, Read.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.getReadList().addAll(WoRead.copier.copy(os));
-				t.setCurrentReadIndex(-1);
-				for (int i = 0; i < t.getReadList().size(); i++) {
-					if (StringUtils.equals(t.getReadList().get(i).getPerson(),
-							effectivePerson.getDistinguishedName())) {
-						t.setCurrentReadIndex(i);
-						break;
-					}
-				}
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_readCompleteds = CompletableFuture.runAsync(() -> {
-			try {
-				List<ReadCompleted> os = business.entityManagerContainer()
-						.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(ReadCompleted::getStartTime,
-								Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				woReadCompleteds.addAll(WoReadCompleted.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_attachments = CompletableFuture.runAsync(() -> {
-			try {
-				List<Attachment> os = business.entityManagerContainer()
-						.listEqual(Attachment.class, Attachment.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(Attachment::getCreateTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.setAttachmentList(WoAttachment.copier.copy(os));
-				/* 创建附件类型字段 */
-				// for (WoAttachment a : t.getAttachmentList()) {
-				// a.contentType();
-				// }
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_workLogs = CompletableFuture.runAsync(() -> {
-			try {
-				List<WorkLog> os = business.entityManagerContainer()
-						.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, work.getJob()).stream()
-						.sorted(Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.setWorkLogList(WoWorkLog.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_data = CompletableFuture.runAsync(() -> {
-			try {
-				t.setData(this.loadData(business, work));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Application> future_application = CompletableFuture.supplyAsync(() -> {
-			Application o = null;
-			try {
-				o = business.application().pick(work.getApplication());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		CompletableFuture<Process> future_process = CompletableFuture.supplyAsync(() -> {
-			Process o = null;
-			try {
-				o = business.process().pick(work.getProcess());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		CompletableFuture<Activity> future_activity = CompletableFuture.supplyAsync(() -> {
-			Activity o = null;
-			try {
-				o = business.getActivity(work);
-				if (null != o) {
-					/** 这里由于Activity是个抽象类,没有具体的Field字段,所以无法用WrapCoiper进行拷贝 */
-					WoActivity woActivity = new WoActivity();
-					o.copyTo(woActivity);
-					t.setActivity(woActivity);
-				}
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		CompletableFuture<Long> future_reviewCount = CompletableFuture.supplyAsync(() -> {
-			Long o = 0L;
-			try {
-				o = business.entityManagerContainer().countEqualAndEqual(Review.class, Review.person_FIELDNAME,
-						effectivePerson.getDistinguishedName(), Review.job_FIELDNAME, work.getJob());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		future_tasks.get(300, TimeUnit.SECONDS);
-		future_taskCompleteds.get(300, TimeUnit.SECONDS);
-		future_reads.get(300, TimeUnit.SECONDS);
-		future_readCompleteds.get(300, TimeUnit.SECONDS);
-		future_attachments.get(300, TimeUnit.SECONDS);
-		future_workLogs.get(300, TimeUnit.SECONDS);
-		future_data.get(300, TimeUnit.SECONDS);
-		application = future_application.get(300, TimeUnit.SECONDS);
-		process = future_process.get(300, TimeUnit.SECONDS);
-		activity = future_activity.get(300, TimeUnit.SECONDS);
-		reviewCount = future_reviewCount.get(300, TimeUnit.SECONDS);
-
-		t.setWork(WoWork.copier.copy(work));
-		this.arrangeWorkLog(business, t, woTaskCompleteds, woReadCompleteds);
-		// this.referenceActivityTaskReadControl(business, effectivePerson, work, t);
-
-		WoControl control = new WoControl();
-		/** 工作是否可以打开(管理员 或 有task,taskCompleted,read,readCompleted,review的人) */
-		control.setAllowVisit(false);
-		/** 工作是否可以流转(有task的人) */
-		control.setAllowProcessing(false);
-		/** 工作是否可以处理待阅(有read的人) */
-		control.setAllowReadProcessing(false);
-		/** 工作是否可保存(管理员 或者 有本人的task) */
-		control.setAllowSave(false);
-		/** 工作是否可重置(有本人待办 并且 活动设置允许重置 */
-		control.setAllowReset(false);
-		/** 工作是否可以撤回(当前人是上一个处理人 并且 还没有其他人处理过) */
-		control.setAllowRetract(false);
-		/** 工作是否可调度(管理员 并且 此活动在流程设计中允许调度) */
-		control.setAllowReroute(false);
-		/** 工作是否可删除(管理员 或者 此活动在流程设计中允许删除且当前待办人是文件的创建者) */
-		control.setAllowDelete(false);
-		/** 是否可以添加拆分分支 */
-		control.setAllowAddSplit(false);
-		/** 设置allowVisit */
-		if ((t.getCurrentTaskIndex() > -1) || (t.getCurrentReadIndex() > -1) || (woTaskCompleteds.stream()
-				.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())).count() > 0)
-				|| (woReadCompleteds.stream()
-						.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
-						.count() > 0)
-				|| (reviewCount > 0)) {
-			control.setAllowVisit(true);
-		} else if (effectivePerson.isPerson(work.getCreatorPerson())) {
-			control.setAllowVisit(true);
-		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
-			control.setAllowVisit(true);
-		}
-		/** 设置allowProcessing */
-		if (t.getCurrentTaskIndex() > -1) {
-			control.setAllowProcessing(true);
-		}
-		/** 设置allowReadProcessing */
-		if (t.getCurrentReadIndex() > -1) {
-			control.setAllowReadProcessing(true);
-		}
-		/** 设置 allowSave */
-		if (t.getCurrentTaskIndex() > -1) {
-			control.setAllowSave(true);
-		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
-			control.setAllowSave(true);
-		}
-		/** 设置 allowReset */
-		if (BooleanUtils.isTrue((Boolean) PropertyUtils.getProperty(t.getActivity(), Manual.allowReset_FIELDNAME))
-				&& (t.getCurrentTaskIndex() > -1)) {
-			control.setAllowReset(true);
-		}
-		/** 设置 allowRetract */
-		if (Objects.equals(activity.getActivityType(), ActivityType.manual)
-				&& BooleanUtils.isTrue(activity.get(Manual.allowRetract_FIELDNAME, Boolean.class))) {
-			/** 标志文件还没有处理过 */
-			if (woTaskCompleteds.stream()
-					.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())
-							&& StringUtils.equals(o.getActivityToken(), work.getActivityToken()))
-					.count() == 0) {
-				/** 找到到达当前活动的workLog */
-				WoWorkLog currentWorkLog = t.getWorkLogList().stream()
-						.filter(o -> StringUtils.equals(o.getArrivedActivityToken(), work.getActivityToken()))
-						.findFirst().orElse(null);
-				if (null != currentWorkLog) {
-					/** 查找上一个环节的已办,如果只有一个,且正好是当前人的,那么可以召回 */
-					if (woTaskCompleteds.stream().filter(
-							o -> StringUtils.equals(o.getActivityToken(), currentWorkLog.getFromActivityToken()))
-							.count() == 1) {
-						if (woTaskCompleteds.stream().filter(
-								o -> StringUtils.equals(currentWorkLog.getFromActivityToken(), o.getActivityToken())
-										&& StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
-								.count() == 1) {
-							control.setAllowRetract(true);
-						}
-					}
-				}
-			}
-		}
-		/** 设置 allowReroute */
-		if (BooleanUtils.isTrue(activity.getAllowReroute())) {
-			/** 如果活动设置了可以调度 */
-			if (effectivePerson.isManager()) {
-				/** 管理员可以调度 */
-				control.setAllowReroute(true);
-			} else if (business.organization().person().hasRole(effectivePerson,
-					OrganizationDefinition.ProcessPlatformManager)) {
-				/** 有流程管理角色的可以 */
-				control.setAllowReroute(true);
-			} else if ((null != process) && effectivePerson.isPerson(process.getControllerList())) {
-				/** 如果是流程的管理员那么可以调度 */
-				control.setAllowReroute(true);
-			} else if ((null != application) && effectivePerson.isPerson(application.getControllerList())) {
-				/** 如果是应用的管理员那么可以调度 */
-				control.setAllowReroute(true);
-			}
-		}
-		/* 设置 allowDelete */
-		if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
-			control.setAllowDelete(true);
-		} else if (Objects.equals(activity.getActivityType(), ActivityType.manual)
-				&& BooleanUtils.isTrue(activity.get(Manual.allowDeleteWork_FIELDNAME, Boolean.class))) {
-			if (t.getCurrentTaskIndex() > -1
-					|| StringUtils.equals(work.getCreatorPerson(), effectivePerson.getDistinguishedName())) {
-				control.setAllowDelete(true);
-			}
-		}
-		/* 设置 allowAddSplit */
-		if (Objects.equals(activity.getActivityType(), ActivityType.manual)
-				&& BooleanUtils.isTrue(activity.get(Manual.allowAddSplit_FIELDNAME, Boolean.class))) {
-			control.setAllowAddSplit(true);
-		}
-		t.setControl(control);
-		return t;
-	}
-
-	private void arrangeWorkLog(Business business, AbstractWo wo, List<WoTaskCompleted> woTaskCompleteds,
-			List<WoReadCompleted> woReadCompleteds) throws Exception {
-		ListTools.groupStick(wo.getWorkLogList(), wo.getTaskList(), WorkLog.fromActivityToken_FIELDNAME,
-				Task.activityToken_FIELDNAME, "taskList");
-		ListTools.groupStick(wo.getWorkLogList(), woTaskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-				TaskCompleted.activityToken_FIELDNAME, "taskCompletedList");
-		ListTools.groupStick(wo.getWorkLogList(), wo.getReadList(), WorkLog.fromActivityToken_FIELDNAME,
-				Read.activityToken_FIELDNAME, "readList");
-		ListTools.groupStick(wo.getWorkLogList(), woReadCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-				ReadCompleted.activityToken_FIELDNAME, "readCompletedList");
-	}
-
+//	protected <T extends AbstractWo> T get(Business business, EffectivePerson effectivePerson, Work work, Class<T> cls)
+//			throws Exception {
+//		T t = cls.newInstance();
+//		List<WoTaskCompleted> woTaskCompleteds = new ArrayList<>();
+//		List<WoReadCompleted> woReadCompleteds = new ArrayList<>();
+//		Application application = null;
+//		Process process = null;
+//		Activity activity = null;
+//		Long reviewCount = 0L;
+//
+//		CompletableFuture111111<Void> future_tasks = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<Task> os = business.entityManagerContainer()
+//						.listEqual(Task.class, WoTask.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.getTaskList().addAll(WoTask.copier.copy(os));
+//				t.setCurrentTaskIndex(-1);
+//				for (int i = 0; i < t.getTaskList().size(); i++) {
+//					if (StringUtils.equals(t.getTaskList().get(i).getPerson(),
+//							effectivePerson.getDistinguishedName())) {
+//						t.setCurrentTaskIndex(i);
+//						break;
+//					}
+//				}
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//
+//		CompletableFuture111111<Void> future_taskCompleteds = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<TaskCompleted> os = business.entityManagerContainer()
+//						.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(TaskCompleted::getStartTime,
+//								Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				woTaskCompleteds.addAll(WoTaskCompleted.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//
+//		CompletableFuture111111<Void> future_reads = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<Read> os = business.entityManagerContainer()
+//						.listEqual(Read.class, Read.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.getReadList().addAll(WoRead.copier.copy(os));
+//				t.setCurrentReadIndex(-1);
+//				for (int i = 0; i < t.getReadList().size(); i++) {
+//					if (StringUtils.equals(t.getReadList().get(i).getPerson(),
+//							effectivePerson.getDistinguishedName())) {
+//						t.setCurrentReadIndex(i);
+//						break;
+//					}
+//				}
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_readCompleteds = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<ReadCompleted> os = business.entityManagerContainer()
+//						.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(ReadCompleted::getStartTime,
+//								Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				woReadCompleteds.addAll(WoReadCompleted.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_attachments = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<Attachment> os = business.entityManagerContainer()
+//						.listEqual(Attachment.class, Attachment.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(Attachment::getCreateTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.setAttachmentList(WoAttachment.copier.copy(os));
+//				/* 创建附件类型字段 */
+//				// for (WoAttachment a : t.getAttachmentList()) {
+//				// a.contentType();
+//				// }
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_workLogs = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<WorkLog> os = business.entityManagerContainer()
+//						.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, work.getJob()).stream()
+//						.sorted(Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.setWorkLogList(WoWorkLog.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_data = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				t.setData(this.loadData(business, work));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Application> future_application = CompletableFuture111111.supplyAsync(() -> {
+//			Application o = null;
+//			try {
+//				o = business.application().pick(work.getApplication());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		CompletableFuture111111<Process> future_process = CompletableFuture111111.supplyAsync(() -> {
+//			Process o = null;
+//			try {
+//				o = business.process().pick(work.getProcess());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		CompletableFuture111111<Activity> future_activity = CompletableFuture111111.supplyAsync(() -> {
+//			Activity o = null;
+//			try {
+//				o = business.getActivity(work);
+//				if (null != o) {
+//					/** 这里由于Activity是个抽象类,没有具体的Field字段,所以无法用WrapCoiper进行拷贝 */
+//					WoActivity woActivity = new WoActivity();
+//					o.copyTo(woActivity);
+//					t.setActivity(woActivity);
+//				}
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		CompletableFuture111111<Long> future_reviewCount = CompletableFuture111111.supplyAsync(() -> {
+//			Long o = 0L;
+//			try {
+//				o = business.entityManagerContainer().countEqualAndEqual(Review.class, Review.person_FIELDNAME,
+//						effectivePerson.getDistinguishedName(), Review.job_FIELDNAME, work.getJob());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		future_tasks.get(300, TimeUnit.SECONDS);
+//		future_taskCompleteds.get(300, TimeUnit.SECONDS);
+//		future_reads.get(300, TimeUnit.SECONDS);
+//		future_readCompleteds.get(300, TimeUnit.SECONDS);
+//		future_attachments.get(300, TimeUnit.SECONDS);
+//		future_workLogs.get(300, TimeUnit.SECONDS);
+//		future_data.get(300, TimeUnit.SECONDS);
+//		application = future_application.get(300, TimeUnit.SECONDS);
+//		process = future_process.get(300, TimeUnit.SECONDS);
+//		activity = future_activity.get(300, TimeUnit.SECONDS);
+//		reviewCount = future_reviewCount.get(300, TimeUnit.SECONDS);
+//
+//		t.setWork(WoWork.copier.copy(work));
+//		this.arrangeWorkLog(business, t, woTaskCompleteds, woReadCompleteds);
+//		// this.referenceActivityTaskReadControl(business, effectivePerson, work, t);
+//
+//		WoControl control = new WoControl();
+//		/** 工作是否可以打开(管理员 或 有task,taskCompleted,read,readCompleted,review的人) */
+//		control.setAllowVisit(false);
+//		/** 工作是否可以流转(有task的人) */
+//		control.setAllowProcessing(false);
+//		/** 工作是否可以处理待阅(有read的人) */
+//		control.setAllowReadProcessing(false);
+//		/** 工作是否可保存(管理员 或者 有本人的task) */
+//		control.setAllowSave(false);
+//		/** 工作是否可重置(有本人待办 并且 活动设置允许重置 */
+//		control.setAllowReset(false);
+//		/** 工作是否可以撤回(当前人是上一个处理人 并且 还没有其他人处理过) */
+//		control.setAllowRetract(false);
+//		/** 工作是否可调度(管理员 并且 此活动在流程设计中允许调度) */
+//		control.setAllowReroute(false);
+//		/** 工作是否可删除(管理员 或者 此活动在流程设计中允许删除且当前待办人是文件的创建者) */
+//		control.setAllowDelete(false);
+//		/** 是否可以添加拆分分支 */
+//		control.setAllowAddSplit(false);
+//		/** 设置allowVisit */
+//		if ((t.getCurrentTaskIndex() > -1) || (t.getCurrentReadIndex() > -1) || (woTaskCompleteds.stream()
+//				.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())).count() > 0)
+//				|| (woReadCompleteds.stream()
+//						.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
+//						.count() > 0)
+//				|| (reviewCount > 0)) {
+//			control.setAllowVisit(true);
+//		} else if (effectivePerson.isPerson(work.getCreatorPerson())) {
+//			control.setAllowVisit(true);
+//		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
+//			control.setAllowVisit(true);
+//		}
+//		/** 设置allowProcessing */
+//		if (t.getCurrentTaskIndex() > -1) {
+//			control.setAllowProcessing(true);
+//		}
+//		/** 设置allowReadProcessing */
+//		if (t.getCurrentReadIndex() > -1) {
+//			control.setAllowReadProcessing(true);
+//		}
+//		/** 设置 allowSave */
+//		if (t.getCurrentTaskIndex() > -1) {
+//			control.setAllowSave(true);
+//		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
+//			control.setAllowSave(true);
+//		}
+//		/** 设置 allowReset */
+//		if (BooleanUtils.isTrue((Boolean) PropertyUtils.getProperty(t.getActivity(), Manual.allowReset_FIELDNAME))
+//				&& (t.getCurrentTaskIndex() > -1)) {
+//			control.setAllowReset(true);
+//		}
+//		/** 设置 allowRetract */
+//		if (Objects.equals(activity.getActivityType(), ActivityType.manual)
+//				&& BooleanUtils.isTrue(activity.get(Manual.allowRetract_FIELDNAME, Boolean.class))) {
+//			/** 标志文件还没有处理过 */
+//			if (woTaskCompleteds.stream()
+//					.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())
+//							&& StringUtils.equals(o.getActivityToken(), work.getActivityToken()))
+//					.count() == 0) {
+//				/** 找到到达当前活动的workLog */
+//				WoWorkLog currentWorkLog = t.getWorkLogList().stream()
+//						.filter(o -> StringUtils.equals(o.getArrivedActivityToken(), work.getActivityToken()))
+//						.findFirst().orElse(null);
+//				if (null != currentWorkLog) {
+//					/** 查找上一个环节的已办,如果只有一个,且正好是当前人的,那么可以召回 */
+//					if (woTaskCompleteds.stream().filter(
+//							o -> StringUtils.equals(o.getActivityToken(), currentWorkLog.getFromActivityToken()))
+//							.count() == 1) {
+//						if (woTaskCompleteds.stream().filter(
+//								o -> StringUtils.equals(currentWorkLog.getFromActivityToken(), o.getActivityToken())
+//										&& StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
+//								.count() == 1) {
+//							control.setAllowRetract(true);
+//						}
+//					}
+//				}
+//			}
+//		}
+//		/** 设置 allowReroute */
+//		if (BooleanUtils.isTrue(activity.getAllowReroute())) {
+//			/** 如果活动设置了可以调度 */
+//			if (effectivePerson.isManager()) {
+//				/** 管理员可以调度 */
+//				control.setAllowReroute(true);
+//			} else if (business.organization().person().hasRole(effectivePerson,
+//					OrganizationDefinition.ProcessPlatformManager)) {
+//				/** 有流程管理角色的可以 */
+//				control.setAllowReroute(true);
+//			} else if ((null != process) && effectivePerson.isPerson(process.getControllerList())) {
+//				/** 如果是流程的管理员那么可以调度 */
+//				control.setAllowReroute(true);
+//			} else if ((null != application) && effectivePerson.isPerson(application.getControllerList())) {
+//				/** 如果是应用的管理员那么可以调度 */
+//				control.setAllowReroute(true);
+//			}
+//		}
+//		/* 设置 allowDelete */
+//		if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
+//			control.setAllowDelete(true);
+//		} else if (Objects.equals(activity.getActivityType(), ActivityType.manual)
+//				&& BooleanUtils.isTrue(activity.get(Manual.allowDeleteWork_FIELDNAME, Boolean.class))) {
+//			if (t.getCurrentTaskIndex() > -1
+//					|| StringUtils.equals(work.getCreatorPerson(), effectivePerson.getDistinguishedName())) {
+//				control.setAllowDelete(true);
+//			}
+//		}
+//		/* 设置 allowAddSplit */
+//		if (Objects.equals(activity.getActivityType(), ActivityType.manual)
+//				&& BooleanUtils.isTrue(activity.get(Manual.allowAddSplit_FIELDNAME, Boolean.class))) {
+//			control.setAllowAddSplit(true);
+//		}
+//		t.setControl(control);
+//		return t;
+//	}
+//
+//	private void arrangeWorkLog(Business business, AbstractWo wo, List<WoTaskCompleted> woTaskCompleteds,
+//			List<WoReadCompleted> woReadCompleteds) throws Exception {
+//		ListTools.groupStick(wo.getWorkLogList(), wo.getTaskList(), WorkLog.fromActivityToken_FIELDNAME,
+//				Task.activityToken_FIELDNAME, "taskList");
+//		ListTools.groupStick(wo.getWorkLogList(), woTaskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+//				TaskCompleted.activityToken_FIELDNAME, "taskCompletedList");
+//		ListTools.groupStick(wo.getWorkLogList(), wo.getReadList(), WorkLog.fromActivityToken_FIELDNAME,
+//				Read.activityToken_FIELDNAME, "readList");
+//		ListTools.groupStick(wo.getWorkLogList(), woReadCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+//				ReadCompleted.activityToken_FIELDNAME, "readCompletedList");
+//	}
+//
 	/* 启动工作时查找有没有此人创建的工作并且没有流转的 */
 	protected String latest(Business business, Process process, String identity) throws Exception {
 		EntityManagerContainer emc = business.entityManagerContainer();

+ 86 - 83
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/work/V2GetWorkOrWorkCompleted.java

@@ -51,56 +51,59 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(V2GetWorkOrWorkCompleted.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-
-			CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
-				Wo wo = null;
-				try {
-					Work work = business.entityManagerContainer().find(workOrWorkCompleted, Work.class);
-					if (null != work) {
-						wo = this.work(effectivePerson, business, work);
-					} else {
-						WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
+		ActionResult<Wo> result = new ActionResult<>();
+
+		CompletableFuture<Wo> _wo = CompletableFuture.supplyAsync(() -> {
+			Wo wo = null;
+			Work work = null;
+			try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					work = emc.find(workOrWorkCompleted, Work.class);
+				}
+				if (null != work) {
+					wo = this.work(effectivePerson, work);
+				} else {
+					WorkCompleted workCompleted = null;
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+						workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
 						if (null != workCompleted) {
-							wo = this.workCompleted(business, effectivePerson, workCompleted);
+							wo = this.workCompleted(effectivePerson, workCompleted);
 						}
 					}
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				return wo;
-			});
-
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
 				}
-				return value;
-			});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+			return wo;
+		});
 
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
 			}
-			result.setData(_wo.get());
-			return result;
+			return value;
+		});
+
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
 		}
+		result.setData(_wo.get());
+		return result;
 	}
 
-	private Wo work(EffectivePerson effectivePerson, Business business, Work work)
-			throws InterruptedException, ExecutionException {
+	private Wo work(EffectivePerson effectivePerson, Work work) throws InterruptedException, ExecutionException {
 		Wo wo = new Wo();
-		CompletableFuture.allOf(workJson(work, wo), activity(business, work, wo), data(business, work, wo),
-				task(effectivePerson, business, work, wo), read(effectivePerson, business, work.getJob(), wo),
-				creatorIdentity(business, work.getCreatorIdentity(), wo),
-				creatorPerson(business, work.getCreatorPerson(), wo), creatorUnit(business, work.getCreatorUnit(), wo),
-				attachment(effectivePerson, business, work.getJob(), wo),
-				record(effectivePerson, business, work.getJob(), wo)).get();
+		CompletableFuture
+				.allOf(workJson(work, wo), activity(work, wo), data(work, wo), task(effectivePerson, work, wo),
+						read(effectivePerson, work.getJob(), wo), creatorIdentity(work.getCreatorIdentity(), wo),
+						creatorPerson(work.getCreatorPerson(), wo), creatorUnit(work.getCreatorUnit(), wo),
+						attachment(effectivePerson, work.getJob(), wo), record(effectivePerson, work.getJob(), wo))
+				.get();
 		for (WoTask woTask : wo.getTaskList()) {
 			wo.getRecordList().add(taskToRecord(woTask));
 		}
@@ -123,11 +126,11 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		return o;
 	}
 
-	private CompletableFuture<Void> data(Business business, Work work, Wo wo) {
+	private CompletableFuture<Void> data(Work work, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
-				List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class,
-						DataItem.bundle_FIELDNAME, work.getJob(), DataItem.itemCategory_FIELDNAME, ItemCategory.pp);
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				List<Item> list = emc.listEqualAndEqual(Item.class, DataItem.bundle_FIELDNAME, work.getJob(),
+						DataItem.itemCategory_FIELDNAME, ItemCategory.pp);
 				if (!list.isEmpty()) {
 					JsonElement jsonElement = itemConverter.assemble(list);
 					// 必须是Object对象
@@ -141,11 +144,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> record(EffectivePerson effectivePerson, Business business, String job, Wo wo) {
+	private CompletableFuture<Void> record(EffectivePerson effectivePerson, String job, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
-				wo.setRecordList(business.entityManagerContainer()
-						.fetchEqual(Record.class, WoRecord.copier, Record.job_FIELDNAME, job).stream()
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				wo.setRecordList(emc.fetchEqual(Record.class, WoRecord.copier, Record.job_FIELDNAME, job).stream()
 						.sorted(Comparator.comparing(WoRecord::getOrder)).collect(Collectors.toList()));
 			} catch (Exception e) {
 				logger.error(e);
@@ -153,15 +155,15 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> completedRecord(EffectivePerson effectivePerson, Business business,
-			WorkCompleted workCompleted, Wo wo) {
+	private CompletableFuture<Void> completedRecord(EffectivePerson effectivePerson, WorkCompleted workCompleted,
+			Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 				if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
 					wo.setRecordList(WoRecord.copier.copy(workCompleted.getProperties().getRecordList()).stream()
 							.sorted(Comparator.comparing(WoRecord::getOrder)).collect(Collectors.toList()));
 				} else {
-					wo.setRecordList(business.entityManagerContainer()
+					wo.setRecordList(emc
 							.fetchEqual(Record.class, WoRecord.copier, Record.job_FIELDNAME, workCompleted.getJob())
 							.stream().sorted(Comparator.comparing(WoRecord::getOrder)).collect(Collectors.toList()));
 				}
@@ -171,9 +173,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> activity(Business business, Work work, Wo wo) {
+	private CompletableFuture<Void> activity(Work work, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
 				Activity activity = business.getActivity(work);
 				if (null != activity) {
 					WoActivity woActivity = new WoActivity();
@@ -189,11 +192,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> task(EffectivePerson effectivePerson, Business business, Work work, Wo wo) {
+	private CompletableFuture<Void> task(EffectivePerson effectivePerson, Work work, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
-				wo.setTaskList(WoTask.copier.copy(
-						business.entityManagerContainer().listEqual(Task.class, Task.job_FIELDNAME, work.getJob())));
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				wo.setTaskList(WoTask.copier.copy(emc.listEqual(Task.class, Task.job_FIELDNAME, work.getJob())));
 				wo.setCurrentTaskIndex(
 						ListUtils.indexOf(wo.getTaskList(), e -> effectivePerson.isPerson(e.getPerson())));
 			} catch (Exception e) {
@@ -202,9 +204,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> attachment(EffectivePerson effectivePerson, Business business, String job, Wo wo) {
+	private CompletableFuture<Void> attachment(EffectivePerson effectivePerson, String job, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
 				List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
 				List<String> units = business.organization().unit().listWithPerson(effectivePerson);
 				List<WoAttachment> wos = new ArrayList<>();
@@ -234,11 +237,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> read(EffectivePerson effectivePerson, Business business, String job, Wo wo) {
+	private CompletableFuture<Void> read(EffectivePerson effectivePerson, String job, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
-				wo.setReadList(WoRead.copier
-						.copy(business.entityManagerContainer().listEqual(Read.class, Read.job_FIELDNAME, job)));
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				wo.setReadList(WoRead.copier.copy(emc.listEqual(Read.class, Read.job_FIELDNAME, job)));
 				wo.setCurrentReadIndex(
 						ListUtils.indexOf(wo.getReadList(), e -> effectivePerson.isPerson(e.getPerson())));
 			} catch (Exception e) {
@@ -257,9 +259,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> creatorIdentity(Business business, String creatorIdentity, Wo wo) {
+	private CompletableFuture<Void> creatorIdentity(String creatorIdentity, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
 				wo.setCreatorIdentity(business.organization().identity().getObject(creatorIdentity));
 			} catch (Exception e) {
 				logger.error(e);
@@ -267,9 +270,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> creatorPerson(Business business, String creatorPerson, Wo wo) {
+	private CompletableFuture<Void> creatorPerson(String creatorPerson, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
 				wo.setCreatorPerson(business.organization().person().getObject(creatorPerson));
 			} catch (Exception e) {
 				logger.error(e);
@@ -277,9 +281,10 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> creatorUnit(Business business, String creatorUnit, Wo wo) {
+	private CompletableFuture<Void> creatorUnit(String creatorUnit, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
-			try {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
 				wo.setCreatorUnit(business.organization().unit().getObject(creatorUnit));
 			} catch (Exception e) {
 				logger.error(e);
@@ -287,16 +292,15 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private Wo workCompleted(Business business, EffectivePerson effectivePerson, WorkCompleted workCompleted)
+	private Wo workCompleted(EffectivePerson effectivePerson, WorkCompleted workCompleted)
 			throws InterruptedException, ExecutionException {
 		Wo wo = new Wo();
-		CompletableFuture.allOf(completedJson(workCompleted, wo), completedData(business, workCompleted, wo),
-				read(effectivePerson, business, workCompleted.getJob(), wo),
-				creatorIdentity(business, workCompleted.getCreatorIdentity(), wo),
-				creatorPerson(business, workCompleted.getCreatorPerson(), wo),
-				creatorUnit(business, workCompleted.getCreatorUnit(), wo),
-				attachment(effectivePerson, business, workCompleted.getJob(), wo),
-				completedRecord(effectivePerson, business, workCompleted, wo)).get();
+		CompletableFuture.allOf(completedJson(workCompleted, wo), completedData(workCompleted, wo),
+				read(effectivePerson, workCompleted.getJob(), wo),
+				creatorIdentity(workCompleted.getCreatorIdentity(), wo),
+				creatorPerson(workCompleted.getCreatorPerson(), wo), creatorUnit(workCompleted.getCreatorUnit(), wo),
+				attachment(effectivePerson, workCompleted.getJob(), wo),
+				completedRecord(effectivePerson, workCompleted, wo)).get();
 		return wo;
 	}
 
@@ -310,15 +314,14 @@ class V2GetWorkOrWorkCompleted extends BaseAction {
 		});
 	}
 
-	private CompletableFuture<Void> completedData(Business business, WorkCompleted workCompleted, Wo wo) {
+	private CompletableFuture<Void> completedData(WorkCompleted workCompleted, Wo wo) {
 		return CompletableFuture.runAsync(() -> {
 			if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 				wo.setData(workCompleted.getProperties().getData());
 			} else {
-				try {
-					List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class,
-							DataItem.bundle_FIELDNAME, workCompleted.getJob(), DataItem.itemCategory_FIELDNAME,
-							ItemCategory.pp);
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					List<Item> list = emc.listEqualAndEqual(Item.class, DataItem.bundle_FIELDNAME,
+							workCompleted.getJob(), DataItem.itemCategory_FIELDNAME, ItemCategory.pp);
 					if (!list.isEmpty()) {
 						JsonElement jsonElement = itemConverter.assemble(list);
 						// 必须是Object对象

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

@@ -35,23 +35,23 @@ public class WorkAction extends StandardJaxrsAction {
 
 	private static Logger logger = LoggerFactory.getLogger(WorkAction.class);
 
-	@JaxrsMethodDescribe(value = "根据Work Id获取基本的work内容,仅用于服务器来取得work内容.", action = ActionComplex.class)
-	@GET
-	@Path("{id}")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
-		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplex().execute(effectivePerson, id);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
+//	@JaxrsMethodDescribe(value = "根据Work Id获取基本的work内容,仅用于服务器来取得work内容.", action = ActionComplex.class)
+//	@GET
+//	@Path("{id}")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
+//		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplex().execute(effectivePerson, id);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
 
 	@JaxrsMethodDescribe(value = "根据Work或workCompleted取得内容.", action = ActionGetWithWorkOrWorkCompleted.class)
 	@GET
@@ -72,79 +72,79 @@ public class WorkAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容.", action = ActionComplex.class)
-	@GET
-	@Path("{id}/complex")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void complex(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
-		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplex().execute(effectivePerson, id);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容,同时装载Mobile使用的Form.", action = ActionComplexMobile.class)
-	@GET
-	@Path("{id}/complex/mobile")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void complexMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
-		ActionResult<ActionComplexMobile.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexMobile().execute(effectivePerson, id);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容同时返回指定的Form,其中application和form可以指定id,name或者alias.", action = ActionComplexAppointForm.class)
-	@GET
-	@Path("{id}/complex/appoint/form/{formFlag}")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void complexAppointForm(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
-			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
-		ActionResult<ActionComplexAppointForm.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexAppointForm().execute(effectivePerson, id, formFlag);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容.", action = ActionComplexAppointFormMobile.class)
-	@GET
-	@Path("{id}/complex/appoint/form/{formFlag}/mobile")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void complexAppointFormMobile(@Suspended final AsyncResponse asyncResponse,
-			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
-			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
-		ActionResult<ActionComplexAppointFormMobile.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexAppointFormMobile().execute(effectivePerson, id, formFlag);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
+//	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容.", action = ActionComplex.class)
+//	@GET
+//	@Path("{id}/complex")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void complex(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
+//		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplex().execute(effectivePerson, id);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
+
+//	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容,同时装载Mobile使用的Form.", action = ActionComplexMobile.class)
+//	@GET
+//	@Path("{id}/complex/mobile")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void complexMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id) {
+//		ActionResult<ActionComplexMobile.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplexMobile().execute(effectivePerson, id);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
+
+//	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容同时返回指定的Form,其中application和form可以指定id,name或者alias.", action = ActionComplexAppointForm.class)
+//	@GET
+//	@Path("{id}/complex/appoint/form/{formFlag}")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void complexAppointForm(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+//			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
+//		ActionResult<ActionComplexAppointForm.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplexAppointForm().execute(effectivePerson, id, formFlag);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
+
+//	@JaxrsMethodDescribe(value = "根据Work Id获取组装的Work内容.", action = ActionComplexAppointFormMobile.class)
+//	@GET
+//	@Path("{id}/complex/appoint/form/{formFlag}/mobile")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void complexAppointFormMobile(@Suspended final AsyncResponse asyncResponse,
+//			@Context HttpServletRequest request, @JaxrsParameterDescribe("工作标识") @PathParam("id") String id,
+//			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
+//		ActionResult<ActionComplexAppointFormMobile.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplexAppointFormMobile().execute(effectivePerson, id, formFlag);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
 
 	@JaxrsMethodDescribe(value = "获取指定人员的Task,TaskCompleted,Read,ReadCompleted,Review.没有权限限制", action = ActionCountWithPerson.class)
 	@GET

+ 49 - 49
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplex.java

@@ -1,49 +1,49 @@
-package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
-
-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.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkCompletedControl;
-import com.x.processplatform.core.entity.content.WorkCompleted;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplex extends BaseAction {
-
-	ActionResult<Wo> execute(String id, EffectivePerson effectivePerson) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
-			if (null == workCompleted) {
-				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
-			}
-			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
-			wo.setForm(this.getForm(business, workCompleted));
-			WorkCompletedControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
-			}
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm getForm(Business business, WorkCompleted workCompleted) throws Exception {
-		Form form = business.form().pick(workCompleted.getForm());
-		if (null == form) {
-			return null;
-		}
-		WoForm wo = WoForm.copier.copy(form);
-		wo.setData(form.getDataOrMobileData());
-		return wo;
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
+//
+//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.exception.ExceptionEntityNotExist;
+//import com.x.base.core.project.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.WorkCompletedControl;
+//import com.x.processplatform.core.entity.content.WorkCompleted;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplex extends BaseAction {
+//
+//	ActionResult<Wo> execute(String id, EffectivePerson effectivePerson) throws Exception {
+//		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+//			ActionResult<Wo> result = new ActionResult<>();
+//			Business business = new Business(emc);
+//			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
+//			if (null == workCompleted) {
+//				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
+//			}
+//			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
+//			wo.setForm(this.getForm(business, workCompleted));
+//			WorkCompletedControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
+//			}
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm getForm(Business business, WorkCompleted workCompleted) throws Exception {
+//		Form form = business.form().pick(workCompleted.getForm());
+//		if (null == form) {
+//			return null;
+//		}
+//		WoForm wo = WoForm.copier.copy(form);
+//		wo.setData(form.getDataOrMobileData());
+//		return wo;
+//	}
+//
+//}

+ 49 - 49
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexAppointForm.java

@@ -1,49 +1,49 @@
-package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
-
-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.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkCompletedControl;
-import com.x.processplatform.core.entity.content.WorkCompleted;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexAppointForm extends BaseAction {
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
-			if (null == workCompleted) {
-				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
-			}
-			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
-			wo.setForm(this.getForm(business, formFlag));
-			WorkCompletedControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
-			}
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm getForm(Business business, String formFlag) throws Exception {
-		Form form = business.form().pick(formFlag);
-		if (null == form) {
-			return null;
-		}
-		WoForm wo = WoForm.copier.copy(form);
-		wo.setData(form.getDataOrMobileData());
-		return wo;
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
+//
+//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.exception.ExceptionEntityNotExist;
+//import com.x.base.core.project.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.WorkCompletedControl;
+//import com.x.processplatform.core.entity.content.WorkCompleted;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexAppointForm extends BaseAction {
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) throws Exception {
+//		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+//			ActionResult<Wo> result = new ActionResult<>();
+//			Business business = new Business(emc);
+//			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
+//			if (null == workCompleted) {
+//				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
+//			}
+//			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
+//			wo.setForm(this.getForm(business, formFlag));
+//			WorkCompletedControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
+//			}
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm getForm(Business business, String formFlag) throws Exception {
+//		Form form = business.form().pick(formFlag);
+//		if (null == form) {
+//			return null;
+//		}
+//		WoForm wo = WoForm.copier.copy(form);
+//		wo.setData(form.getDataOrMobileData());
+//		return wo;
+//	}
+//
+//}

+ 48 - 48
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexAppointFormMobile.java

@@ -1,48 +1,48 @@
-package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
-
-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.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkCompletedControl;
-import com.x.processplatform.core.entity.content.WorkCompleted;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexAppointFormMobile extends BaseAction {
-
-	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
-			if (null == workCompleted) {
-				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
-			}
-			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
-			wo.setForm(this.getForm(business, formFlag));
-			WorkCompletedControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
-			}
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm getForm(Business business, String formFlag) throws Exception {
-		Form form = business.form().pick(formFlag);
-		if (null == form) {
-			return null;
-		}
-		WoForm wo = WoForm.copier.copy(form);
-		wo.setData(form.getMobileDataOrData());
-		return wo;
-	}
-}
+//package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
+//
+//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.exception.ExceptionEntityNotExist;
+//import com.x.base.core.project.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.WorkCompletedControl;
+//import com.x.processplatform.core.entity.content.WorkCompleted;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexAppointFormMobile extends BaseAction {
+//
+//	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, String formFlag) throws Exception {
+//		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+//			ActionResult<Wo> result = new ActionResult<>();
+//			Business business = new Business(emc);
+//			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
+//			if (null == workCompleted) {
+//				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
+//			}
+//			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
+//			wo.setForm(this.getForm(business, formFlag));
+//			WorkCompletedControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
+//			}
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm getForm(Business business, String formFlag) throws Exception {
+//		Form form = business.form().pick(formFlag);
+//		if (null == form) {
+//			return null;
+//		}
+//		WoForm wo = WoForm.copier.copy(form);
+//		wo.setData(form.getMobileDataOrData());
+//		return wo;
+//	}
+//}

+ 49 - 49
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionComplexMobile.java

@@ -1,49 +1,49 @@
-package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
-
-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.exception.ExceptionEntityNotExist;
-import com.x.base.core.project.http.ActionResult;
-import com.x.base.core.project.http.EffectivePerson;
-import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.WorkCompletedControl;
-import com.x.processplatform.core.entity.content.WorkCompleted;
-import com.x.processplatform.core.entity.element.Form;
-
-class ActionComplexMobile extends BaseAction {
-
-	ActionResult<Wo> execute(String id, EffectivePerson effectivePerson) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Business business = new Business(emc);
-			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
-			if (null == workCompleted) {
-				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
-			}
-			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
-			wo.setForm(this.getForm(business, workCompleted));
-			WorkCompletedControl control = wo.getControl();
-			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
-				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
-			}
-			result.setData(wo);
-			return result;
-		}
-	}
-
-	public static class Wo extends AbstractWo {
-	}
-
-	private WoForm getForm(Business business, WorkCompleted workCompleted) throws Exception {
-		Form form = business.form().pick(workCompleted.getForm());
-		if (null == form) {
-			return null;
-		}
-		WoForm wo = WoForm.copier.copy(form);
-		wo.setData(form.getMobileDataOrData());
-		return wo;
-	}
-
-}
+//package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
+//
+//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.exception.ExceptionEntityNotExist;
+//import com.x.base.core.project.http.ActionResult;
+//import com.x.base.core.project.http.EffectivePerson;
+//import com.x.processplatform.assemble.surface.Business;
+//import com.x.processplatform.assemble.surface.WorkCompletedControl;
+//import com.x.processplatform.core.entity.content.WorkCompleted;
+//import com.x.processplatform.core.entity.element.Form;
+//
+//class ActionComplexMobile extends BaseAction {
+//
+//	ActionResult<Wo> execute(String id, EffectivePerson effectivePerson) throws Exception {
+//		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+//			ActionResult<Wo> result = new ActionResult<>();
+//			Business business = new Business(emc);
+//			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
+//			if (null == workCompleted) {
+//				throw new ExceptionEntityNotExist(id, WorkCompleted.class);
+//			}
+//			Wo wo = this.get(business, effectivePerson, workCompleted, Wo.class);
+//			wo.setForm(this.getForm(business, workCompleted));
+//			WorkCompletedControl control = wo.getControl();
+//			if (BooleanUtils.isNotTrue(control.getAllowVisit())) {
+//				throw new ExceptionWorkCompletedAccessDenied(effectivePerson.getDistinguishedName(), id);
+//			}
+//			result.setData(wo);
+//			return result;
+//		}
+//	}
+//
+//	public static class Wo extends AbstractWo {
+//	}
+//
+//	private WoForm getForm(Business business, WorkCompleted workCompleted) throws Exception {
+//		Form form = business.form().pick(workCompleted.getForm());
+//		if (null == form) {
+//			return null;
+//		}
+//		WoForm wo = WoForm.copier.copy(form);
+//		wo.setData(form.getMobileDataOrData());
+//		return wo;
+//	}
+//
+//}

+ 81 - 81
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/ActionManageGetAssignment.java

@@ -37,97 +37,97 @@ class ActionManageGetAssignment extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionManageGetAssignment.class);
 
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
+		WorkCompleted workCompleted = null;
+		WoControl control = null;
+		Wo wo = new Wo();
+		ActionResult<Wo> result = new ActionResult<>();
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Wo> result = new ActionResult<>();
-			Wo wo = new Wo();
 			Business business = new Business(emc);
-			WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
+			workCompleted = emc.find(id, WorkCompleted.class);
 			Process process = business.process().pick(workCompleted.getProcess());
 			Application application = business.application().pick(workCompleted.getApplication());
 			// 需要对这个应用的管理权限
 			if (!business.canManageApplicationOrProcess(effectivePerson, application, process)) {
 				throw new ExceptionAccessDenied(effectivePerson);
 			}
-			WoControl control = business.getControl(effectivePerson, workCompleted, WoControl.class);
+			control = business.getControl(effectivePerson, workCompleted, WoControl.class);
 			wo.setControl(control);
-
-			CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
-				try {
-					emc.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
-							.sorted(Comparator.comparing(TaskCompleted::getStartTime,
-									Comparator.nullsLast(Date::compareTo)))
-							.forEach(o -> {
-								try {
-									WoTaskCompleted w = WoTaskCompleted.copier.copy(o);
-									w.setControl(control);
-									wo.getTaskCompletedList().add(w);
-								} catch (Exception e) {
-									logger.error(e);
-								}
-							});
-				} catch (Exception e) {
-					logger.error(e);
-				}
-			});
-			CompletableFuture<Void> future_read = CompletableFuture.runAsync(() -> {
-				try {
-					emc.listEqual(Read.class, Read.job_FIELDNAME, workCompleted.getJob()).stream()
-							.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
-							.forEach(o -> {
-								try {
-									WoRead w = WoRead.copier.copy(o);
-									w.setControl(control);
-									wo.getReadList().add(w);
-								} catch (Exception e) {
-									logger.error(e);
-								}
-							});
-				} catch (Exception e) {
-					logger.error(e);
-				}
-			});
-			CompletableFuture<Void> future_readCompleted = CompletableFuture.runAsync(() -> {
-				try {
-					emc.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
-							.sorted(Comparator.comparing(ReadCompleted::getStartTime,
-									Comparator.nullsLast(Date::compareTo)))
-							.forEach(o -> {
-								try {
-									WoReadCompleted w = WoReadCompleted.copier.copy(o);
-									w.setControl(control);
-									wo.getReadCompletedList().add(w);
-								} catch (Exception e) {
-									logger.error(e);
-								}
-							});
-				} catch (Exception e) {
-					logger.error(e);
-				}
-			});
-			CompletableFuture<Void> future_review = CompletableFuture.runAsync(() -> {
-				try {
-					emc.listEqual(Review.class, Review.job_FIELDNAME, workCompleted.getJob()).stream()
-							.sorted(Comparator.comparing(Review::getStartTime, Comparator.nullsLast(Date::compareTo)))
-							.forEach(o -> {
-								try {
-									WoReview w = WoReview.copier.copy(o);
-									w.setControl(control);
-									wo.getReviewList().add(w);
-								} catch (Exception e) {
-									logger.error(e);
-								}
-							});
-				} catch (Exception e) {
-					logger.error(e);
-				}
-			});
-			future_taskCompleted.get(300, TimeUnit.SECONDS);
-			future_read.get(300, TimeUnit.SECONDS);
-			future_readCompleted.get(300, TimeUnit.SECONDS);
-			future_review.get(300, TimeUnit.SECONDS);
-			result.setData(wo);
-			return result;
 		}
+		final String job = workCompleted.getJob();
+		CompletableFuture<Void> future_taskCompleted = CompletableFuture.runAsync(() -> {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				emc.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, job).stream().sorted(
+						Comparator.comparing(TaskCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
+						.forEach(o -> {
+							try {
+								WoTaskCompleted w = WoTaskCompleted.copier.copy(o);
+								// w.setControl(control);
+								wo.getTaskCompletedList().add(w);
+							} catch (Exception e) {
+								logger.error(e);
+							}
+						});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+		CompletableFuture<Void> future_read = CompletableFuture.runAsync(() -> {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				emc.listEqual(Read.class, Read.job_FIELDNAME, job).stream()
+						.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
+						.forEach(o -> {
+							try {
+								WoRead w = WoRead.copier.copy(o);
+								//w.setControl(control);
+								wo.getReadList().add(w);
+							} catch (Exception e) {
+								logger.error(e);
+							}
+						});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+		CompletableFuture<Void> future_readCompleted = CompletableFuture.runAsync(() -> {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				emc.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, job).stream().sorted(
+						Comparator.comparing(ReadCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
+						.forEach(o -> {
+							try {
+								WoReadCompleted w = WoReadCompleted.copier.copy(o);
+								//w.setControl(control);
+								wo.getReadCompletedList().add(w);
+							} catch (Exception e) {
+								logger.error(e);
+							}
+						});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+		CompletableFuture<Void> future_review = CompletableFuture.runAsync(() -> {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				emc.listEqual(Review.class, Review.job_FIELDNAME, job).stream()
+						.sorted(Comparator.comparing(Review::getStartTime, Comparator.nullsLast(Date::compareTo)))
+						.forEach(o -> {
+							try {
+								WoReview w = WoReview.copier.copy(o);
+								//w.setControl(control);
+								wo.getReviewList().add(w);
+							} catch (Exception e) {
+								logger.error(e);
+							}
+						});
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+		future_taskCompleted.get(300, TimeUnit.SECONDS);
+		future_read.get(300, TimeUnit.SECONDS);
+		future_readCompleted.get(300, TimeUnit.SECONDS);
+		future_review.get(300, TimeUnit.SECONDS);
+		result.setData(wo);
+		return result;
 	}
 
 	public static class Wo extends GsonPropertyObject {

+ 192 - 204
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/BaseAction.java

@@ -1,13 +1,7 @@
 package com.x.processplatform.assemble.surface.jaxrs.workcompleted;
 
 import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaBuilder;
@@ -15,8 +9,6 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.apache.commons.lang3.StringUtils;
-
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.entity.JpaObject;
@@ -36,17 +28,13 @@ import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.Data;
 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.WorkCompleted;
 import com.x.processplatform.core.entity.content.WorkCompleted_;
 import com.x.processplatform.core.entity.content.WorkLog;
-import com.x.processplatform.core.entity.element.Activity;
-import com.x.processplatform.core.entity.element.ActivityType;
 import com.x.processplatform.core.entity.element.Application;
 import com.x.processplatform.core.entity.element.Form;
-import com.x.processplatform.core.entity.element.Process;
 import com.x.query.core.entity.Item;
 import com.x.query.core.entity.Item_;
 
@@ -350,196 +338,196 @@ abstract class BaseAction extends StandardJaxrsAction {
 				JpaObject.singularAttributeField(Form.class, true, true), null);
 	}
 
-	protected <T extends AbstractWo> T get(Business business, EffectivePerson effectivePerson,
-			WorkCompleted workCompleted, Class<T> cls) throws Exception {
-		T t = cls.newInstance();
-		List<WoTaskCompleted> woTaskCompleteds = new ArrayList<>();
-		List<WoReadCompleted> woReadCompleteds = new ArrayList<>();
-		Application application = null;
-		Process process = null;
-		Activity activity = null;
-		Long reviewCount = 0L;
-
-		CompletableFuture<Void> future_taskCompleteds = CompletableFuture.runAsync(() -> {
-			try {
-				List<TaskCompleted> os = business.entityManagerContainer()
-						.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
-						.sorted(Comparator.comparing(TaskCompleted::getStartTime,
-								Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				woTaskCompleteds.addAll(WoTaskCompleted.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_reads = CompletableFuture.runAsync(() -> {
-			try {
-				List<Read> os = business.entityManagerContainer()
-						.listEqual(Read.class, Read.job_FIELDNAME, workCompleted.getJob()).stream()
-						.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.getReadList().addAll(WoRead.copier.copy(os));
-				t.setCurrentReadIndex(-1);
-				for (int i = 0; i < t.getReadList().size(); i++) {
-					if (StringUtils.equals(t.getReadList().get(i).getPerson(),
-							effectivePerson.getDistinguishedName())) {
-						t.setCurrentReadIndex(i);
-						break;
-					}
-				}
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_readCompleteds = CompletableFuture.runAsync(() -> {
-			try {
-				List<ReadCompleted> os = business.entityManagerContainer()
-						.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
-						.sorted(Comparator.comparing(ReadCompleted::getStartTime,
-								Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				woReadCompleteds.addAll(WoReadCompleted.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_attachments = CompletableFuture.runAsync(() -> {
-			try {
-				List<Attachment> os = business.entityManagerContainer()
-						.listEqual(Attachment.class, Attachment.job_FIELDNAME, workCompleted.getJob()).stream()
-						.sorted(Comparator.comparing(Attachment::getCreateTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.setAttachmentList(WoAttachment.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_workLogs = CompletableFuture.runAsync(() -> {
-			try {
-				List<WorkLog> os = business.entityManagerContainer()
-						.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, workCompleted.getJob()).stream()
-						.sorted(Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)))
-						.collect(Collectors.toList());
-				t.setWorkLogList(WoWorkLog.copier.copy(os));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Void> future_data = CompletableFuture.runAsync(() -> {
-			try {
-				t.setData(this.loadData(business, workCompleted));
-			} catch (Exception e) {
-				logger.error(e);
-			}
-		});
-		CompletableFuture<Application> future_application = CompletableFuture.supplyAsync(() -> {
-			Application o = null;
-			try {
-				o = business.application().pick(workCompleted.getApplication());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		CompletableFuture<Process> future_process = CompletableFuture.supplyAsync(() -> {
-			Process o = null;
-			try {
-				o = business.process().pick(workCompleted.getProcess());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-		CompletableFuture<Long> future_reviewCount = CompletableFuture.supplyAsync(() -> {
-			Long o = 0L;
-			try {
-				o = business.entityManagerContainer().countEqualAndEqual(Review.class, Review.person_FIELDNAME,
-						effectivePerson.getDistinguishedName(), Review.job_FIELDNAME, workCompleted.getJob());
-			} catch (Exception e) {
-				logger.error(e);
-			}
-			return o;
-		});
-
-		future_taskCompleteds.get(300, TimeUnit.SECONDS);
-		future_reads.get(300, TimeUnit.SECONDS);
-		future_readCompleteds.get(300, TimeUnit.SECONDS);
-		future_attachments.get(300, TimeUnit.SECONDS);
-		future_workLogs.get(300, TimeUnit.SECONDS);
-		future_data.get(300, TimeUnit.SECONDS);
-		application = future_application.get(300, TimeUnit.SECONDS);
-		process = future_process.get(300, TimeUnit.SECONDS);
-		reviewCount = future_reviewCount.get(300, TimeUnit.SECONDS);
-
-		t.setWorkCompleted(WoWorkCompleted.copier.copy(workCompleted));
-		this.arrangeWorkLog(business, t, woTaskCompleteds, woReadCompleteds);
-
-		WoControl control = new WoControl();
-		/** 工作是否可以打开(管理员 或 有task,taskCompleted,read,readCompleted,review的人) */
-		control.setAllowVisit(false);
-		/** 工作是否可以处理待阅(有read的人) */
-		control.setAllowReadProcessing(false);
-		/** 工作是否可删除(管理员 或者 此活动在流程设计中允许删除且当前待办人是文件的创建者) */
-		control.setAllowDelete(false);
-		/** 设置allowVisit */
-		if ((t.getCurrentReadIndex() > -1) || (woTaskCompleteds.stream()
-				.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())).count() > 0)
-				|| (woReadCompleteds.stream()
-						.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
-						.count() > 0)
-				|| (reviewCount > 0)) {
-			control.setAllowVisit(true);
-		} else if (effectivePerson.isPerson(workCompleted.getCreatorPerson())) {
-			control.setAllowVisit(true);
-		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
-			control.setAllowVisit(true);
-		}
-		/* 设置allowReadProcessing */
-		if (t.getCurrentReadIndex() > -1) {
-			control.setAllowReadProcessing(true);
-		}
-		/* 设置 allowDelete */
-		if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
-			control.setAllowDelete(true);
-		}
-		t.setControl(control);
-		return t;
-	}
-
-	/* 如果通过已完成工作发送的已办有可能activityToken为空 */
-	private void arrangeWorkLog(Business business, AbstractWo wo, List<WoTaskCompleted> woTaskCompleteds,
-			List<WoReadCompleted> woReadCompleteds) throws Exception {
-		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
-		ListTools.groupStick(wo.getWorkLogList(),
-				woTaskCompleteds.stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
-						.collect(Collectors.toList()),
-				WorkLog.fromActivityToken_FIELDNAME, TaskCompleted.activityToken_FIELDNAME, "taskCompletedList");
-		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
-		ListTools.groupStick(wo.getWorkLogList(),
-				wo.getReadList().stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
-						.collect(Collectors.toList()),
-				WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME, "readList");
-		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
-		ListTools.groupStick(wo.getWorkLogList(),
-				woReadCompleteds.stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
-						.collect(Collectors.toList()),
-				WorkLog.fromActivityToken_FIELDNAME, ReadCompleted.activityToken_FIELDNAME, "readCompletedList");
-		/* 将没有actiivityToken对应的已办或者待办绑定到最后一个end节点 */
-		List<String> tokens = ListTools.extractProperty(wo.getWorkLogList(), WorkLog.fromActivityToken_FIELDNAME,
-				String.class, true, true);
-		WoWorkLog latestEnd = wo.getWorkLogList().stream()
-				.filter(o -> Objects.equals(o.getArrivedActivityType(), ActivityType.end)).sorted(Comparator
-						.comparing(WorkLog::getArrivedTime, Comparator.nullsFirst(Date::compareTo)).reversed())
-				.findFirst().orElse(null);
-		if (null != latestEnd) {
-			latestEnd.getReadList()
-					.addAll(wo.getReadList().stream().filter(o -> !tokens.contains(o.getActivityToken())).sorted(
-							Comparator.comparing(Read::getStartTime, Comparator.nullsFirst(Date::compareTo)).reversed())
-							.collect(Collectors.toList()));
-			latestEnd.getReadCompletedList().addAll(woReadCompleteds.stream()
-					.filter(o -> !tokens.contains(o.getActivityToken())).sorted(Comparator
-							.comparing(ReadCompleted::getStartTime, Comparator.nullsFirst(Date::compareTo)).reversed())
-					.collect(Collectors.toList()));
-		}
-	}
+//	protected <T extends AbstractWo> T get(Business business, EffectivePerson effectivePerson,
+//			WorkCompleted workCompleted, Class<T> cls) throws Exception {
+//		T t = cls.newInstance();
+//		List<WoTaskCompleted> woTaskCompleteds = new ArrayList<>();
+//		List<WoReadCompleted> woReadCompleteds = new ArrayList<>();
+//		Application application = null;
+//		Process process = null;
+//		Activity activity = null;
+//		Long reviewCount = 0L;
+//
+//		CompletableFuture111111<Void> future_taskCompleteds = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<TaskCompleted> os = business.entityManagerContainer()
+//						.listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
+//						.sorted(Comparator.comparing(TaskCompleted::getStartTime,
+//								Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				woTaskCompleteds.addAll(WoTaskCompleted.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_reads = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<Read> os = business.entityManagerContainer()
+//						.listEqual(Read.class, Read.job_FIELDNAME, workCompleted.getJob()).stream()
+//						.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.getReadList().addAll(WoRead.copier.copy(os));
+//				t.setCurrentReadIndex(-1);
+//				for (int i = 0; i < t.getReadList().size(); i++) {
+//					if (StringUtils.equals(t.getReadList().get(i).getPerson(),
+//							effectivePerson.getDistinguishedName())) {
+//						t.setCurrentReadIndex(i);
+//						break;
+//					}
+//				}
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_readCompleteds = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<ReadCompleted> os = business.entityManagerContainer()
+//						.listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, workCompleted.getJob()).stream()
+//						.sorted(Comparator.comparing(ReadCompleted::getStartTime,
+//								Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				woReadCompleteds.addAll(WoReadCompleted.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_attachments = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<Attachment> os = business.entityManagerContainer()
+//						.listEqual(Attachment.class, Attachment.job_FIELDNAME, workCompleted.getJob()).stream()
+//						.sorted(Comparator.comparing(Attachment::getCreateTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.setAttachmentList(WoAttachment.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_workLogs = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				List<WorkLog> os = business.entityManagerContainer()
+//						.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, workCompleted.getJob()).stream()
+//						.sorted(Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)))
+//						.collect(Collectors.toList());
+//				t.setWorkLogList(WoWorkLog.copier.copy(os));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Void> future_data = CompletableFuture111111.runAsync(() -> {
+//			try {
+//				t.setData(this.loadData(business, workCompleted));
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//		});
+//		CompletableFuture111111<Application> future_application = CompletableFuture111111.supplyAsync(() -> {
+//			Application o = null;
+//			try {
+//				o = business.application().pick(workCompleted.getApplication());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		CompletableFuture111111<Process> future_process = CompletableFuture111111.supplyAsync(() -> {
+//			Process o = null;
+//			try {
+//				o = business.process().pick(workCompleted.getProcess());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//		CompletableFuture111111<Long> future_reviewCount = CompletableFuture111111.supplyAsync(() -> {
+//			Long o = 0L;
+//			try {
+//				o = business.entityManagerContainer().countEqualAndEqual(Review.class, Review.person_FIELDNAME,
+//						effectivePerson.getDistinguishedName(), Review.job_FIELDNAME, workCompleted.getJob());
+//			} catch (Exception e) {
+//				logger.error(e);
+//			}
+//			return o;
+//		});
+//
+//		future_taskCompleteds.get(300, TimeUnit.SECONDS);
+//		future_reads.get(300, TimeUnit.SECONDS);
+//		future_readCompleteds.get(300, TimeUnit.SECONDS);
+//		future_attachments.get(300, TimeUnit.SECONDS);
+//		future_workLogs.get(300, TimeUnit.SECONDS);
+//		future_data.get(300, TimeUnit.SECONDS);
+//		application = future_application.get(300, TimeUnit.SECONDS);
+//		process = future_process.get(300, TimeUnit.SECONDS);
+//		reviewCount = future_reviewCount.get(300, TimeUnit.SECONDS);
+//
+//		t.setWorkCompleted(WoWorkCompleted.copier.copy(workCompleted));
+//		this.arrangeWorkLog(business, t, woTaskCompleteds, woReadCompleteds);
+//
+//		WoControl control = new WoControl();
+//		/** 工作是否可以打开(管理员 或 有task,taskCompleted,read,readCompleted,review的人) */
+//		control.setAllowVisit(false);
+//		/** 工作是否可以处理待阅(有read的人) */
+//		control.setAllowReadProcessing(false);
+//		/** 工作是否可删除(管理员 或者 此活动在流程设计中允许删除且当前待办人是文件的创建者) */
+//		control.setAllowDelete(false);
+//		/** 设置allowVisit */
+//		if ((t.getCurrentReadIndex() > -1) || (woTaskCompleteds.stream()
+//				.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName())).count() > 0)
+//				|| (woReadCompleteds.stream()
+//						.filter(o -> StringUtils.equals(o.getPerson(), effectivePerson.getDistinguishedName()))
+//						.count() > 0)
+//				|| (reviewCount > 0)) {
+//			control.setAllowVisit(true);
+//		} else if (effectivePerson.isPerson(workCompleted.getCreatorPerson())) {
+//			control.setAllowVisit(true);
+//		} else if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
+//			control.setAllowVisit(true);
+//		}
+//		/* 设置allowReadProcessing */
+//		if (t.getCurrentReadIndex() > -1) {
+//			control.setAllowReadProcessing(true);
+//		}
+//		/* 设置 allowDelete */
+//		if (business.canManageApplicationOrProcess(effectivePerson, application, process)) {
+//			control.setAllowDelete(true);
+//		}
+//		t.setControl(control);
+//		return t;
+//	}
+//
+//	/* 如果通过已完成工作发送的已办有可能activityToken为空 */
+//	private void arrangeWorkLog(Business business, AbstractWo wo, List<WoTaskCompleted> woTaskCompleteds,
+//			List<WoReadCompleted> woReadCompleteds) throws Exception {
+//		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
+//		ListTools.groupStick(wo.getWorkLogList(),
+//				woTaskCompleteds.stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
+//						.collect(Collectors.toList()),
+//				WorkLog.fromActivityToken_FIELDNAME, TaskCompleted.activityToken_FIELDNAME, "taskCompletedList");
+//		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
+//		ListTools.groupStick(wo.getWorkLogList(),
+//				wo.getReadList().stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
+//						.collect(Collectors.toList()),
+//				WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME, "readList");
+//		/* read 和 readCompleted 的 workLog o.getActivityToken 有可能为空 */
+//		ListTools.groupStick(wo.getWorkLogList(),
+//				woReadCompleteds.stream().filter(o -> StringUtils.isNotEmpty(o.getActivityToken()))
+//						.collect(Collectors.toList()),
+//				WorkLog.fromActivityToken_FIELDNAME, ReadCompleted.activityToken_FIELDNAME, "readCompletedList");
+//		/* 将没有actiivityToken对应的已办或者待办绑定到最后一个end节点 */
+//		List<String> tokens = ListTools.extractProperty(wo.getWorkLogList(), WorkLog.fromActivityToken_FIELDNAME,
+//				String.class, true, true);
+//		WoWorkLog latestEnd = wo.getWorkLogList().stream()
+//				.filter(o -> Objects.equals(o.getArrivedActivityType(), ActivityType.end)).sorted(Comparator
+//						.comparing(WorkLog::getArrivedTime, Comparator.nullsFirst(Date::compareTo)).reversed())
+//				.findFirst().orElse(null);
+//		if (null != latestEnd) {
+//			latestEnd.getReadList()
+//					.addAll(wo.getReadList().stream().filter(o -> !tokens.contains(o.getActivityToken())).sorted(
+//							Comparator.comparing(Read::getStartTime, Comparator.nullsFirst(Date::compareTo)).reversed())
+//							.collect(Collectors.toList()));
+//			latestEnd.getReadCompletedList().addAll(woReadCompleteds.stream()
+//					.filter(o -> !tokens.contains(o.getActivityToken())).sorted(Comparator
+//							.comparing(ReadCompleted::getStartTime, Comparator.nullsFirst(Date::compareTo)).reversed())
+//					.collect(Collectors.toList()));
+//		}
+//	}
 }

+ 49 - 83
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/workcompleted/WorkCompletedAction.java

@@ -95,53 +95,17 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted.", action = ActionComplex.class)
-	@GET
-	@Path("{id}/complex")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void getComplex(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
-		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplex().execute(id, effectivePerson);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted.", action = ActionComplexMobile.class)
-	@GET
-	@Path("{id}/complex/mobile")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void getComplexMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
-		ActionResult<ActionComplexMobile.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexMobile().execute(id, effectivePerson);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
-
-//	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted,使用最后记录的表单。", action = ActionComplexSnapForm.class)
+//	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted.", action = ActionComplex.class)
 //	@GET
-//	@Path("{id}/complex/snap/form")
+//	@Path("{id}/complex")
 //	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 //	@Consumes(MediaType.APPLICATION_JSON)
-//	public void getComplexSnapForm(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//	public void getComplex(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 //			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
-//		ActionResult<ActionComplexSnapForm.Wo> result = new ActionResult<>();
+//		ActionResult<ActionComplex.Wo> result = new ActionResult<>();
 //		EffectivePerson effectivePerson = this.effectivePerson(request);
 //		try {
-//			result = new ActionComplexSnapForm().execute(id, effectivePerson);
+//			result = new ActionComplex().execute(id, effectivePerson);
 //		} catch (Exception e) {
 //			logger.error(e, effectivePerson, request, null);
 //			result.error(e);
@@ -149,17 +113,17 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 //		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 //	}
 
-//	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted,使用最后记录的Mobile表单。", action = ActionComplexSnapForm.class)
+//	@JaxrsMethodDescribe(value = "获取复合的WorkCompleted.", action = ActionComplexMobile.class)
 //	@GET
-//	@Path("{id}/complex/snap/form/mobile")
+//	@Path("{id}/complex/mobile")
 //	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 //	@Consumes(MediaType.APPLICATION_JSON)
-//	public void getComplexMobileSnapForm(@Suspended final AsyncResponse asyncResponse,
-//			@Context HttpServletRequest request, @JaxrsParameterDescribe("标识") @PathParam("id") String id) {
-//		ActionResult<ActionComplexSnapForm.Wo> result = new ActionResult<>();
+//	public void getComplexMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
+//		ActionResult<ActionComplexMobile.Wo> result = new ActionResult<>();
 //		EffectivePerson effectivePerson = this.effectivePerson(request);
 //		try {
-//			result = new ActionComplexSnapForm().execute(id, effectivePerson);
+//			result = new ActionComplexMobile().execute(id, effectivePerson);
 //		} catch (Exception e) {
 //			logger.error(e, effectivePerson, request, null);
 //			result.error(e);
@@ -167,43 +131,45 @@ public class WorkCompletedAction extends StandardJaxrsAction {
 //		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 //	}
 
-	@JaxrsMethodDescribe(value = "根据WorkCompleted Id获取组装的WorkCompleted内容同时返回指定的Form.", action = ActionComplexAppointForm.class)
-	@GET
-	@Path("{id}/complex/appoint/form/{formFlag}")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void getComplexAppointForm(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-			@JaxrsParameterDescribe("标识") @PathParam("id") String id,
-			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
-		ActionResult<ActionComplexAppointForm.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexAppointForm().execute(effectivePerson, id, formFlag);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
+ 
 
-	@JaxrsMethodDescribe(value = "根据WorkCompleted Id获取组装的WorkCompleted内容.", action = ActionComplexAppointFormMobile.class)
-	@GET
-	@Path("{id}/complex/appoint/form/{formFlag}/mobile")
-	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
-	@Consumes(MediaType.APPLICATION_JSON)
-	public void getComplexAppointFormMobile(@Suspended final AsyncResponse asyncResponse,
-			@Context HttpServletRequest request, @JaxrsParameterDescribe("标识") @PathParam("id") String id,
-			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
-		ActionResult<ActionComplexAppointFormMobile.Wo> result = new ActionResult<>();
-		EffectivePerson effectivePerson = this.effectivePerson(request);
-		try {
-			result = new ActionComplexAppointFormMobile().execute(effectivePerson, id, formFlag);
-		} catch (Exception e) {
-			logger.error(e, effectivePerson, request, null);
-			result.error(e);
-		}
-		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
-	}
+//	@JaxrsMethodDescribe(value = "根据WorkCompleted Id获取组装的WorkCompleted内容同时返回指定的Form.", action = ActionComplexAppointForm.class)
+//	@GET
+//	@Path("{id}/complex/appoint/form/{formFlag}")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void getComplexAppointForm(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+//			@JaxrsParameterDescribe("标识") @PathParam("id") String id,
+//			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
+//		ActionResult<ActionComplexAppointForm.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplexAppointForm().execute(effectivePerson, id, formFlag);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
+
+//	@JaxrsMethodDescribe(value = "根据WorkCompleted Id获取组装的WorkCompleted内容.", action = ActionComplexAppointFormMobile.class)
+//	@GET
+//	@Path("{id}/complex/appoint/form/{formFlag}/mobile")
+//	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+//	@Consumes(MediaType.APPLICATION_JSON)
+//	public void getComplexAppointFormMobile(@Suspended final AsyncResponse asyncResponse,
+//			@Context HttpServletRequest request, @JaxrsParameterDescribe("标识") @PathParam("id") String id,
+//			@JaxrsParameterDescribe("表单标识") @PathParam("formFlag") String formFlag) {
+//		ActionResult<ActionComplexAppointFormMobile.Wo> result = new ActionResult<>();
+//		EffectivePerson effectivePerson = this.effectivePerson(request);
+//		try {
+//			result = new ActionComplexAppointFormMobile().execute(effectivePerson, id, formFlag);
+//		} catch (Exception e) {
+//			logger.error(e, effectivePerson, request, null);
+//			result.error(e);
+//		}
+//		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+//	}
 
 	@JaxrsMethodDescribe(value = "统计当前用户创建的WorkCompleted,按应用分类.", action = ActionListCountWithApplication.class)
 	@GET

+ 26 - 28
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListRollbackWithWorkOrWorkCompleted.java

@@ -23,9 +23,6 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.assemble.surface.Business;
-import com.x.processplatform.assemble.surface.jaxrs.worklog.ActionListWithWorkOrWorkCompleted.WoRead;
-import com.x.processplatform.assemble.surface.jaxrs.worklog.ActionListWithWorkOrWorkCompleted.WoReadCompleted;
-import com.x.processplatform.assemble.surface.jaxrs.worklog.ActionListWithWorkOrWorkCompleted.WoTask;
 import com.x.processplatform.core.entity.content.Read;
 import com.x.processplatform.core.entity.content.ReadCompleted;
 import com.x.processplatform.core.entity.content.Task;
@@ -40,9 +37,10 @@ class ActionListRollbackWithWorkOrWorkCompleted extends BaseAction {
 	private final static String taskCompletedList_FIELDNAME = "taskCompletedList";
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
+		ActionResult<List<Wo>> result = new ActionResult<>();
 
+		String job = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			Business business = new Business(emc);
 
 			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
@@ -50,29 +48,30 @@ class ActionListRollbackWithWorkOrWorkCompleted extends BaseAction {
 				throw new ExceptionAccessDenied(effectivePerson);
 			}
 
-			final String job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
-
-			CompletableFuture<List<WoTaskCompleted>> future_taskCompleteds = CompletableFuture.supplyAsync(() -> {
-				return this.taskCompleteds(business, job);
-			});
-
-			CompletableFuture<List<Wo>> future_workLogs = CompletableFuture.supplyAsync(() -> {
-				return this.workLogs(business, job);
-			});
-			List<WoTaskCompleted> taskCompleteds = future_taskCompleteds.get();
-			List<Wo> wos = future_workLogs.get();
-			ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-					TaskCompleted.activityToken_FIELDNAME, taskCompletedList_FIELDNAME);
-			result.setData(wos);
-			return result;
+			job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
 		}
+
+		final String workLogJob = job;
+
+		CompletableFuture<List<WoTaskCompleted>> future_taskCompleteds = CompletableFuture.supplyAsync(() -> {
+			return this.taskCompleteds(workLogJob);
+		});
+
+		CompletableFuture<List<Wo>> future_workLogs = CompletableFuture.supplyAsync(() -> {
+			return this.workLogs(workLogJob);
+		});
+		List<WoTaskCompleted> taskCompleteds = future_taskCompleteds.get();
+		List<Wo> wos = future_workLogs.get();
+		ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+				TaskCompleted.activityToken_FIELDNAME, taskCompletedList_FIELDNAME);
+		result.setData(wos);
+		return result;
 	}
 
-	private List<WoTaskCompleted> taskCompleteds(Business business, String job) {
+	private List<WoTaskCompleted> taskCompleteds(String job) {
 		List<WoTaskCompleted> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer()
-					.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
 					.sorted(Comparator.comparing(TaskCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
@@ -81,11 +80,10 @@ class ActionListRollbackWithWorkOrWorkCompleted extends BaseAction {
 		return os;
 	}
 
-	private List<Wo> workLogs(Business business, String job) {
+	private List<Wo> workLogs(String job) {
 		List<Wo> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().fetchEqual(WorkLog.class, Wo.copier, WorkLog.job_FIELDNAME, job)
-					.stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(WorkLog.class, Wo.copier, WorkLog.job_FIELDNAME, job).stream()
 					.filter(o -> (!BooleanUtils.isTrue(o.getSplitting()))
 							&& (Objects.equals(o.getArrivedActivityType(), ActivityType.manual)))
 					.sorted(Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)))

+ 49 - 52
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/worklog/ActionListWithJob.java

@@ -13,7 +13,6 @@ import com.x.base.core.entity.JpaObject;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
-import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.logger.Logger;
@@ -36,53 +35,53 @@ class ActionListWithJob extends BaseAction {
 	private final static String readCompletedList_FIELDNAME = "readCompletedList";
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String job) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
 
 			Business business = new Business(emc);
 
 			if (!business.readableWithJob(effectivePerson, job)) {
 				throw new ExceptionAccessDenied(effectivePerson);
 			}
-
-			CompletableFuture<List<WoTask>> future_tasks = CompletableFuture.supplyAsync(() -> {
-				return this.tasks(business, job);
-			});
-			CompletableFuture<List<WoTaskCompleted>> future_taskCompleteds = CompletableFuture.supplyAsync(() -> {
-				return this.taskCompleteds(business, job);
-			});
-			CompletableFuture<List<WoRead>> future_reads = CompletableFuture.supplyAsync(() -> {
-				return this.reads(business, job);
-			});
-			CompletableFuture<List<WoReadCompleted>> future_readCompleteds = CompletableFuture.supplyAsync(() -> {
-				return this.readCompleteds(business, job);
-			});
-			CompletableFuture<List<Wo>> future_workLogs = CompletableFuture.supplyAsync(() -> {
-				return this.workLogs(business, job);
-			});
-			List<WoTask> tasks = future_tasks.get();
-			List<WoTaskCompleted> taskCompleteds = future_taskCompleteds.get();
-			List<WoRead> reads = future_reads.get();
-			List<WoReadCompleted> readCompleteds = future_readCompleteds.get();
-			List<Wo> wos = future_workLogs.get();
-			ListTools.groupStick(wos, tasks, WorkLog.fromActivityToken_FIELDNAME, Task.activityToken_FIELDNAME,
-					taskList_FIELDNAME);
-			ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-					TaskCompleted.activityToken_FIELDNAME, taskCompletedList_FIELDNAME);
-			ListTools.groupStick(wos, reads, WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME,
-					readList_FIELDNAME);
-			ListTools.groupStick(wos, readCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-					ReadCompleted.activityToken_FIELDNAME, readCompletedList_FIELDNAME);
-			result.setData(wos);
-			return result;
 		}
+
+		CompletableFuture<List<WoTask>> future_tasks = CompletableFuture.supplyAsync(() -> {
+			return this.tasks(job);
+		});
+		CompletableFuture<List<WoTaskCompleted>> future_taskCompleteds = CompletableFuture.supplyAsync(() -> {
+			return this.taskCompleteds(job);
+		});
+		CompletableFuture<List<WoRead>> future_reads = CompletableFuture.supplyAsync(() -> {
+			return this.reads(job);
+		});
+		CompletableFuture<List<WoReadCompleted>> future_readCompleteds = CompletableFuture.supplyAsync(() -> {
+			return this.readCompleteds(job);
+		});
+		CompletableFuture<List<Wo>> future_workLogs = CompletableFuture.supplyAsync(() -> {
+			return this.workLogs(job);
+		});
+		List<WoTask> tasks = future_tasks.get();
+		List<WoTaskCompleted> taskCompleteds = future_taskCompleteds.get();
+		List<WoRead> reads = future_reads.get();
+		List<WoReadCompleted> readCompleteds = future_readCompleteds.get();
+		List<Wo> wos = future_workLogs.get();
+		ListTools.groupStick(wos, tasks, WorkLog.fromActivityToken_FIELDNAME, Task.activityToken_FIELDNAME,
+				taskList_FIELDNAME);
+		ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+				TaskCompleted.activityToken_FIELDNAME, taskCompletedList_FIELDNAME);
+		ListTools.groupStick(wos, reads, WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME,
+				readList_FIELDNAME);
+		ListTools.groupStick(wos, readCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+				ReadCompleted.activityToken_FIELDNAME, readCompletedList_FIELDNAME);
+		result.setData(wos);
+		return result;
 	}
 
-	private List<WoTask> tasks(Business business, String job) {
+	private List<WoTask> tasks(String job) {
 		List<WoTask> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().fetchEqual(Task.class, WoTask.copier, WoTask.job_FIELDNAME, job)
-					.stream().sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(Task.class, WoTask.copier, WoTask.job_FIELDNAME, job).stream()
+					.sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
 			logger.error(e);
@@ -90,11 +89,10 @@ class ActionListWithJob extends BaseAction {
 		return os;
 	}
 
-	private List<WoTaskCompleted> taskCompleteds(Business business, String job) {
+	private List<WoTaskCompleted> taskCompleteds(String job) {
 		List<WoTaskCompleted> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer()
-					.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
 					.sorted(Comparator.comparing(TaskCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
@@ -103,11 +101,11 @@ class ActionListWithJob extends BaseAction {
 		return os;
 	}
 
-	private List<WoRead> reads(Business business, String job) {
+	private List<WoRead> reads(String job) {
 		List<WoRead> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().fetchEqual(Read.class, WoRead.copier, Read.job_FIELDNAME, job)
-					.stream().sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(Read.class, WoRead.copier, Read.job_FIELDNAME, job).stream()
+					.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
 			logger.error(e);
@@ -115,11 +113,10 @@ class ActionListWithJob extends BaseAction {
 		return os;
 	}
 
-	private List<WoReadCompleted> readCompleteds(Business business, String job) {
+	private List<WoReadCompleted> readCompleteds(String job) {
 		List<WoReadCompleted> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer()
-					.fetchEqual(ReadCompleted.class, WoReadCompleted.copier, ReadCompleted.job_FIELDNAME, job).stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(ReadCompleted.class, WoReadCompleted.copier, ReadCompleted.job_FIELDNAME, job).stream()
 					.sorted(Comparator.comparing(ReadCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
@@ -128,10 +125,10 @@ class ActionListWithJob extends BaseAction {
 		return os;
 	}
 
-	private List<Wo> workLogs(Business business, String job) {
+	private List<Wo> workLogs(String job) {
 		List<Wo> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().fetchEqual(WorkLog.class, Wo.copier, WorkLog.job_FIELDNAME, job);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(WorkLog.class, Wo.copier, WorkLog.job_FIELDNAME, job);
 			return os.stream()
 					.sorted(Comparator.comparing(Wo::getFromTime, Comparator.nullsLast(Date::compareTo))
 							.thenComparing(Wo::getArrivedTime, Comparator.nullsLast(Date::compareTo)))

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

@@ -44,111 +44,112 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 	private final static String READCOMPLETEDLIST_FIELDNAME = "readCompletedList";
 
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		String job = null;
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<List<Wo>> result = new ActionResult<>();
 			Business business = new Business(emc);
+			job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
+		}
 
-			final String job = business.job().findWithWorkOrWorkCompleted(workOrWorkCompleted);
-
-			CompletableFuture<List<WoTask>> _tasks = CompletableFuture.supplyAsync(() -> {
-				return this.tasks(business, job);
-			});
-			CompletableFuture<List<WoTaskCompleted>> _taskCompleteds = CompletableFuture.supplyAsync(() -> {
-				return this.taskCompleteds(business, job);
-			});
-			CompletableFuture<List<WoRead>> _reads = CompletableFuture.supplyAsync(() -> {
-				return this.reads(business, job);
-			});
-			CompletableFuture<List<WoReadCompleted>> _readCompleteds = CompletableFuture.supplyAsync(() -> {
-				return this.readCompleteds(business, job);
-			});
-			CompletableFuture<List<WorkLog>> _workLogs = CompletableFuture.supplyAsync(() -> {
-				return this.workLogs(business, job);
-			});
-			CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
-				Boolean value = false;
-				try {
-					value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
-							new ExceptionEntityNotExist(workOrWorkCompleted));
-				} catch (Exception e) {
-					logger.error(e);
-				}
-				return value;
-			});
-
-			if (BooleanUtils.isFalse(_control.get())) {
-				throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+		final String workLogJob = job;
+
+		CompletableFuture<List<WoTask>> _tasks = CompletableFuture.supplyAsync(() -> {
+			return this.tasks(workLogJob);
+		});
+		CompletableFuture<List<WoTaskCompleted>> _taskCompleteds = CompletableFuture.supplyAsync(() -> {
+			return this.taskCompleteds(workLogJob);
+		});
+		CompletableFuture<List<WoRead>> _reads = CompletableFuture.supplyAsync(() -> {
+			return this.reads(workLogJob);
+		});
+		CompletableFuture<List<WoReadCompleted>> _readCompleteds = CompletableFuture.supplyAsync(() -> {
+			return this.readCompleteds(workLogJob);
+		});
+		CompletableFuture<List<WorkLog>> _workLogs = CompletableFuture.supplyAsync(() -> {
+			return this.workLogs(workLogJob);
+		});
+		CompletableFuture<Boolean> _control = CompletableFuture.supplyAsync(() -> {
+			Boolean value = false;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				value = business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+						new ExceptionEntityNotExist(workOrWorkCompleted));
+			} catch (Exception e) {
+				logger.error(e);
 			}
-			List<WoTask> tasks = _tasks.get();
-			List<WoTaskCompleted> taskCompleteds = _taskCompleteds.get();
-			List<WoRead> reads = _reads.get();
-			List<WoReadCompleted> readCompleteds = _readCompleteds.get();
-			List<WorkLog> workLogs = _workLogs.get();
-
-			if (!workLogs.isEmpty()) {
-				WorkLogTree tree = new WorkLogTree(workLogs);
-				List<Wo> wos = new ArrayList<>();
-				for (WorkLog o : workLogs.stream()
-						.filter(o -> Objects.equals(ActivityType.manual, o.getFromActivityType()))
-						.collect(Collectors.toList())) {
-					Wo wo = Wo.copier.copy(o);
-					Node node = tree.find(o);
-					if (null != node) {
-						Nodes nodes = node.downNextManual();
-						if (nodes.isEmpty()) {
-							/* 如果没有找到后面的人工节点,那么有多种可能,有一种是已经删除,工作合并到其他分支了,那么找其他分支的下一步 */
-							WorkLog otherWorkLog = workLogs.stream()
-									.filter(g -> (g != o)
-											&& StringUtils.equals(g.getArrivedActivity(), o.getArrivedActivity())
-											&& StringUtils.equals(g.getSplitToken(), o.getSplitToken()))
-									.findFirst().orElse(null);
-							if (null != otherWorkLog) {
-								node = tree.find(otherWorkLog);
-								if (null != node) {
-									nodes = node.downNextManual();
-								}
+			return value;
+		});
+
+		if (BooleanUtils.isFalse(_control.get())) {
+			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
+		}
+		List<WoTask> tasks = _tasks.get();
+		List<WoTaskCompleted> taskCompleteds = _taskCompleteds.get();
+		List<WoRead> reads = _reads.get();
+		List<WoReadCompleted> readCompleteds = _readCompleteds.get();
+		List<WorkLog> workLogs = _workLogs.get();
+
+		if (!workLogs.isEmpty()) {
+			WorkLogTree tree = new WorkLogTree(workLogs);
+			List<Wo> wos = new ArrayList<>();
+			for (WorkLog o : workLogs.stream().filter(o -> Objects.equals(ActivityType.manual, o.getFromActivityType()))
+					.collect(Collectors.toList())) {
+				Wo wo = Wo.copier.copy(o);
+				Node node = tree.find(o);
+				if (null != node) {
+					Nodes nodes = node.downNextManual();
+					if (nodes.isEmpty()) {
+						/* 如果没有找到后面的人工节点,那么有多种可能,有一种是已经删除,工作合并到其他分支了,那么找其他分支的下一步 */
+						WorkLog otherWorkLog = workLogs.stream()
+								.filter(g -> (g != o)
+										&& StringUtils.equals(g.getArrivedActivity(), o.getArrivedActivity())
+										&& StringUtils.equals(g.getSplitToken(), o.getSplitToken()))
+								.findFirst().orElse(null);
+						if (null != otherWorkLog) {
+							node = tree.find(otherWorkLog);
+							if (null != node) {
+								nodes = node.downNextManual();
 							}
 						}
-						if (!nodes.isEmpty()) {
-							for (Node n : nodes) {
-								tasks.stream().filter(t -> StringUtils.equals(t.getActivityToken(),
-										n.getWorkLog().getFromActivityToken())).forEach(t -> {
-											wo.getNextTaskIdentityList().add(t.getIdentity());
-										});
-								taskCompleteds.stream()
-										.filter(t -> BooleanUtils.isTrue(t.getJoinInquire()) && StringUtils
-												.equals(t.getActivityToken(), n.getWorkLog().getFromActivityToken()))
-										.forEach(t -> {
-											wo.getNextTaskCompletedIdentityList().add(t.getIdentity());
-										});
-							}
+					}
+					if (!nodes.isEmpty()) {
+						for (Node n : nodes) {
+							tasks.stream().filter(t -> StringUtils.equals(t.getActivityToken(),
+									n.getWorkLog().getFromActivityToken())).forEach(t -> {
+										wo.getNextTaskIdentityList().add(t.getIdentity());
+									});
+							taskCompleteds.stream()
+									.filter(t -> BooleanUtils.isTrue(t.getJoinInquire()) && StringUtils
+											.equals(t.getActivityToken(), n.getWorkLog().getFromActivityToken()))
+									.forEach(t -> {
+										wo.getNextTaskCompletedIdentityList().add(t.getIdentity());
+									});
 						}
 					}
-					/* 下一环节处理人可能是重复处理导致重复的,去重 */
-					wo.setNextTaskIdentityList(ListTools.trim(wo.getNextTaskIdentityList(), true, true));
-					wo.setNextTaskCompletedIdentityList(
-							ListTools.trim(wo.getNextTaskCompletedIdentityList(), true, true));
-					wos.add(wo);
 				}
-				ListTools.groupStick(wos, tasks, WorkLog.fromActivityToken_FIELDNAME, Task.activityToken_FIELDNAME,
-						TASKLIST_FIELDNAME);
-				ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-						TaskCompleted.activityToken_FIELDNAME, TASKCOMPLETEDLIST_FIELDNAME);
-				ListTools.groupStick(wos, reads, WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME,
-						READLIST_FIELDNAME);
-				ListTools.groupStick(wos, readCompleteds, WorkLog.fromActivityToken_FIELDNAME,
-						ReadCompleted.activityToken_FIELDNAME, READCOMPLETEDLIST_FIELDNAME);
-				result.setData(wos);
+				/* 下一环节处理人可能是重复处理导致重复的,去重 */
+				wo.setNextTaskIdentityList(ListTools.trim(wo.getNextTaskIdentityList(), true, true));
+				wo.setNextTaskCompletedIdentityList(ListTools.trim(wo.getNextTaskCompletedIdentityList(), true, true));
+				wos.add(wo);
 			}
-			return result;
+			ListTools.groupStick(wos, tasks, WorkLog.fromActivityToken_FIELDNAME, Task.activityToken_FIELDNAME,
+					TASKLIST_FIELDNAME);
+			ListTools.groupStick(wos, taskCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+					TaskCompleted.activityToken_FIELDNAME, TASKCOMPLETEDLIST_FIELDNAME);
+			ListTools.groupStick(wos, reads, WorkLog.fromActivityToken_FIELDNAME, Read.activityToken_FIELDNAME,
+					READLIST_FIELDNAME);
+			ListTools.groupStick(wos, readCompleteds, WorkLog.fromActivityToken_FIELDNAME,
+					ReadCompleted.activityToken_FIELDNAME, READCOMPLETEDLIST_FIELDNAME);
+			result.setData(wos);
 		}
+		return result;
 	}
 
-	private List<WoTask> tasks(Business business, String job) {
+	private List<WoTask> tasks(String job) {
 		List<WoTask> os = new ArrayList<>();
-		try {
-			os = WoTask.copier.copy(business.entityManagerContainer().listEqual(Task.class, Task.job_FIELDNAME, job)
-					.stream().sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = WoTask.copier.copy(emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
+					.sorted(Comparator.comparing(Task::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList()));
 		} catch (Exception e) {
 			logger.error(e);
@@ -156,11 +157,10 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 		return os;
 	}
 
-	private List<WoTaskCompleted> taskCompleteds(Business business, String job) {
+	private List<WoTaskCompleted> taskCompleteds(String job) {
 		List<WoTaskCompleted> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer()
-					.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(TaskCompleted.class, WoTaskCompleted.copier, TaskCompleted.job_FIELDNAME, job).stream()
 					.sorted(Comparator.comparing(TaskCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
@@ -169,11 +169,11 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 		return os;
 	}
 
-	private List<WoRead> reads(Business business, String job) {
+	private List<WoRead> reads(String job) {
 		List<WoRead> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().fetchEqual(Read.class, WoRead.copier, Read.job_FIELDNAME, job)
-					.stream().sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(Read.class, WoRead.copier, Read.job_FIELDNAME, job).stream()
+					.sorted(Comparator.comparing(Read::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
 			logger.error(e);
@@ -181,11 +181,10 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 		return os;
 	}
 
-	private List<WoReadCompleted> readCompleteds(Business business, String job) {
+	private List<WoReadCompleted> readCompleteds(String job) {
 		List<WoReadCompleted> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer()
-					.fetchEqual(ReadCompleted.class, WoReadCompleted.copier, ReadCompleted.job_FIELDNAME, job).stream()
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.fetchEqual(ReadCompleted.class, WoReadCompleted.copier, ReadCompleted.job_FIELDNAME, job).stream()
 					.sorted(Comparator.comparing(ReadCompleted::getStartTime, Comparator.nullsLast(Date::compareTo)))
 					.collect(Collectors.toList());
 		} catch (Exception e) {
@@ -194,10 +193,10 @@ class ActionListWithWorkOrWorkCompleted extends BaseAction {
 		return os;
 	}
 
-	private List<WorkLog> workLogs(Business business, String job) {
+	private List<WorkLog> workLogs(String job) {
 		List<WorkLog> os = new ArrayList<>();
-		try {
-			os = business.entityManagerContainer().listEqual(WorkLog.class, WorkLog.job_FIELDNAME, job);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			os = emc.listEqual(WorkLog.class, WorkLog.job_FIELDNAME, job);
 			return os.stream()
 					.sorted(Comparator.comparing(WorkLog::getFromTime, Comparator.nullsLast(Date::compareTo))
 							.thenComparing(WorkLog::getArrivedTime, Comparator.nullsLast(Date::compareTo)))

+ 21 - 19
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/CmsPlan.java

@@ -20,6 +20,7 @@ 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.entity.dataitem.ItemCategory;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.tools.ListTools;
@@ -83,16 +84,16 @@ public class CmsPlan extends Plan {
 		this.selectList = list;
 	}
 
-	List<String> listBundle(EntityManagerContainer emc) throws Exception {
+	List<String> listBundle() throws Exception {
 		List<String> docIds = new TreeList<>();
 
 		// 根据where条件查询符合条件的所有文档ID列表
-		docIds = listBundle_document(emc);
+		docIds = listBundle_document();
 
 		if (BooleanUtils.isTrue(this.where.accessible)) {
 			if (StringUtils.isNotEmpty(runtime.person)) {
 				// 过滤可见范围
-				docIds = this.listBundle_accessible(emc, docIds, runtime.person);
+				docIds = this.listBundle_accessible(docIds, runtime.person);
 			}
 		}
 
@@ -104,7 +105,7 @@ public class CmsPlan extends Plan {
 			}
 		}
 		if (!filterEntries.isEmpty()) {
-			docIds = listBundle_filterEntry(emc, docIds, filterEntries);
+			docIds = listBundle_filterEntry(docIds, filterEntries);
 		}
 		filterEntries.clear();
 		for (FilterEntry _o : ListTools.trim(this.runtime.filterList, true, true)) {
@@ -113,7 +114,7 @@ public class CmsPlan extends Plan {
 			}
 		}
 		if (!filterEntries.isEmpty()) {
-			docIds = listBundle_filterEntry(emc, docIds, filterEntries);
+			docIds = listBundle_filterEntry(docIds, filterEntries);
 		}
 		return docIds;
 	}
@@ -125,23 +126,25 @@ public class CmsPlan extends Plan {
 	 * @return
 	 * @throws Exception
 	 */
-	private List<String> listBundle_document(EntityManagerContainer emc) throws Exception {
-		EntityManager em = emc.get(Document.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<String> cq = cb.createQuery(String.class);
-		Root<Document> root = cq.from(Document.class);
-		cq.select(root.get(Document_.id)).where(this.where.documentPredicate(cb, root, this.runtime, this.filterList));
-		List<String> docIds = em.createQuery(cq).getResultList();
-		return docIds.stream().distinct().collect(Collectors.toList());
+	private List<String> listBundle_document() throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EntityManager em = emc.get(Document.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<String> cq = cb.createQuery(String.class);
+			Root<Document> root = cq.from(Document.class);
+			cq.select(root.get(Document_.id))
+					.where(this.where.documentPredicate(cb, root, this.runtime, this.filterList));
+			List<String> docIds = em.createQuery(cq).getResultList();
+			return docIds.stream().distinct().collect(Collectors.toList());
+		}
 	}
 
-	private List<String> listBundle_accessible(EntityManagerContainer emc, List<String> docIds, String person)
-			throws Exception {
+	private List<String> listBundle_accessible(List<String> docIds, String person) throws Exception {
 		List<String> list = new TreeList<>();
 		List<CompletableFuture<List<String>>> futures = new TreeList<>();
 		for (List<String> documentId : ListTools.batch(docIds, SQL_STATEMENT_IN_BATCH)) {
 			CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					EntityManager em = emc.get(Review.class);
 					CriteriaBuilder cb = em.getCriteriaBuilder();
 					CriteriaQuery<String> cq = cb.createQuery(String.class);
@@ -170,8 +173,7 @@ public class CmsPlan extends Plan {
 		return list;
 	}
 
-	private List<String> listBundle_filterEntry(EntityManagerContainer emc, List<String> docIds,
-			List<FilterEntry> filterEntries) throws Exception {
+	private List<String> listBundle_filterEntry(List<String> docIds, List<FilterEntry> filterEntries) throws Exception {
 		/** 运行FilterEntry */
 		List<String> partDocIds = new TreeList<>();
 		List<List<String>> batch_docIds = ListTools.batch(docIds, SQL_STATEMENT_IN_BATCH);
@@ -181,7 +183,7 @@ public class CmsPlan extends Plan {
 			List<CompletableFuture<List<String>>> futures = new TreeList<>();
 			for (List<String> _batch : batch_docIds) {
 				CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
-					try {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 						EntityManager em = emc.get(Item.class);
 						CriteriaBuilder cb = em.getCriteriaBuilder();
 						CriteriaQuery<String> cq = cb.createQuery(String.class);

+ 225 - 234
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/Plan.java

@@ -20,6 +20,10 @@ import javax.persistence.criteria.Root;
 import javax.script.ScriptEngine;
 import javax.script.ScriptException;
 
+import org.apache.commons.collections4.list.TreeList;
+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.entity.dataitem.ItemPrimitiveType;
@@ -33,10 +37,6 @@ import com.x.base.core.project.tools.ListTools;
 import com.x.query.core.entity.Item;
 import com.x.query.core.entity.Item_;
 
-import org.apache.commons.collections4.list.TreeList;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.StringUtils;
-
 public abstract class Plan extends GsonPropertyObject {
 
 	// private static Logger logger = LoggerFactory.getLogger(Plan.class);
@@ -210,120 +210,112 @@ public abstract class Plan extends GsonPropertyObject {
 
 	abstract void adjust() throws Exception;
 
-	abstract List<String> listBundle(EntityManagerContainer emc) throws Exception;
+	abstract List<String> listBundle() throws Exception;
 
 	public void access() throws Exception {
 		/* 先获取所有记录对应的job值作为返回的结果集 */
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			/* 先进行字段调整 */
-			this.adjust();
-			this.group = this.findGroupSelectEntry();
-			this.orderList = this.listOrderSelectEntry();
-			List<String> bundles = null;
-			if ((null != this.runtime) && (ListTools.isNotEmpty(runtime.bundleList))) {
-				bundles = this.runtime.bundleList;
-			} else {
-				bundles = this.listBundle(emc);
-			}
-			// if ((null != this.count) && (this.count > 0)) {
-			// /* 默认限制了数量 */
-			// if (this.count < bundles.size()) {
-			// bundles = bundles.subList(0, this.count);
-			// }
-			// }
-			if ((null != this.runtime.count) && (this.runtime.count > 0)) {
-				/* runtime限制了数量 */
-				if (this.runtime.count < bundles.size()) {
-					bundles = bundles.subList(0, this.runtime.count);
-				}
-			}
+		/* 先进行字段调整 */
+		this.adjust();
+		this.group = this.findGroupSelectEntry();
+		this.orderList = this.listOrderSelectEntry();
+		List<String> bundles = null;
+		if ((null != this.runtime) && (ListTools.isNotEmpty(runtime.bundleList))) {
+			bundles = this.runtime.bundleList;
+		} else {
+			bundles = this.listBundle();
+		}
 
-			final Table fillTable = this.concreteTable(bundles);
-			List<CompletableFuture<Void>> futures = new TreeList<>();
-			for (List<String> _part_bundles : ListTools.batch(bundles, SQL_STATEMENT_IN_BATCH)) {
-				for (SelectEntry selectEntry : this.selectList) {
-					CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
-						try {
-							this.fillSelectEntry(emc, _part_bundles, selectEntry, fillTable);
-						} catch (Exception e) {
-							e.printStackTrace();
-						}
-					});
-					futures.add(future);
-				}
+		if ((null != this.runtime.count) && (this.runtime.count > 0)) {
+			/* runtime限制了数量 */
+			if (this.runtime.count < bundles.size()) {
+				bundles = bundles.subList(0, this.runtime.count);
 			}
-			for (CompletableFuture<Void> future : futures) {
-				future.get(300, TimeUnit.SECONDS);
+		}
+
+		final Table fillTable = this.concreteTable(bundles);
+		List<CompletableFuture<Void>> futures = new TreeList<>();
+		for (List<String> _part_bundles : ListTools.batch(bundles, SQL_STATEMENT_IN_BATCH)) {
+			for (SelectEntry selectEntry : this.selectList) {
+				CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+					try {
+						this.fillSelectEntry(_part_bundles, selectEntry, fillTable);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				});
+				futures.add(future);
 			}
-			Table table = this.order(fillTable);
-			/* 新增测试 */
-			if (!this.selectList.emptyColumnCode()) {
-				ScriptEngine engine = this.getScriptEngine();
-				engine.put("gird", table);
-				for (SelectEntry selectEntry : this.selectList) {
-					if (StringUtils.isNotBlank(selectEntry.code)) {
-						List<ExtractObject> extractObjects = new TreeList<>();
-						table.stream().forEach(r -> {
-							ExtractObject extractObject = new ExtractObject();
-							extractObject.setBundle(r.bundle);
-							extractObject.setColumn(selectEntry.getColumn());
-							extractObject.setValue(r.find(selectEntry.getColumn()));
-							extractObject.setEntry(r);
-							extractObjects.add(extractObject);
-						});
-						engine.put("extractObjects", extractObjects);
-						StringBuffer text = new StringBuffer();
-						text.append("function executeScript(o){\n");
-						text.append(selectEntry.code);
-						text.append("\n");
-						text.append("}\n");
-						text.append("for each (var extractObject in extractObjects) {\n");
-						text.append("var o= {\n");
-						text.append("'value':extractObject.getValue(),\n");
-						text.append("'entry':extractObject.getEntry(),\n");
-						text.append("'columnName':extractObject.getColumn()\n");
-						text.append("}\n");
-						text.append("extractObject.setValue(executeScript.apply(o));\n");
-						text.append("}");
-						engine.eval(text.toString());
-						for (ExtractObject extractObject : extractObjects) {
-							table.get(extractObject.getBundle()).put(extractObject.getColumn(),
-									extractObject.getValue());
-						}
+		}
+		for (CompletableFuture<Void> future : futures) {
+			future.get(300, TimeUnit.SECONDS);
+		}
+		Table table = this.order(fillTable);
+		/* 新增测试 */
+		if (!this.selectList.emptyColumnCode()) {
+			ScriptEngine engine = this.getScriptEngine();
+			engine.put("gird", table);
+			for (SelectEntry selectEntry : this.selectList) {
+				if (StringUtils.isNotBlank(selectEntry.code)) {
+					List<ExtractObject> extractObjects = new TreeList<>();
+					table.stream().forEach(r -> {
+						ExtractObject extractObject = new ExtractObject();
+						extractObject.setBundle(r.bundle);
+						extractObject.setColumn(selectEntry.getColumn());
+						extractObject.setValue(r.find(selectEntry.getColumn()));
+						extractObject.setEntry(r);
+						extractObjects.add(extractObject);
+					});
+					engine.put("extractObjects", extractObjects);
+					StringBuffer text = new StringBuffer();
+					text.append("function executeScript(o){\n");
+					text.append(selectEntry.code);
+					text.append("\n");
+					text.append("}\n");
+					text.append("for each (var extractObject in extractObjects) {\n");
+					text.append("var o= {\n");
+					text.append("'value':extractObject.getValue(),\n");
+					text.append("'entry':extractObject.getEntry(),\n");
+					text.append("'columnName':extractObject.getColumn()\n");
+					text.append("}\n");
+					text.append("extractObject.setValue(executeScript.apply(o));\n");
+					text.append("}");
+					engine.eval(text.toString());
+					for (ExtractObject extractObject : extractObjects) {
+						table.get(extractObject.getBundle()).put(extractObject.getColumn(), extractObject.getValue());
 					}
 				}
 			}
-			this.grid = table;
-			if (null != this.findGroupSelectEntry()) {
-				GroupTable groupTable = group(table);
-				if (StringUtils.isNotEmpty(this.afterGroupGridScriptText)) {
-					ScriptEngine engine = this.getScriptEngine();
-					engine.put("groupGrid", groupTable);
-					engine.eval(this.afterGroupGridScriptText);
-				}
-				this.groupGrid = groupTable;
+		}
+		this.grid = table;
+		if (null != this.findGroupSelectEntry()) {
+			GroupTable groupTable = group(table);
+			if (StringUtils.isNotEmpty(this.afterGroupGridScriptText)) {
+				ScriptEngine engine = this.getScriptEngine();
+				engine.put("groupGrid", groupTable);
+				engine.eval(this.afterGroupGridScriptText);
 			}
-			/* 需要抽取单独的列 */
-			if (ListTools.isNotEmpty(this.columnList)) {
-				this.columnGrid = new TreeList<Object>();
-				for (String column : this.columnList) {
-					List<Object> list = new TreeList<>();
-					SelectEntry selectEntry = this.selectList.column(column);
-					if (null != selectEntry) {
-						for (Row o : table) {
-							if (selectEntry.isName) {
-								list.add(name(Objects.toString(o.find(column), "")));
-							} else {
-								list.add(o.find(column));
-							}
+			this.groupGrid = groupTable;
+		}
+		/* 需要抽取单独的列 */
+		if (ListTools.isNotEmpty(this.columnList)) {
+			this.columnGrid = new TreeList<Object>();
+			for (String column : this.columnList) {
+				List<Object> list = new TreeList<>();
+				SelectEntry selectEntry = this.selectList.column(column);
+				if (null != selectEntry) {
+					for (Row o : table) {
+						if (selectEntry.isName) {
+							list.add(name(Objects.toString(o.find(column), "")));
+						} else {
+							list.add(o.find(column));
 						}
 					}
-					/* 只有一列的情况下直接输出List */
-					if (this.columnList.size() == 1) {
-						this.columnGrid = list;
-					} else {
-						this.columnGrid.add(list);
-					}
+				}
+				/* 只有一列的情况下直接输出List */
+				if (this.columnList.size() == 1) {
+					this.columnGrid = list;
+				} else {
+					this.columnGrid.add(list);
 				}
 			}
 		}
@@ -360,53 +352,51 @@ public abstract class Plan extends GsonPropertyObject {
 
 	public List<String> fetchBundles() throws Exception {
 		/* 先获取所有记录对应的job值作为返回的结果集 */
-		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			/* 先进行字段调整 */
-			this.adjust();
-			this.group = this.findGroupSelectEntry();
-			this.orderList = this.listOrderSelectEntry();
-			List<String> bundles = this.listBundle(emc);
-			if ((null != this.runtime.count) && (this.runtime.count > 0)) {
-				/* runtime限制了数量 */
-				if (this.runtime.count < bundles.size()) {
-					bundles = bundles.subList(0, this.runtime.count);
-				}
-			}
-			if (orderList.isEmpty()) {
-				return bundles;
+		List<String> bundles = this.listBundle();
+		/* 先进行字段调整 */
+		this.adjust();
+		this.group = this.findGroupSelectEntry();
+		this.orderList = this.listOrderSelectEntry();
+		if ((null != this.runtime.count) && (this.runtime.count > 0)) {
+			/* runtime限制了数量 */
+			if (this.runtime.count < bundles.size()) {
+				bundles = bundles.subList(0, this.runtime.count);
 			}
-			TreeList<String> os = new TreeList<>();
-			final Table fillTable = this.concreteTable(bundles);
-			List<CompletableFuture<Void>> futures = new TreeList<>();
-			for (List<String> _part_bundles : ListTools.batch(bundles, SQL_STATEMENT_IN_BATCH)) {
-				for (SelectEntry selectEntry : this.orderList) {
-					CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
-						try {
-							this.fillSelectEntry(emc, _part_bundles, selectEntry, fillTable);
-						} catch (Exception e) {
-							e.printStackTrace();
-						}
-					});
-					futures.add(future);
-				}
+		}
+		if (orderList.isEmpty()) {
+			return bundles;
+		}
+		TreeList<String> os = new TreeList<>();
+		final Table fillTable = this.concreteTable(bundles);
+		List<CompletableFuture<Void>> futures = new TreeList<>();
+		for (List<String> _part_bundles : ListTools.batch(bundles, SQL_STATEMENT_IN_BATCH)) {
+			for (SelectEntry selectEntry : this.orderList) {
+				CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+					try {
+						this.fillSelectEntry(_part_bundles, selectEntry, fillTable);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				});
+				futures.add(future);
 			}
-			for (CompletableFuture<Void> future : futures) {
-				future.get(300, TimeUnit.SECONDS);
+		}
+		for (CompletableFuture<Void> future : futures) {
+			future.get(300, TimeUnit.SECONDS);
+		}
+		Table table = this.order(fillTable);
+		if (null == group) {
+			for (Row row : table) {
+				os.add(row.bundle);
 			}
-			Table table = this.order(fillTable);
-			if (null == group) {
-				for (Row row : table) {
+		} else {
+			for (GroupRow groupRow : group(table)) {
+				for (Row row : groupRow.list) {
 					os.add(row.bundle);
 				}
-			} else {
-				for (GroupRow groupRow : group(table)) {
-					for (Row row : groupRow.list) {
-						os.add(row.bundle);
-					}
-				}
 			}
-			return os;
 		}
+		return os;
 	}
 
 	private String name(String str) {
@@ -457,106 +447,107 @@ public abstract class Plan extends GsonPropertyObject {
 		return table;
 	}
 
-	private void fillSelectEntry(EntityManagerContainer emc, List<String> bundles, SelectEntry selectEntry, Table table)
-			throws Exception {
+	private void fillSelectEntry(List<String> bundles, SelectEntry selectEntry, Table table) throws Exception {
 		/* oracle 将empty string 自动转换成null,需要判断 */
-		EntityManager em = emc.get(Item.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
-		Root<Item> root = cq.from(Item.class);
-		Predicate p = cb.isMember(root.get(Item_.bundle), cb.literal(bundles));
-		String[] paths = StringUtils.split(selectEntry.path, ".");
-		if ((paths.length > 0) && StringUtils.isNotEmpty(paths[0])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path0), paths[0]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path0)), cb.equal(root.get(Item_.path0), "")));
-		}
-		if ((paths.length > 1) && StringUtils.isNotEmpty(paths[1])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path1), paths[1]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path1)), cb.equal(root.get(Item_.path1), "")));
-		}
-		if ((paths.length > 2) && StringUtils.isNotEmpty(paths[2])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path2), paths[2]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path2)), cb.equal(root.get(Item_.path2), "")));
-		}
-		if ((paths.length > 3) && StringUtils.isNotEmpty(paths[3])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path3), paths[3]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path3)), cb.equal(root.get(Item_.path3), "")));
-		}
-		if ((paths.length > 4) && StringUtils.isNotEmpty(paths[4])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path4), paths[4]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path4)), cb.equal(root.get(Item_.path4), "")));
-		}
-		if ((paths.length > 5) && StringUtils.isNotEmpty(paths[5])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path5), paths[5]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path5)), cb.equal(root.get(Item_.path5), "")));
-		}
-		if ((paths.length > 6) && StringUtils.isNotEmpty(paths[6])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path6), paths[6]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path6)), cb.equal(root.get(Item_.path6), "")));
-		}
-		if ((paths.length > 7) && StringUtils.isNotEmpty(paths[7])) {
-			p = cb.and(p, cb.equal(root.get(Item_.path7), paths[7]));
-		} else {
-			p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path7)), cb.equal(root.get(Item_.path7), "")));
-		}
-		cq.multiselect(root.get(Item_.bundle), root.get(Item_.itemPrimitiveType), root.get(Item_.itemStringValueType),
-				root.get(Item_.stringShortValue), root.get(Item_.stringLongValue), root.get(Item_.dateValue),
-				root.get(Item_.timeValue), root.get(Item_.dateTimeValue), root.get(Item_.booleanValue),
-				root.get(Item_.numberValue)).where(p);
-		List<Tuple> list = em.createQuery(cq).getResultList();
-		Row row = null;
-		for (Tuple o : list) {
-			row = table.get(Objects.toString(o.get(0)));
-			switch (ItemPrimitiveType.valueOf(Objects.toString(o.get(1)))) {
-			case s:
-				switch (ItemStringValueType.valueOf(Objects.toString(o.get(2)))) {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EntityManager em = emc.get(Item.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
+			Root<Item> root = cq.from(Item.class);
+			Predicate p = cb.isMember(root.get(Item_.bundle), cb.literal(bundles));
+			String[] paths = StringUtils.split(selectEntry.path, ".");
+			if ((paths.length > 0) && StringUtils.isNotEmpty(paths[0])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path0), paths[0]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path0)), cb.equal(root.get(Item_.path0), "")));
+			}
+			if ((paths.length > 1) && StringUtils.isNotEmpty(paths[1])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path1), paths[1]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path1)), cb.equal(root.get(Item_.path1), "")));
+			}
+			if ((paths.length > 2) && StringUtils.isNotEmpty(paths[2])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path2), paths[2]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path2)), cb.equal(root.get(Item_.path2), "")));
+			}
+			if ((paths.length > 3) && StringUtils.isNotEmpty(paths[3])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path3), paths[3]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path3)), cb.equal(root.get(Item_.path3), "")));
+			}
+			if ((paths.length > 4) && StringUtils.isNotEmpty(paths[4])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path4), paths[4]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path4)), cb.equal(root.get(Item_.path4), "")));
+			}
+			if ((paths.length > 5) && StringUtils.isNotEmpty(paths[5])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path5), paths[5]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path5)), cb.equal(root.get(Item_.path5), "")));
+			}
+			if ((paths.length > 6) && StringUtils.isNotEmpty(paths[6])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path6), paths[6]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path6)), cb.equal(root.get(Item_.path6), "")));
+			}
+			if ((paths.length > 7) && StringUtils.isNotEmpty(paths[7])) {
+				p = cb.and(p, cb.equal(root.get(Item_.path7), paths[7]));
+			} else {
+				p = cb.and(p, cb.or(cb.isNull(root.get(Item_.path7)), cb.equal(root.get(Item_.path7), "")));
+			}
+			cq.multiselect(root.get(Item_.bundle), root.get(Item_.itemPrimitiveType),
+					root.get(Item_.itemStringValueType), root.get(Item_.stringShortValue),
+					root.get(Item_.stringLongValue), root.get(Item_.dateValue), root.get(Item_.timeValue),
+					root.get(Item_.dateTimeValue), root.get(Item_.booleanValue), root.get(Item_.numberValue)).where(p);
+			List<Tuple> list = em.createQuery(cq).getResultList();
+			Row row = null;
+			for (Tuple o : list) {
+				row = table.get(Objects.toString(o.get(0)));
+				switch (ItemPrimitiveType.valueOf(Objects.toString(o.get(1)))) {
 				case s:
-					if (null != o.get(3)) {
-						if ((null != o.get(4)) && StringUtils.isNotEmpty(Objects.toString(o.get(4)))) {
-							row.put(selectEntry.getColumn(), Objects.toString(o.get(4)));
-						} else {
-							row.put(selectEntry.getColumn(), Objects.toString(o.get(3)));
+					switch (ItemStringValueType.valueOf(Objects.toString(o.get(2)))) {
+					case s:
+						if (null != o.get(3)) {
+							if ((null != o.get(4)) && StringUtils.isNotEmpty(Objects.toString(o.get(4)))) {
+								row.put(selectEntry.getColumn(), Objects.toString(o.get(4)));
+							} else {
+								row.put(selectEntry.getColumn(), Objects.toString(o.get(3)));
+							}
 						}
+						break;
+					case d:
+						if (null != o.get(5)) {
+							row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(5)));
+						}
+						break;
+					case t:
+						if (null != o.get(6)) {
+							row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(6)));
+						}
+						break;
+					case dt:
+						if (null != o.get(7)) {
+							row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(7)));
+						}
+						break;
+					default:
+						break;
 					}
 					break;
-				case d:
-					if (null != o.get(5)) {
-						row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(5)));
-					}
-					break;
-				case t:
-					if (null != o.get(6)) {
-						row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(6)));
+				case b:
+					if (null != o.get(8)) {
+						row.put(selectEntry.getColumn(), (Boolean) o.get(8));
 					}
 					break;
-				case dt:
-					if (null != o.get(7)) {
-						row.put(selectEntry.getColumn(), JpaObjectTools.confirm((Date) o.get(7)));
+				case n:
+					if (null != o.get(9)) {
+						row.put(selectEntry.getColumn(), (Number) o.get(9));
 					}
 					break;
 				default:
 					break;
 				}
-				break;
-			case b:
-				if (null != o.get(8)) {
-					row.put(selectEntry.getColumn(), (Boolean) o.get(8));
-				}
-				break;
-			case n:
-				if (null != o.get(9)) {
-					row.put(selectEntry.getColumn(), (Number) o.get(9));
-				}
-				break;
-			default:
-				break;
 			}
 		}
 	}

+ 32 - 29
o2server/x_query_core_express/src/main/java/com/x/query/core/express/plan/ProcessPlatformPlan.java

@@ -20,6 +20,7 @@ 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.entity.dataitem.ItemCategory;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.logger.Logger;
@@ -90,22 +91,22 @@ public class ProcessPlatformPlan extends Plan {
 		this.selectList = list;
 	}
 
-	List<String> listBundle(EntityManagerContainer emc) throws Exception {
+	List<String> listBundle() throws Exception {
 		List<String> jobs = new TreeList<>();
 		switch (StringUtils.trim(this.where.scope)) {
 		case (SCOPE_ALL):
-			jobs = ListUtils.union(this.listBundle_workCompleted(emc), this.listBundle_work(emc));
+			jobs = ListUtils.union(this.listBundle_workCompleted(), this.listBundle_work());
 			break;
 		case (SCOPE_WORKCOMPLETED):
-			jobs = this.listBundle_workCompleted(emc);
+			jobs = this.listBundle_workCompleted();
 			break;
 		default:
-			jobs = this.listBundle_work(emc);
+			jobs = this.listBundle_work();
 			break;
 		}
 		if (BooleanUtils.isTrue(this.where.accessible)) {
 			if (StringUtils.isNotEmpty(runtime.person)) {
-				jobs = this.listBundle_accessible(emc, jobs, runtime.person);
+				jobs = this.listBundle_accessible(jobs, runtime.person);
 			}
 		}
 		/** 针对DataItem进行判断 */
@@ -116,7 +117,7 @@ public class ProcessPlatformPlan extends Plan {
 			}
 		}
 		if (!filterEntries.isEmpty()) {
-			jobs = listBundle_filterEntry(emc, jobs, filterEntries);
+			jobs = listBundle_filterEntry(jobs, filterEntries);
 		}
 		filterEntries.clear();
 		for (FilterEntry _o : ListTools.trim(this.runtime.filterList, true, true)) {
@@ -125,39 +126,42 @@ public class ProcessPlatformPlan extends Plan {
 			}
 		}
 		if (!filterEntries.isEmpty()) {
-			jobs = listBundle_filterEntry(emc, jobs, filterEntries);
+			jobs = listBundle_filterEntry(jobs, filterEntries);
 		}
 		return jobs;
 	}
 
-	private List<String> listBundle_work(EntityManagerContainer emc) throws Exception {
-		EntityManager em = emc.get(Work.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<String> cq = cb.createQuery(String.class);
-		Root<Work> root = cq.from(Work.class);
-		cq.select(root.get(Work_.job)).where(this.where.workPredicate(cb, root));
-		List<String> jobs = em.createQuery(cq).getResultList();
-		return jobs.stream().distinct().collect(Collectors.toList());
+	private List<String> listBundle_work() throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EntityManager em = emc.get(Work.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<String> cq = cb.createQuery(String.class);
+			Root<Work> root = cq.from(Work.class);
+			cq.select(root.get(Work_.job)).where(this.where.workPredicate(cb, root));
+			List<String> jobs = em.createQuery(cq).getResultList();
+			return jobs.stream().distinct().collect(Collectors.toList());
+		}
 	}
 
-	private List<String> listBundle_workCompleted(EntityManagerContainer emc) throws Exception {
-		EntityManager em = emc.get(WorkCompleted.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<String> cq = cb.createQuery(String.class);
-		Root<WorkCompleted> root = cq.from(WorkCompleted.class);
-		cq.select(root.get(WorkCompleted_.job)).where(this.where.workCompletedPredicate(cb, root));
-		List<String> jobs = em.createQuery(cq).getResultList();
-		return jobs.stream().distinct().collect(Collectors.toList());
+	private List<String> listBundle_workCompleted() throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			EntityManager em = emc.get(WorkCompleted.class);
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<String> cq = cb.createQuery(String.class);
+			Root<WorkCompleted> root = cq.from(WorkCompleted.class);
+			cq.select(root.get(WorkCompleted_.job)).where(this.where.workCompletedPredicate(cb, root));
+			List<String> jobs = em.createQuery(cq).getResultList();
+			return jobs.stream().distinct().collect(Collectors.toList());
+		}
 	}
 
-	private List<String> listBundle_accessible(EntityManagerContainer emc, List<String> jobs, String person)
-			throws Exception {
+	private List<String> listBundle_accessible(List<String> jobs, String person) throws Exception {
 		logger.debug("开始过滤权限.");
 		List<String> list = new TreeList<>();
 		List<CompletableFuture<List<String>>> futures = new TreeList<>();
 		for (List<String> _part_bundles : ListTools.batch(jobs, SQL_STATEMENT_IN_BATCH)) {
 			CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
-				try {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 					EntityManager em = emc.get(Review.class);
 					CriteriaBuilder cb = em.getCriteriaBuilder();
 					CriteriaQuery<String> cq = cb.createQuery(String.class);
@@ -187,8 +191,7 @@ public class ProcessPlatformPlan extends Plan {
 		return list;
 	}
 
-	private List<String> listBundle_filterEntry(EntityManagerContainer emc, List<String> jobs,
-			List<FilterEntry> filterEntries) throws Exception {
+	private List<String> listBundle_filterEntry(List<String> jobs, List<FilterEntry> filterEntries) throws Exception {
 		/** 运行FilterEntry */
 		List<String> partJobs = new TreeList<>();
 		List<List<String>> batch_jobs = ListTools.batch(jobs, SQL_STATEMENT_IN_BATCH);
@@ -199,7 +202,7 @@ public class ProcessPlatformPlan extends Plan {
 			List<CompletableFuture<List<String>>> futures = new TreeList<>();
 			for (List<String> _batch : batch_jobs) {
 				CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
-					try {
+					try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 						EntityManager em = emc.get(Item.class);
 						CriteriaBuilder cb = em.getCriteriaBuilder();
 						CriteriaQuery<String> cq = cb.createQuery(String.class);