Zhou Rui преди 5 години
родител
ревизия
8af7c37d8c
променени са 16 файла, в които са добавени 338 реда и са изтрити 112 реда
  1. 7 10
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java
  2. 5 9
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java
  3. 8 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/BaseAction.java
  4. 12 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ExceptionNameInvalid.java
  5. 7 10
      o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java
  6. 5 9
      o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java
  7. 8 0
      o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/BaseAction.java
  8. 4 17
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/task/ActionPassExpired.java
  9. 11 8
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionAssignCreate.java
  10. 1 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/WorkAction.java
  11. 14 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeCreateRecord.java
  12. 13 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokePassExpired.java
  13. 13 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeProcessingTask.java
  14. 13 0
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeProcessingWork.java
  15. 2 2
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionPassExpired.java
  16. 215 47
      o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/PassExpired.java

+ 7 - 10
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java

@@ -1,18 +1,13 @@
 package com.x.organization.assemble.control.jaxrs.unit;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
-import com.x.base.core.project.Applications;
-import com.x.base.core.project.x_message_assemble_communicate;
+import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
@@ -20,12 +15,11 @@ 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.organization.assemble.control.Business;
-import com.x.organization.assemble.control.ThisApplication;
-import com.x.organization.assemble.control.message.OrgBodyMessage;
-import com.x.organization.assemble.control.message.OrgMessage;
 import com.x.organization.assemble.control.message.OrgMessageFactory;
 import com.x.organization.core.entity.Unit;
 
+import org.apache.commons.lang3.StringUtils;
+
 class ActionCreate extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionCreate.class);
 	
@@ -61,13 +55,16 @@ class ActionCreate extends BaseAction {
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
+			if (this.checkNameInvalid(business,unit)){
+				throw new ExceptionNameInvalid(unit.getName());
+			}
 			/** 判断同一级别下name不重复 */
 			if (this.duplicateName(business, unit)) {
 				throw new ExceptionDuplicateName(unit.getName());
 			}
 			emc.beginTransaction(Unit.class);
 			business.unit().adjustInherit(unit);
-			emc.persist(unit);
+			emc.persist(unit,CheckPersistType.all);
 			emc.commit();
 			ApplicationCache.notify(Unit.class);
 			

+ 5 - 9
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java

@@ -9,20 +9,15 @@ 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.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.annotation.CheckPersistType;
-import com.x.base.core.project.Applications;
-import com.x.base.core.project.x_message_assemble_communicate;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
@@ -30,16 +25,14 @@ 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.organization.assemble.control.Business;
-import com.x.organization.assemble.control.ThisApplication;
-import com.x.organization.assemble.control.message.OrgBodyMessage;
-import com.x.organization.assemble.control.message.OrgMessage;
 import com.x.organization.assemble.control.message.OrgMessageFactory;
 import com.x.organization.core.entity.Identity;
 import com.x.organization.core.entity.Identity_;
-import com.x.organization.core.entity.Person;
 import com.x.organization.core.entity.Unit;
 import com.x.organization.core.entity.Unit_;
 
+import org.apache.commons.lang3.StringUtils;
+
 class ActionEdit extends BaseAction {
 
 	@SuppressWarnings("unused")
@@ -75,6 +68,9 @@ class ActionEdit extends BaseAction {
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
+			if (this.checkNameInvalid(business,unit)){
+				throw new ExceptionNameInvalid(unit.getName());
+			}
 			/** 判断同一级别下name不重复 */
 			if (this.duplicateName(business, unit)) {
 				throw new ExceptionDuplicateName(unit.getName());

+ 8 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/BaseAction.java

@@ -45,6 +45,14 @@ abstract class BaseAction extends StandardJaxrsAction {
 		return count > 0;
 	}
 
+	protected boolean checkNameInvalid(Business business, Unit unit) throws Exception {
+		if (StringUtils.containsAny(unit.getName(), new String[] { "\\","/"})) {
+			return true;
+		}
+		return false;
+
+	}
+
 	public static class Control extends GsonPropertyObject {
 
 		private Boolean allowEdit = false;

+ 12 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ExceptionNameInvalid.java

@@ -0,0 +1,12 @@
+package com.x.organization.assemble.control.jaxrs.unit;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionNameInvalid extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionNameInvalid(String name) {
+		super("组织 {} 名称不符合要求.", name);
+	}
+}

+ 7 - 10
o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java

@@ -1,18 +1,13 @@
 package com.x.organization.assemble.control.jaxrs.unit;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
-import com.x.base.core.project.Applications;
-import com.x.base.core.project.x_message_assemble_communicate;
+import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
@@ -20,12 +15,11 @@ 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.organization.assemble.control.Business;
-import com.x.organization.assemble.control.ThisApplication;
-import com.x.organization.assemble.control.message.OrgBodyMessage;
-import com.x.organization.assemble.control.message.OrgMessage;
 import com.x.organization.assemble.control.message.OrgMessageFactory;
 import com.x.organization.core.entity.Unit;
 
+import org.apache.commons.lang3.StringUtils;
+
 class ActionCreate extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionCreate.class);
 	
@@ -61,13 +55,16 @@ class ActionCreate extends BaseAction {
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
+			if (this.checkNameInvalid(business,unit)){
+				throw new ExceptionNameInvalid(unit.getName());
+			}
 			/** 判断同一级别下name不重复 */
 			if (this.duplicateName(business, unit)) {
 				throw new ExceptionDuplicateName(unit.getName());
 			}
 			emc.beginTransaction(Unit.class);
 			business.unit().adjustInherit(unit);
-			emc.persist(unit);
+			emc.persist(unit,CheckPersistType.all);
 			emc.commit();
 			ApplicationCache.notify(Unit.class);
 			

+ 5 - 9
o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java

@@ -9,20 +9,15 @@ 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.Gson;
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.annotation.CheckPersistType;
-import com.x.base.core.project.Applications;
-import com.x.base.core.project.x_message_assemble_communicate;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
 import com.x.base.core.project.cache.ApplicationCache;
-import com.x.base.core.project.connection.ActionResponse;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
@@ -30,16 +25,14 @@ 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.organization.assemble.control.Business;
-import com.x.organization.assemble.control.ThisApplication;
-import com.x.organization.assemble.control.message.OrgBodyMessage;
-import com.x.organization.assemble.control.message.OrgMessage;
 import com.x.organization.assemble.control.message.OrgMessageFactory;
 import com.x.organization.core.entity.Identity;
 import com.x.organization.core.entity.Identity_;
-import com.x.organization.core.entity.Person;
 import com.x.organization.core.entity.Unit;
 import com.x.organization.core.entity.Unit_;
 
+import org.apache.commons.lang3.StringUtils;
+
 class ActionEdit extends BaseAction {
 
 	@SuppressWarnings("unused")
@@ -75,6 +68,9 @@ class ActionEdit extends BaseAction {
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
+			if (this.checkNameInvalid(business,unit)){
+				throw new ExceptionNameInvalid(unit.getName());
+			}
 			/** 判断同一级别下name不重复 */
 			if (this.duplicateName(business, unit)) {
 				throw new ExceptionDuplicateName(unit.getName());

+ 8 - 0
o2server/x_organization_assemble_control/src/main/webapp/describe/sources/com/x/organization/assemble/control/jaxrs/unit/BaseAction.java

@@ -45,6 +45,14 @@ abstract class BaseAction extends StandardJaxrsAction {
 		return count > 0;
 	}
 
+	protected boolean checkNameInvalid(Business business, Unit unit) throws Exception {
+		if (StringUtils.containsAny(unit.getName(), new String[] { "\\","/"})) {
+			return true;
+		}
+		return false;
+
+	}
+
 	public static class Control extends GsonPropertyObject {
 
 		private Boolean allowEdit = false;

+ 4 - 17
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/task/ActionPassExpired.java

@@ -5,13 +5,11 @@ import java.util.concurrent.Callable;
 
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
-import com.x.base.core.project.Applications;
-import com.x.base.core.project.x_processplatform_service_processing;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
-import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
@@ -23,7 +21,6 @@ import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.Route;
 import com.x.processplatform.service.processing.Business;
 import com.x.processplatform.service.processing.MessageFactory;
-import com.x.processplatform.service.processing.ThisApplication;
 
 class ActionPassExpired extends BaseAction {
 
@@ -45,19 +42,17 @@ class ActionPassExpired extends BaseAction {
 			public ActionResult<Wo> call() throws Exception {
 				ActionResult<Wo> result = new ActionResult<>();
 				Wo wo = new Wo();
+				wo.setValue(false);
 				String taskId = null;
 				String taskTitle = null;
 				String taskSequence = null;
-				String job = null;
 				try {
-					try {
 						try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 							Task task = emc.find(id, Task.class);
 							if (null != task) {
 								taskId = task.getId();
 								taskTitle = task.getTitle();
 								taskSequence = task.getSequence();
-								job = task.getJob();
 								Business business = new Business(emc);
 								Manual manual = manual(business, task);
 								if (null == manual) {
@@ -70,20 +65,12 @@ class ActionPassExpired extends BaseAction {
 								emc.beginTransaction(Task.class);
 								task.setRouteName(route.getName());
 								emc.commit();
+								wo.setValue(true);
 								MessageFactory.task_expire(task);
 								logger.print("执行过期待办默认路由, id:{}, title:{}, sequence:{}.", taskId, taskTitle,
 										taskSequence);
 							}
 						}
-						ThisApplication.context().applications()
-								.getQuery(x_processplatform_service_processing.class,
-										Applications.joinQueryUri("task", taskId, "processing"), job)
-								.getData(WoId.class);
-
-					} catch (Exception e) {
-						throw new ExceptionExpired(e, taskId, taskTitle, taskSequence);
-					}
-
 				} catch (Exception e) {
 					logger.error(e);
 				}
@@ -96,7 +83,7 @@ class ActionPassExpired extends BaseAction {
 
 	}
 
-	public static class Wo extends WoId {
+	public static class Wo extends WrapBoolean {
 
 	}
 

+ 11 - 8
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/work/ActionAssignCreate.java

@@ -44,6 +44,7 @@ import com.x.processplatform.core.entity.element.Process_;
 import com.x.processplatform.core.express.ProcessingAttributes;
 import com.x.processplatform.service.processing.Business;
 import com.x.processplatform.service.processing.MessageFactory;
+import com.x.processplatform.service.processing.Processing;
 import com.x.processplatform.service.processing.ThisApplication;
 import com.x.processplatform.service.processing.WorkDataHelper;
 
@@ -51,11 +52,11 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 /**
- * 创建处于start状态的work 此方法不需要进入队列运行
+ * 创建处于start状态的work
  * 
  * @author Rui
  *
- * 此方法不需要推入线程池运行
+ *         此方法不需要推入线程池运行
  */
 class ActionAssignCreate extends BaseAction {
 
@@ -69,7 +70,6 @@ class ActionAssignCreate extends BaseAction {
 		Boolean processing = wi.getProcessing();
 
 		Work work = null;
-
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			Business business = new Business(emc);
 			List<String> applicationIds = listApplication(business, wi.getApplication());
@@ -122,13 +122,16 @@ class ActionAssignCreate extends BaseAction {
 			emc.commit();
 		}
 		MessageFactory.work_create(work);
+		// if (BooleanUtils.isTrue(processing)) {
+		// ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
+		// Applications.joinQueryUri("work", work.getId(), "processing"), null,
+		// work.getJob());
+		// }
 		if (BooleanUtils.isTrue(processing)) {
-			// ProcessingAttributes req = new ProcessingAttributes();
-			// req.setType(ProcessingAttributes.TYPE_BEGIN);
-			ThisApplication.context().applications().putQuery(x_processplatform_service_processing.class,
-					Applications.joinQueryUri("work", work.getId(), "processing"), null, work.getJob());
+			ProcessingAttributes processingAttributes = new ProcessingAttributes();
+			Processing p = new Processing(processingAttributes);
+			p.processing(work.getId());
 		}
- 
 		wo.setId(work.getId());
 		result.setData(wo);
 		return result;

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

@@ -27,6 +27,7 @@ import com.x.base.core.project.jaxrs.ResponseFactory;
 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.processplatform.core.entity.element.ActivityType;
 
 @Path("work")
 @JaxrsDescribe("工作")

+ 14 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeCreateRecord.java

@@ -0,0 +1,14 @@
+package com.x.processplatform.service.processing.schedule;
+
+import com.x.base.core.project.exception.PromptException;
+import com.x.processplatform.core.entity.content.Record;
+
+class ExceptionInvokeCreateRecord extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionInvokeCreateRecord(Record record) {
+		super("调用创建记录失败, record:{}.", record);
+	}
+
+}

+ 13 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokePassExpired.java

@@ -0,0 +1,13 @@
+package com.x.processplatform.service.processing.schedule;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionInvokePassExpired extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionInvokePassExpired(String id) {
+		super("调用待办过期, id:{}.", id);
+	}
+
+}

+ 13 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeProcessingTask.java

@@ -0,0 +1,13 @@
+package com.x.processplatform.service.processing.schedule;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionInvokeProcessingTask extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionInvokeProcessingTask(String id) {
+		super("调用待办流转失败, id:{}.", id);
+	}
+
+}

+ 13 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionInvokeProcessingWork.java

@@ -0,0 +1,13 @@
+package com.x.processplatform.service.processing.schedule;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionInvokeProcessingWork extends PromptException {
+
+	private static final long serialVersionUID = -7038279889683420366L;
+
+	ExceptionInvokeProcessingWork(String id) {
+		super("调用工作流转失败, id:{}.", id);
+	}
+
+}

+ 2 - 2
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/ExceptionPassExpired.java

@@ -6,8 +6,8 @@ class ExceptionPassExpired extends PromptException {
 
 	private static final long serialVersionUID = -7038279889683420366L;
 
-	ExceptionPassExpired(Exception e, String id, String title, String sequence) {
-		super(e, "超时工作默认路由流转失败, id:{}, title:{}, sequence:{}.");
+	ExceptionPassExpired(Exception e, String id, String title) {
+		super(e, "超时工作默认路由流转失败, id:{}, title:{}.", id, title);
 	}
 
 }

+ 215 - 47
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/schedule/PassExpired.java

@@ -5,6 +5,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Tuple;
@@ -14,29 +15,40 @@ import javax.persistence.criteria.Path;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
-import org.apache.commons.lang3.StringUtils;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
-import com.x.base.core.project.annotation.FieldDescribe;
-import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.schedule.AbstractJob;
 import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.tools.StringTools;
 import com.x.base.core.project.utils.time.TimeStamp;
-import com.x.processplatform.core.entity.content.ProcessingType;
+import com.x.processplatform.core.entity.content.Record;
+import com.x.processplatform.core.entity.content.RecordProperties.NextManual;
 import com.x.processplatform.core.entity.content.Task;
+import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Task_;
+import com.x.processplatform.core.entity.content.WorkLog;
 import com.x.processplatform.core.entity.element.Manual;
 import com.x.processplatform.core.entity.element.Route;
+import com.x.processplatform.core.express.ProcessingAttributes;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapProcessing;
+import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapUpdatePrevTaskIdentity;
+import com.x.processplatform.core.express.service.processing.jaxrs.taskcompleted.WrapUpdateNextTaskIdentity;
+import com.x.processplatform.service.processing.Business;
 import com.x.processplatform.service.processing.ThisApplication;
 
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
 public class PassExpired extends AbstractJob {
 
 	private static Logger logger = LoggerFactory.getLogger(PassExpired.class);
@@ -50,9 +62,7 @@ public class PassExpired extends AbstractJob {
 			Map<String, Route> manualToRoute = null;
 			AtomicInteger count = new AtomicInteger(0);
 			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-				if (null == manualToRoute) {
-					manualToRoute = this.linkPassExpiredManualToRoute(emc);
-				}
+				manualToRoute = this.linkPassExpiredManualToRoute(emc);
 			}
 			if (!manualToRoute.isEmpty()) {
 				do {
@@ -63,17 +73,9 @@ public class PassExpired extends AbstractJob {
 						sequence = targets.get(targets.size() - 1).getSequence();
 						for (Task task : targets) {
 							try {
-								try {
-									ThisApplication.context().applications()
-											.getQuery(x_processplatform_service_processing.class,
-													Applications.joinQueryUri("task", task.getId(), "pass", "expired"),
-													task.getJob())
-											.getData(WoId.class);
-									count.incrementAndGet();
-								} catch (Exception e) {
-									throw new ExceptionPassExpired(e, task.getId(), task.getTitle(),
-											task.getSequence());
-								}
+								logger.print("执行超时工作默认路由流转:{}, id:{}.", task.getTitle(), task.getId());
+								this.execute(task);
+								count.incrementAndGet();
 							} catch (Exception e) {
 								logger.error(e);
 							}
@@ -87,6 +89,195 @@ public class PassExpired extends AbstractJob {
 		}
 	}
 
+	private void execute(Task task) throws Exception {
+		try {
+			String series = StringTools.uniqueToken();
+			WorkLog workLog = null;
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				workLog = emc.firstEqualAndEqual(WorkLog.class, WorkLog.job_FIELDNAME, task.getJob(),
+						WorkLog.fromActivityToken_FIELDNAME, task.getActivityToken());
+			}
+			this.passExpired(task);
+			String taskCompletedId = this.porcessingTask(task);
+			this.porcessingWork(task, series);
+			List<Task> newTasks = new ArrayList<>();
+			Record record = this.record(workLog, task, taskCompletedId, series, newTasks);
+			this.updateTask(task, newTasks);
+			this.updateTaskCompleted(taskCompletedId, record);
+		} catch (Exception e) {
+			throw new ExceptionPassExpired(e, task.getId(), task.getTitle());
+		}
+	}
+
+	private void passExpired(Task task) throws Exception {
+		WrapBoolean respOfPassExpired = ThisApplication.context().applications()
+				.getQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("task", task.getId(), "pass", "expired"), task.getJob())
+				.getData(WrapBoolean.class);
+		if (BooleanUtils.isNotTrue(respOfPassExpired.getValue())) {
+			throw new ExceptionInvokePassExpired(task.getId());
+		}
+	}
+
+	private String porcessingTask(Task task) throws Exception {
+		WrapProcessing req = new WrapProcessing();
+		req.setProcessingType(TaskCompleted.PROCESSINGTYPE_PASSEXPIRED);
+		WoId resp = ThisApplication.context().applications()
+				.putQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("task", task.getId(), "processing"), req, task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionInvokeProcessingTask(task.getId());
+		} else {
+			return resp.getId();
+		}
+	}
+
+	private void porcessingWork(Task task, String series) throws Exception {
+		ProcessingAttributes req = new ProcessingAttributes();
+		req.setType(ProcessingAttributes.TYPE_TASK);
+		req.setSeries(series);
+		WoId resp = ThisApplication.context().applications()
+				.putQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("work", task.getWork(), "processing"), req, task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionInvokeProcessingWork(task.getId());
+		}
+	}
+
+	private Record record(WorkLog workLog, Task task, String taskCompletedId, String series, List<Task> newTasks)
+			throws Exception {
+		Record record = new Record(workLog, task);
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			final List<String> nextTaskIdentities = new ArrayList<>();
+			record.getProperties().setElapsed(
+					Config.workTime().betweenMinutes(record.getProperties().getStartTime(), record.getRecordTime()));
+			record.setType(Record.TYPE_PASSEXPIRED);
+			List<Task> list = emc.fetchEqualAndEqual(Task.class,
+					ListTools.toList(Task.person_FIELDNAME, Task.identity_FIELDNAME, Task.unit_FIELDNAME,
+							Task.job_FIELDNAME, Task.work_FIELDNAME, Task.activity_FIELDNAME,
+							Task.activityAlias_FIELDNAME, Task.activityName_FIELDNAME, Task.activityToken_FIELDNAME,
+							Task.activityType_FIELDNAME, Task.empowerFromIdentity_FIELDNAME),
+					Task.job_FIELDNAME, task.getJob(), Task.series_FIELDNAME, series);
+			list.stream().collect(Collectors.groupingBy(Task::getActivity, Collectors.toList())).entrySet().stream()
+					.forEach(o -> {
+						Task t = o.getValue().get(0);
+						NextManual nextManual = new NextManual();
+						nextManual.setActivity(t.getActivity());
+						nextManual.setActivityAlias(t.getActivityAlias());
+						nextManual.setActivityName(t.getActivityName());
+						nextManual.setActivityToken(t.getActivityToken());
+						nextManual.setActivityType(t.getActivityType());
+						for (Task obj : o.getValue()) {
+							nextManual.getTaskIdentityList().add(obj.getIdentity());
+							newTasks.add(obj);
+							nextTaskIdentities.add(obj.getIdentity());
+						}
+						record.getProperties().getNextManualList().add(nextManual);
+					});
+			/* 去重 */
+			record.getProperties().setNextManualTaskIdentityList(ListTools.trim(nextTaskIdentities, true, true));
+			TaskCompleted taskCompleted = emc.find(taskCompletedId, TaskCompleted.class);
+			if (null != taskCompleted) {
+				/* 处理完成后在重新写入待办信息 */
+				record.getProperties().setOpinion(taskCompleted.getOpinion());
+				record.getProperties().setRouteName(taskCompleted.getRouteName());
+				record.getProperties().setMediaOpinion(taskCompleted.getMediaOpinion());
+			}
+		}
+		WoId resp = ThisApplication.context().applications()
+				.postQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("record", "job", task.getJob()), record, task.getJob())
+				.getData(WoId.class);
+		if (StringUtils.isBlank(resp.getId())) {
+			throw new ExceptionInvokeCreateRecord(record);
+		}
+		return record;
+	}
+
+	private void updateTaskCompleted(String taskCompletedId, Record record) throws Exception {
+		/* 记录下一处理人信息 */
+		WrapUpdateNextTaskIdentity req = new WrapUpdateNextTaskIdentity();
+		req.getTaskCompletedList().add(taskCompletedId);
+		req.setNextTaskIdentityList(record.getProperties().getNextManualTaskIdentityList());
+		ThisApplication.context().applications()
+				.putQuery(x_processplatform_service_processing.class,
+						Applications.joinQueryUri("taskcompleted", "next", "task", "identity"), req, record.getJob())
+				.getData(WrapBoolean.class);
+	}
+
+	private void updateTask(Task task, List<Task> list) throws Exception {
+		/* 记录上一处理人信息 */
+		if (ListTools.isNotEmpty(list)) {
+			WrapUpdatePrevTaskIdentity req = new WrapUpdatePrevTaskIdentity();
+			req.setTaskList(ListTools.extractProperty(list, Task.id_FIELDNAME, String.class, true, true));
+			req.getPrevTaskIdentityList().add(task.getIdentity());
+			ThisApplication.context().applications()
+					.putQuery(x_processplatform_service_processing.class,
+							Applications.joinQueryUri("task", "prev", "task", "identity"), req, task.getJob())
+					.getData(WrapBoolean.class);
+		}
+		List<Task> empowerTasks = new ArrayList<>();
+		for (Task o : list) {
+			if (StringUtils.isNotEmpty(o.getEmpowerFromIdentity())
+					&& (!StringUtils.equals(o.getEmpowerFromIdentity(), o.getIdentity()))) {
+				empowerTasks.add(o);
+			}
+		}
+		if (!empowerTasks.isEmpty()) {
+			List<Record> empowerRecords = new ArrayList<>();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				Business business = new Business(emc);
+				for (Task o : empowerTasks) {
+					empowerRecords.add(createEmpowerRecord(business, o));
+				}
+			}
+			for (Record r : empowerRecords) {
+				ThisApplication.context().applications()
+						.postQuery(x_processplatform_service_processing.class,
+								Applications.joinQueryUri("record", "job", task.getJob()), r, task.getJob())
+						.getData(WoId.class);
+			}
+		}
+	}
+
+	private Record createEmpowerRecord(Business business, Task task) throws Exception {
+		Record o = new Record();
+		o.setType(Record.TYPE_EMPOWER);
+		o.setApplication(task.getApplication());
+		o.setProcess(task.getProcess());
+		o.setJob(task.getJob());
+		o.setCompleted(false);
+		o.setWork(task.getWork());
+		o.setFromActivity(task.getActivity());
+		o.setFromActivityAlias(task.getActivityAlias());
+		o.setFromActivityName(task.getActivityName());
+		o.setFromActivityToken(task.getActivityToken());
+		o.setFromActivityType(task.getActivityType());
+		o.setArrivedActivity(task.getActivity());
+		o.setArrivedActivityAlias(task.getActivityAlias());
+		o.setArrivedActivityName(task.getActivityName());
+		o.setArrivedActivityToken(task.getActivityToken());
+		o.setArrivedActivityType(task.getActivityType());
+		o.getProperties().setEmpowerToPerson(task.getPerson());
+		o.getProperties().setEmpowerToIdentity(task.getIdentity());
+		o.getProperties().setEmpowerToUnit(task.getUnit());
+		o.setIdentity(task.getEmpowerFromIdentity());
+		o.setPerson(business.organization().person().getWithIdentity(o.getIdentity()));
+		o.setUnit(business.organization().unit().getWithIdentity(o.getIdentity()));
+		o.getProperties().setElapsed(0L);
+		NextManual nextManual = new NextManual();
+		nextManual.setActivity(task.getActivity());
+		nextManual.setActivityAlias(task.getActivityAlias());
+		nextManual.setActivityName(task.getActivityName());
+		nextManual.setActivityToken(task.getActivityToken());
+		nextManual.setActivityType(task.getActivityType());
+		o.getProperties().getNextManualList().add(nextManual);
+		o.getProperties().getNextManualTaskIdentityList().add(task.getIdentity());
+		return o;
+	}
+
 	private List<Task> list(EntityManagerContainer emc, String sequence, Map<String, Route> manualToRoute)
 			throws Exception {
 		EntityManager em = emc.get(Task.class);
@@ -96,12 +287,13 @@ public class PassExpired extends AbstractJob {
 		Path<String> id_path = root.get(Task_.id);
 		Path<String> job_path = root.get(Task_.job);
 		Path<String> sequence_path = root.get(Task_.sequence);
+		Path<String> work_path = root.get(Task_.work);
 		Predicate p = cb.equal(root.get(Task_.expired), true);
 		p = cb.and(p, root.get(Task_.activity).in(manualToRoute.keySet()));
 		if (StringUtils.isNotEmpty(sequence)) {
 			p = cb.and(p, cb.greaterThan(sequence_path, sequence));
 		}
-		cq.multiselect(id_path, job_path, sequence_path).where(p).orderBy(cb.asc(sequence_path));
+		cq.multiselect(id_path, job_path, sequence_path, work_path).where(p).orderBy(cb.asc(sequence_path));
 		List<Tuple> os = em.createQuery(cq).setMaxResults(200).getResultList();
 		List<Task> list = new ArrayList<>();
 		for (Tuple o : os) {
@@ -109,36 +301,12 @@ public class PassExpired extends AbstractJob {
 			task.setId(o.get(id_path));
 			task.setJob(o.get(job_path));
 			task.setSequence(o.get(sequence_path));
+			task.setWork(o.get(work_path));
 			list.add(task);
 		}
 		return list;
 	}
 
-	public static class ReqTaskProcessing extends GsonPropertyObject {
-
-		@FieldDescribe("流转类型.")
-		private ProcessingType processingType;
-
-		@FieldDescribe("最后是否触发work的流转,默认流转.")
-		private Boolean finallyProcessingWork;
-
-		public ProcessingType getProcessingType() {
-			return processingType;
-		}
-
-		public void setProcessingType(ProcessingType processingType) {
-			this.processingType = processingType;
-		}
-
-		public Boolean getFinallyProcessingWork() {
-			return finallyProcessingWork;
-		}
-
-		public void setFinallyProcessingWork(Boolean finallyProcessingWork) {
-			this.finallyProcessingWork = finallyProcessingWork;
-		}
-	}
-
 	private Map<String, Route> linkPassExpiredManualToRoute(EntityManagerContainer emc) throws Exception {
 		List<Route> routes = emc.fetchEqual(Route.class,
 				ListTools.toList(Route.id_FIELDNAME, Route.name_FIELDNAME, Route.opinion_FIELDNAME),