Sfoglia il codice sorgente

修正自动流转无法触发的错误.

Zhou Rui 5 anni fa
parent
commit
82fe46f46e

+ 26 - 23
o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/Record.java

@@ -77,6 +77,9 @@ public class Record extends SliceJpaObject {
 	/* 授权 */
 	/* 授权 */
 	public final static String TYPE_EMPOWER = "empower";
 	public final static String TYPE_EMPOWER = "empower";
 
 
+	/* 超时自动流转 */
+	public final static String TYPE_PASSEXPIRED = "passExpired";
+
 	/* 定制意见 */
 	/* 定制意见 */
 	public final static String TYPE_CUSTOM = "custom";
 	public final static String TYPE_CUSTOM = "custom";
 
 
@@ -101,12 +104,12 @@ public class Record extends SliceJpaObject {
 
 
 	public void onPersist() throws Exception {
 	public void onPersist() throws Exception {
 		switch (Objects.toString(this.type)) {
 		switch (Objects.toString(this.type)) {
-		case TYPE_URGE:
-		case TYPE_EXPIRE:
-			this.display = false;
-			break;
-		default:
-			this.display = true;
+			case TYPE_URGE:
+			case TYPE_EXPIRE:
+				this.display = false;
+				break;
+			default:
+				this.display = true;
 		}
 		}
 	}
 	}
 	/* 更新运行方法 */
 	/* 更新运行方法 */
@@ -130,23 +133,23 @@ public class Record extends SliceJpaObject {
 		this.getProperties().setEmpowerFromIdentity(task.getEmpowerFromIdentity());
 		this.getProperties().setEmpowerFromIdentity(task.getEmpowerFromIdentity());
 	}
 	}
 
 
-//	public Record(Work work) {
-//		this();
-//		this.setApplication(work.getApplication());
-//		this.setProcess(work.getProcess());
-//		this.setWork(work.getId());
-//		this.setJob(work.getJob());
-//		this.setDisplay(true);
-//		this.setCompleted(false);
-//		this.setFromActivity(work.getActivity());
-//		this.setFromActivityType(work.getActivityType());
-//		this.setFromActivityName(work.getActivityName());
-//		this.setFromActivityAlias(work.getActivityAlias());
-//		this.setFromActivityToken(work.getActivityToken());
-////		this.getProperties().setOpinion("");
-////		this.getProperties().setRouteName(task.getRouteName());
-////		this.getProperties().setMediaOpinion(task.getMediaOpinion());
-//	}
+	// public Record(Work work) {
+	// this();
+	// this.setApplication(work.getApplication());
+	// this.setProcess(work.getProcess());
+	// this.setWork(work.getId());
+	// this.setJob(work.getJob());
+	// this.setDisplay(true);
+	// this.setCompleted(false);
+	// this.setFromActivity(work.getActivity());
+	// this.setFromActivityType(work.getActivityType());
+	// this.setFromActivityName(work.getActivityName());
+	// this.setFromActivityAlias(work.getActivityAlias());
+	// this.setFromActivityToken(work.getActivityToken());
+	//// this.getProperties().setOpinion("");
+	//// this.getProperties().setRouteName(task.getRouteName());
+	//// this.getProperties().setMediaOpinion(task.getMediaOpinion());
+	// }
 
 
 	public Record(WorkLog workLog) {
 	public Record(WorkLog workLog) {
 		this();
 		this();

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

@@ -70,7 +70,7 @@ public class TaskCompleted extends SliceJpaObject implements ProjectionInterface
 	/* 智能流转 */
 	/* 智能流转 */
 	public static final String PROCESSINGTYPE_SAMETARGET = "sameTarget";
 	public static final String PROCESSINGTYPE_SAMETARGET = "sameTarget";
 	/* 超时流转 */
 	/* 超时流转 */
-	public static final String PROCESSINGTYPE_EXPIRE = "expire";
+	public static final String PROCESSINGTYPE_PASSEXPIRED = "passExpired";
 	/* 管理员流转 */
 	/* 管理员流转 */
 	public static final String PROCESSINGTYPE_CONTROL = "control";
 	public static final String PROCESSINGTYPE_CONTROL = "control";
 	/* 添加处理人 */
 	/* 添加处理人 */

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

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

+ 208 - 43
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.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
 import javax.persistence.Tuple;
 import javax.persistence.Tuple;
@@ -14,29 +15,39 @@ import javax.persistence.criteria.Path;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 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.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.Applications;
 import com.x.base.core.project.Applications;
 import com.x.base.core.project.x_processplatform_service_processing;
 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.jaxrs.WoId;
 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.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.schedule.AbstractJob;
 import com.x.base.core.project.schedule.AbstractJob;
 import com.x.base.core.project.tools.ListTools;
 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.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.Task;
+import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Task_;
 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.Manual;
 import com.x.processplatform.core.entity.element.Route;
 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 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 {
 public class PassExpired extends AbstractJob {
 
 
 	private static Logger logger = LoggerFactory.getLogger(PassExpired.class);
 	private static Logger logger = LoggerFactory.getLogger(PassExpired.class);
@@ -63,17 +74,7 @@ public class PassExpired extends AbstractJob {
 						sequence = targets.get(targets.size() - 1).getSequence();
 						sequence = targets.get(targets.size() - 1).getSequence();
 						for (Task task : targets) {
 						for (Task task : targets) {
 							try {
 							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());
-								}
+								this.execute(task);
 							} catch (Exception e) {
 							} catch (Exception e) {
 								logger.error(e);
 								logger.error(e);
 							}
 							}
@@ -87,6 +88,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(), task.getSequence());
+		}
+	}
+
+	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)
 	private List<Task> list(EntityManagerContainer emc, String sequence, Map<String, Route> manualToRoute)
 			throws Exception {
 			throws Exception {
 		EntityManager em = emc.get(Task.class);
 		EntityManager em = emc.get(Task.class);
@@ -114,31 +304,6 @@ public class PassExpired extends AbstractJob {
 		return list;
 		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 {
 	private Map<String, Route> linkPassExpiredManualToRoute(EntityManagerContainer emc) throws Exception {
 		List<Route> routes = emc.fetchEqual(Route.class,
 		List<Route> routes = emc.fetchEqual(Route.class,
 				ListTools.toList(Route.id_FIELDNAME, Route.name_FIELDNAME, Route.opinion_FIELDNAME),
 				ListTools.toList(Route.id_FIELDNAME, Route.name_FIELDNAME, Route.opinion_FIELDNAME),