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

import java.util.ArrayList;
import java.util.List;
R
update  
roo00 已提交
5
import java.util.concurrent.Callable;
R
roo00 已提交
6

R
roo00 已提交
7 8 9 10 11
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;

R
update  
roo00 已提交
12
import org.apache.commons.collections4.ListUtils;
R
roo00 已提交
13 14 15 16 17 18
import org.apache.commons.lang3.StringUtils;

import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.project.exception.ExceptionEntityNotExist;
R
roo00 已提交
19
import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
R
roo00 已提交
20 21
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
R
update  
roo00 已提交
22
import com.x.base.core.project.jaxrs.WrapStringList;
R
roo00 已提交
23
import com.x.base.core.project.script.ScriptFactory;
R
roo00 已提交
24
import com.x.base.core.project.tools.ListTools;
R
roo00 已提交
25
import com.x.base.core.project.webservices.WebservicesClient;
R
roo00 已提交
26
import com.x.processplatform.core.entity.content.Data;
R
update  
roo00 已提交
27
import com.x.processplatform.core.entity.content.ProcessingType;
R
roo00 已提交
28
import com.x.processplatform.core.entity.content.Task;
R
update  
roo00 已提交
29
import com.x.processplatform.core.entity.content.TaskCompleted;
R
roo00 已提交
30
import com.x.processplatform.core.entity.content.Work;
R
roo00 已提交
31
import com.x.processplatform.core.entity.element.Activity;
R
roo00 已提交
32 33
import com.x.processplatform.core.entity.element.ActivityType;
import com.x.processplatform.core.entity.element.Manual;
Z
Zhou Rui 已提交
34
import com.x.processplatform.core.entity.element.Process;
R
roo00 已提交
35
import com.x.processplatform.core.entity.element.Route;
NoSubject's avatar
NoSubject 已提交
36
import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapAppend;
R
roo00 已提交
37
import com.x.processplatform.service.processing.ApplicationDictHelper;
R
roo00 已提交
38
import com.x.processplatform.service.processing.Business;
R
roo00 已提交
39 40
import com.x.processplatform.service.processing.ThisApplication;
import com.x.processplatform.service.processing.WorkContext;
R
roo00 已提交
41
import com.x.processplatform.service.processing.WorkDataHelper;
R
roo00 已提交
42 43
import com.x.processplatform.service.processing.processor.manual.TaskIdentities;
import com.x.processplatform.service.processing.processor.manual.TaskIdentity;
R
roo00 已提交
44 45 46 47 48

class ActionAppend extends BaseAction {

	ActionResult<Wo> execute(EffectivePerson effectivePerson, String id, JsonElement jsonElement) throws Exception {

R
roo00 已提交
49
		final Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
R
roo00 已提交
50

R
roo00 已提交
51
		String executorSeed = null;
R
roo00 已提交
52

R
roo00 已提交
53
		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
R
roo00 已提交
54

R
roo00 已提交
55
			Task task = emc.fetch(id, Task.class, ListTools.toList(Task.job_FIELDNAME));
R
roo00 已提交
56 57 58 59

			if (null == task) {
				throw new ExceptionEntityNotExist(id, Task.class);
			}
R
roo00 已提交
60 61
			executorSeed = task.getJob();
		}
R
roo00 已提交
62

R
roo00 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76
		Callable<ActionResult<Wo>> callable = new Callable<ActionResult<Wo>>() {
			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);
					Task task = emc.find(id, Task.class);
					if (null == task) {
						throw new ExceptionEntityNotExist(id, Task.class);
					}
					Work work = emc.find(task.getWork(), Work.class);
					if (null == work) {
						throw new ExceptionEntityNotExist(task.getWork(), Work.class);
					}
R
update  
roo00 已提交
77 78 79 80 81 82
					Manual manual = (Manual) business.element().get(task.getActivity(), ActivityType.manual);
					Route route = getRoute(business, task, manual);
					List<String> identities = new ArrayList<>();
					if (ListTools.isNotEmpty(wi.getIdentityList())) {
						identities.addAll(wi.getIdentityList());
					}
Z
zhourui 已提交
83
					if (route != null) {
R
update  
roo00 已提交
84 85 86 87 88 89 90 91
						if (StringUtils.equals(route.getType(), Route.TYPE_APPENDTASK)
								&& StringUtils.equals(manual.getId(), route.getActivity())) {
							if (StringUtils.equals(route.getAppendTaskIdentityType(),
									Route.APPENDTASKIDENTITYTYPE_SCRIPT)) {
								Data data = new Data();
								WorkDataHelper workDataHelper = new WorkDataHelper(business.entityManagerContainer(),
										work);
								data = workDataHelper.get();
R
roo00 已提交
92 93 94 95 96 97 98 99

								ScriptContext scriptContext = scriptContext(business, work, data, manual, task);

								CompiledScript compiledScript = business.element().getCompiledScript(
										task.getApplication(), route, Business.EVENT_ROUTEAPPENDTASKIDENTITY);

								Object objectValue = compiledScript.eval(scriptContext);

R
roo00 已提交
100
								List<String> os = ScriptFactory.asDistinguishedNameList(objectValue);
R
roo00 已提交
101

R
update  
roo00 已提交
102 103 104 105
								if (ListTools.isNotEmpty(os)) {
									identities.addAll(os);
								}
							}
R
roo00 已提交
106 107
						}
					}
Z
Zhou Rui 已提交
108
					Process process = business.element().get(task.getProcess(), Process.class);
R
roo00 已提交
109
					identities = business.organization().identity().list(ListTools.trim(identities, true, true));
Z
zhourui 已提交
110
					TaskIdentities taskIdentities = empower(business, process, task, identities);
R
roo00 已提交
111
					identities = taskIdentities.identities();
R
update  
roo00 已提交
112 113 114 115
					if (ListTools.isNotEmpty(identities)) {
						List<TaskCompleted> os = emc.listEqualAndInAndNotEqual(TaskCompleted.class,
								TaskCompleted.activityToken_FIELDNAME, work.getActivityToken(),
								TaskCompleted.identity_FIELDNAME, identities, TaskCompleted.joinInquire_FIELDNAME,
NoSubject's avatar
NoSubject 已提交
116
								true);
R
update  
roo00 已提交
117 118 119 120
						if (ListTools.isNotEmpty(os)) {
							emc.beginTransaction(TaskCompleted.class);
							for (TaskCompleted o : os) {
								o.setJoinInquire(false);
NoSubject's avatar
NoSubject 已提交
121
								o.setProcessingType(TaskCompleted.PROCESSINGTYPE_BEAPPENDEDTASK);
R
update  
roo00 已提交
122 123
							}
						}
Z
zhourui 已提交
124
						// 后面还要合并,clone一个新实例
R
roo00 已提交
125 126 127 128 129 130
						wo.getValueList().addAll(new ArrayList<>(identities));
						identities = ListUtils.sum(ListUtils.subtract(work.getManualTaskIdentityList(),
								ListTools.toList(task.getIdentity())), identities);
						identities = business.organization().identity().list(ListTools.trim(identities, true, true));
						emc.beginTransaction(Work.class);
						work.setManualTaskIdentityList(identities);
Z
zhourui 已提交
131
						// 转派后设置过期为空
Z
zhourui 已提交
132 133 134
//						emc.beginTransaction(Task.class);
//						task.setExpired(false);
//						task.setExpireTime(null);
R
roo00 已提交
135
						emc.commit();
R
roo00 已提交
136
					}
R
update  
roo00 已提交
137
					result.setData(wo);
R
update  
roo00 已提交
138
				}
R
roo00 已提交
139 140 141
				return result;
			}
		};
R
update  
roo00 已提交
142

R
roo00 已提交
143 144
		return ProcessPlatformExecutorFactory.get(executorSeed).submit(callable).get();
	}
R
update  
roo00 已提交
145

R
roo00 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
	public static ScriptContext scriptContext(Business business, Work work, Data data, Activity activity, Task task)
			throws Exception {
		ScriptContext scriptContext = new SimpleScriptContext();
		Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
		WorkContext workContext = new WorkContext(business, work, activity, task);
		bindings.put(ScriptFactory.BINDING_NAME_WORKCONTEXT, workContext);
		bindings.put(ScriptFactory.BINDING_NAME_DATA, data);
		bindings.put(ScriptFactory.BINDING_NAME_ORGANIZATION, business.organization());
		bindings.put(ScriptFactory.BINDING_NAME_WEBSERVICESCLIENT, new WebservicesClient());
		bindings.put(ScriptFactory.BINDING_NAME_DICTIONARY,
				new ApplicationDictHelper(business.entityManagerContainer(), work.getApplication()));
		bindings.put(ScriptFactory.BINDING_NAME_APPLICATIONS, ThisApplication.context().applications());
		ScriptFactory.initialScriptText().eval(scriptContext);
		return scriptContext;
	}

Z
zhourui 已提交
162 163
	private TaskIdentities empower(Business business, Process process, Task task, List<String> identities)
			throws Exception {
R
roo00 已提交
164 165
		TaskIdentities taskIdentities = new TaskIdentities();
		taskIdentities.addIdentities(identities);
Z
zhourui 已提交
166 167
		taskIdentities.empower(business.organization().empower().listWithIdentityObject(task.getApplication(),
				process.getEdition(), task.getProcess(), task.getWork(), identities));
R
roo00 已提交
168
		return taskIdentities;
R
roo00 已提交
169 170 171 172 173 174 175 176 177 178 179
	}

	private Route getRoute(Business business, Task task, Manual manual) throws Exception {
		for (Route o : business.element().listRouteWithManual(manual.getId())) {
			if (StringUtils.equals(task.getRouteName(), o.getName())) {
				return o;
			}
		}
		return null;
	}

NoSubject's avatar
NoSubject 已提交
180
	public static class Wi extends WrapAppend {
R
roo00 已提交
181 182
	}

R
update  
roo00 已提交
183
	public static class Wo extends WrapStringList {
R
roo00 已提交
184 185 186 187

	}

}