ActionProcessing.java 7.5 KB
Newer Older
R
roo00 已提交
1 2 3 4
package com.x.processplatform.service.processing.jaxrs.task;

import java.util.Date;
import java.util.Objects;
R
update  
roo00 已提交
5
import java.util.concurrent.Callable;
O
o2null 已提交
6
import java.util.concurrent.TimeUnit;
R
roo00 已提交
7

R
roo00 已提交
8 9 10
import javax.script.CompiledScript;
import javax.script.ScriptContext;

Z
zhourui 已提交
11 12 13
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;

R
roo00 已提交
14 15 16 17 18
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.annotation.CheckPersistType;
import com.x.base.core.entity.annotation.CheckRemoveType;
R
roo00 已提交
19
import com.x.base.core.project.annotation.ActionLogger;
R
roo00 已提交
20
import com.x.base.core.project.config.Config;
R
roo00 已提交
21
import com.x.base.core.project.exception.ExceptionEntityNotExist;
R
roo00 已提交
22
import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
R
roo00 已提交
23 24 25 26 27
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WoId;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
Z
zhourui 已提交
28
import com.x.base.core.project.script.ScriptFactory;
R
update  
roo00 已提交
29
import com.x.base.core.project.tools.ListTools;
R
roo00 已提交
30 31 32 33 34
import com.x.processplatform.core.entity.content.Task;
import com.x.processplatform.core.entity.content.TaskCompleted;
import com.x.processplatform.core.entity.content.Work;
import com.x.processplatform.core.entity.element.ActivityType;
import com.x.processplatform.core.entity.element.Manual;
R
update  
roo00 已提交
35
import com.x.processplatform.core.entity.element.Process;
NoSubject's avatar
NoSubject 已提交
36 37
import com.x.processplatform.core.express.ProcessingAttributes;
import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapProcessing;
R
roo00 已提交
38 39
import com.x.processplatform.service.processing.Business;
import com.x.processplatform.service.processing.MessageFactory;
Z
zhourui 已提交
40
import com.x.processplatform.service.processing.WorkContext;
NoSubject's avatar
NoSubject 已提交
41
import com.x.processplatform.service.processing.WorkDataHelper;
R
roo00 已提交
42 43
import com.x.processplatform.service.processing.configurator.ProcessingConfigurator;
import com.x.processplatform.service.processing.processor.AeiObjects;
R
roo00 已提交
44 45 46

class ActionProcessing extends BaseAction {

R
roo00 已提交
47
	@ActionLogger
R
roo00 已提交
48 49 50
	private static Logger logger = LoggerFactory.getLogger(ActionProcessing.class);

	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {
R
roo00 已提交
51 52 53

		final Wi wi = this.convertToWrapIn(jsonElement, Wi.class);

NoSubject's avatar
NoSubject 已提交
54
		String job;
R
roo00 已提交
55

R
roo00 已提交
56
		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
R
roo00 已提交
57
			Task task = emc.fetch(id, Task.class, ListTools.toList(Task.job_FIELDNAME));
R
roo00 已提交
58
			if (null == task) {
R
roo00 已提交
59
				throw new ExceptionEntityNotExist(id, Task.class);
R
roo00 已提交
60
			}
NoSubject's avatar
NoSubject 已提交
61
			job = task.getJob();
R
roo00 已提交
62
		}
R
update  
roo00 已提交
63

O
o2null 已提交
64
		return ProcessPlatformExecutorFactory.get(job).submit(new CallableExecute(wi, id)).get(300, TimeUnit.SECONDS);
Z
zhourui 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

	}

	private class CallableExecute implements Callable<ActionResult<Wo>> {

		private Wi wi;

		private String id;

		private CallableExecute(Wi wi, String id) {
			this.wi = wi;
			this.id = id;
		}

		private void callManualBeforeTaskScript(Business business, Task task) throws Exception {
			if (Objects.equals(task.getActivityType(), ActivityType.manual)) {
				Manual manual = business.element().get(task.getActivity(), Manual.class);
				if ((null != manual) && (StringUtils.isNotEmpty(manual.getManualBeforeTaskScript())
						|| StringUtils.isNotEmpty(manual.getManualBeforeTaskScriptText()))) {
					Work work = business.entityManagerContainer().find(task.getWork(), Work.class);
					if (null != work) {
						AeiObjects aeiObjects = new AeiObjects(business, work, manual, new ProcessingConfigurator(),
								new ProcessingAttributes());
						ScriptContext scriptContext = aeiObjects.scriptContext();
Z
zhourui 已提交
89 90
						((WorkContext) scriptContext.getAttribute(ScriptFactory.BINDING_NAME_WORKCONTEXT))
								.bindTask(task);
Z
zhourui 已提交
91 92 93 94 95 96 97
						WorkDataHelper workDataHelper = new WorkDataHelper(business.entityManagerContainer(), work);
						CompiledScript cs = null;
						cs = business.element().getCompiledScript(task.getApplication(), manual,
								Business.EVENT_MANUALBEFORETASK);
						cs.eval(scriptContext);
						workDataHelper.update(aeiObjects.getData());
						business.entityManagerContainer().commit();
R
update  
roo00 已提交
98
					}
R
roo00 已提交
99
				}
R
roo00 已提交
100
			}
Z
zhourui 已提交
101
		}
R
update  
roo00 已提交
102

Z
zhourui 已提交
103 104
		private void callManualAfterTaskScript(Business business, Task task, TaskCompleted taskCompleted)
				throws Exception {
Z
zhourui 已提交
105 106 107 108 109 110 111 112 113
			if (Objects.equals(task.getActivityType(), ActivityType.manual)) {
				Manual manual = business.element().get(task.getActivity(), Manual.class);
				if ((null != manual) && (StringUtils.isNotEmpty(manual.getManualAfterTaskScript())
						|| StringUtils.isNotEmpty(manual.getManualAfterTaskScriptText()))) {
					Work work = business.entityManagerContainer().find(task.getWork(), Work.class);
					if (null != work) {
						AeiObjects aeiObjects = new AeiObjects(business, work, manual, new ProcessingConfigurator(),
								new ProcessingAttributes());
						ScriptContext scriptContext = aeiObjects.scriptContext();
Z
zhourui 已提交
114 115
						((WorkContext) scriptContext.getAttribute(ScriptFactory.BINDING_NAME_WORKCONTEXT))
								.bindTaskCompleted(taskCompleted);
Z
zhourui 已提交
116 117 118 119 120 121 122 123
						CompiledScript cs = null;
						cs = business.element().getCompiledScript(task.getApplication(), manual,
								Business.EVENT_MANUALAFTERTASK);
						cs.eval(scriptContext);
					}
				}
			}
		}
R
roo00 已提交
124

Z
zhourui 已提交
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
		public ActionResult<Wo> call() throws Exception {
			ActionResult<Wo> result = new ActionResult<>();
			Wo wo = new Wo();
			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
				Business business = new Business(emc);
				// 生成默认的Wi,用于生成默认的processType
				if (null == wi.getProcessingType()) {
					wi.setProcessingType(TaskCompleted.PROCESSINGTYPE_TASK);
				}
				Task task = emc.find(id, Task.class);
				if (null == task) {
					throw new ExceptionEntityNotExist(id, Task.class);
				}
				// 执行办前脚本
				callManualBeforeTaskScript(business, task);
				// 将待办转为已办
				emc.beginTransaction(TaskCompleted.class);
				emc.beginTransaction(Task.class);
				// 将所有前面的已办lastest标记false
				emc.listEqualAndEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, task.getJob(),
						TaskCompleted.person_FIELDNAME, task.getPerson()).forEach(o -> {
							o.setLatest(false);
						});
				Date now = new Date();
				Long duration = Config.workTime().betweenMinutes(task.getStartTime(), now);
				TaskCompleted taskCompleted = new TaskCompleted(task, wi.getProcessingType(), now, duration);
				if (StringUtils.isEmpty(taskCompleted.getOpinion())) {
					Process process = business.element().get(task.getProcess(), Process.class);
					if ((null != process) && BooleanUtils.isTrue(process.getRouteNameAsOpinion())) {
						// 先写入路由意见
						taskCompleted.setOpinion(StringUtils.trimToEmpty(ListTools.parallel(task.getRouteNameList(),
								task.getRouteName(), task.getRouteOpinionList())));
						// 如果路由的名称依然没有获取,那么强制设置为路由名称。
						if (StringUtils.isEmpty(taskCompleted.getOpinion())) {
							taskCompleted.setOpinion(task.getRouteName());
						}
					}
				}
				taskCompleted.onPersist();
				emc.persist(taskCompleted, CheckPersistType.all);
				emc.remove(task, CheckRemoveType.all);
				emc.commit();
				/* 待办执行后脚本,不能修改数据. */
Z
zhourui 已提交
168
				callManualAfterTaskScript(business, task, taskCompleted);
Z
zhourui 已提交
169 170 171 172 173 174
				MessageFactory.task_to_taskCompleted(taskCompleted);
				wo.setId(taskCompleted.getId());
			}
			result.setData(wo);
			return result;
		}
R
roo00 已提交
175 176
	}

R
roo00 已提交
177 178 179
	public static class Wo extends WoId {
	}

NoSubject's avatar
NoSubject 已提交
180
	public static class Wi extends WrapProcessing {
181

R
roo00 已提交
182 183 184
	}

}