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

import java.util.ArrayList;
4
import java.util.LinkedHashMap;
R
roo00 已提交
5
import java.util.List;
6
import java.util.Map;
R
update  
roo00 已提交
7
import java.util.concurrent.Callable;
O
o2null 已提交
8
import java.util.concurrent.TimeUnit;
R
roo00 已提交
9

R
roo00 已提交
10 11 12 13 14
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;

15 16
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
R
update  
roo00 已提交
17
import org.apache.commons.collections4.ListUtils;
18
import org.apache.commons.lang3.BooleanUtils;
R
roo00 已提交
19 20 21 22 23 24
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 已提交
25
import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
R
roo00 已提交
26 27
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
R
update  
roo00 已提交
28
import com.x.base.core.project.jaxrs.WrapStringList;
R
roo00 已提交
29
import com.x.base.core.project.script.ScriptFactory;
R
roo00 已提交
30
import com.x.base.core.project.tools.ListTools;
R
roo00 已提交
31
import com.x.base.core.project.webservices.WebservicesClient;
R
roo00 已提交
32 33
import com.x.processplatform.core.entity.content.Data;
import com.x.processplatform.core.entity.content.Task;
R
update  
roo00 已提交
34
import com.x.processplatform.core.entity.content.TaskCompleted;
R
roo00 已提交
35
import com.x.processplatform.core.entity.content.Work;
R
roo00 已提交
36
import com.x.processplatform.core.entity.element.Activity;
R
roo00 已提交
37 38
import com.x.processplatform.core.entity.element.ActivityType;
import com.x.processplatform.core.entity.element.Manual;
Z
Zhou Rui 已提交
39
import com.x.processplatform.core.entity.element.Process;
R
roo00 已提交
40
import com.x.processplatform.core.entity.element.Route;
NoSubject's avatar
NoSubject 已提交
41
import com.x.processplatform.core.express.service.processing.jaxrs.task.WrapAppend;
R
roo00 已提交
42
import com.x.processplatform.service.processing.ApplicationDictHelper;
R
roo00 已提交
43
import com.x.processplatform.service.processing.Business;
R
roo00 已提交
44 45
import com.x.processplatform.service.processing.ThisApplication;
import com.x.processplatform.service.processing.WorkContext;
R
roo00 已提交
46
import com.x.processplatform.service.processing.WorkDataHelper;
R
roo00 已提交
47
import com.x.processplatform.service.processing.processor.manual.TaskIdentities;
48
import com.x.processplatform.service.processing.processor.manual.TaskIdentity;
R
roo00 已提交
49 50 51

class ActionAppend extends BaseAction {

52 53
	private static Logger logger = LoggerFactory.getLogger(ActionAppend.class);

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

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

R
roo00 已提交
58
		String executorSeed = null;
R
roo00 已提交
59

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

R
roo00 已提交
62
			Task task = emc.fetch(id, Task.class, ListTools.toList(Task.job_FIELDNAME));
R
roo00 已提交
63 64 65 66

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

R
roo00 已提交
70 71 72 73
		Callable<ActionResult<Wo>> callable = new Callable<ActionResult<Wo>>() {
			public ActionResult<Wo> call() throws Exception {
				ActionResult<Wo> result = new ActionResult<>();
				Wo wo = new Wo();
74
				String workId = "";
R
roo00 已提交
75 76 77 78 79 80 81 82 83 84
				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);
					}
85
					workId = work.getId();
R
update  
roo00 已提交
86 87 88 89 90 91
					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 已提交
92
					if (route != null) {
R
update  
roo00 已提交
93 94 95 96 97 98 99 100
						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 已提交
101 102 103 104 105 106 107 108

								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 已提交
109
								List<String> os = ScriptFactory.asDistinguishedNameList(objectValue);
R
roo00 已提交
110

R
update  
roo00 已提交
111 112 113 114
								if (ListTools.isNotEmpty(os)) {
									identities.addAll(os);
								}
							}
R
roo00 已提交
115 116
						}
					}
Z
Zhou Rui 已提交
117
					Process process = business.element().get(task.getProcess(), Process.class);
R
roo00 已提交
118
					identities = business.organization().identity().list(ListTools.trim(identities, true, true));
Z
zhourui 已提交
119
					TaskIdentities taskIdentities = empower(business, process, task, identities);
R
roo00 已提交
120
					identities = taskIdentities.identities();
R
update  
roo00 已提交
121
					if (ListTools.isNotEmpty(identities)) {
122 123 124 125 126
//						List<TaskCompleted> os = emc.listEqualAndInAndNotEqual(TaskCompleted.class,
//								TaskCompleted.activityToken_FIELDNAME, work.getActivityToken(),
//								TaskCompleted.identity_FIELDNAME, identities, TaskCompleted.joinInquire_FIELDNAME,
//								true);
						// 同一环节办理后再转交给已经有已办的人员,需要将已办置为joinInquire=false
R
update  
roo00 已提交
127 128 129
						List<TaskCompleted> os = emc.listEqualAndInAndNotEqual(TaskCompleted.class,
								TaskCompleted.activityToken_FIELDNAME, work.getActivityToken(),
								TaskCompleted.identity_FIELDNAME, identities, TaskCompleted.joinInquire_FIELDNAME,
130
								false);
R
update  
roo00 已提交
131 132 133 134
						if (ListTools.isNotEmpty(os)) {
							emc.beginTransaction(TaskCompleted.class);
							for (TaskCompleted o : os) {
								o.setJoinInquire(false);
NoSubject's avatar
NoSubject 已提交
135
								o.setProcessingType(TaskCompleted.PROCESSINGTYPE_BEAPPENDEDTASK);
R
update  
roo00 已提交
136 137
							}
						}
Z
zhourui 已提交
138
						// 后面还要合并,clone一个新实例
R
roo00 已提交
139 140 141 142 143 144
						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);
145 146 147 148 149 150 151
						for (TaskIdentity taskIdentity : taskIdentities) {
							if (BooleanUtils.isNotTrue(taskIdentity.getIgnoreEmpower())
									&& StringUtils.isNotEmpty(taskIdentity.getFromIdentity())) {
								work.getProperties().getManualEmpowerMap().put(taskIdentity.getIdentity(),
										taskIdentity.getFromIdentity());
							}
						}
152 153 154 155
						//properties中的集合对象需要重新new对象set进去,这样jpa才会更新数据
						Map<String, String> manualEmpowerMap = new LinkedHashMap<String, String>();
						manualEmpowerMap.putAll(work.getProperties().getManualEmpowerMap());
						work.getProperties().setManualEmpowerMap(manualEmpowerMap);
Z
zhourui 已提交
156
						// 转派后设置过期为空
Z
zhourui 已提交
157 158 159
//						emc.beginTransaction(Task.class);
//						task.setExpired(false);
//						task.setExpireTime(null);
R
roo00 已提交
160
						emc.commit();
R
roo00 已提交
161
					}
R
update  
roo00 已提交
162
					result.setData(wo);
R
update  
roo00 已提交
163
				}
R
roo00 已提交
164 165 166
				return result;
			}
		};
R
update  
roo00 已提交
167

O
o2null 已提交
168
		return ProcessPlatformExecutorFactory.get(executorSeed).submit(callable).get(300, TimeUnit.SECONDS);
R
roo00 已提交
169
	}
R
update  
roo00 已提交
170

R
roo00 已提交
171 172 173 174 175 176 177 178 179 180 181 182
	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());
183
		// 重新创建的ScriptContext是需要初始化的
R
roo00 已提交
184 185 186 187
		ScriptFactory.initialScriptText().eval(scriptContext);
		return scriptContext;
	}

Z
zhourui 已提交
188 189
	private TaskIdentities empower(Business business, Process process, Task task, List<String> identities)
			throws Exception {
R
roo00 已提交
190 191
		TaskIdentities taskIdentities = new TaskIdentities();
		taskIdentities.addIdentities(identities);
Z
zhourui 已提交
192 193
		taskIdentities.empower(business.organization().empower().listWithIdentityObject(task.getApplication(),
				process.getEdition(), task.getProcess(), task.getWork(), identities));
R
roo00 已提交
194
		return taskIdentities;
R
roo00 已提交
195 196 197 198 199 200 201 202 203 204 205
	}

	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 已提交
206
	public static class Wi extends WrapAppend {
R
roo00 已提交
207 208
	}

R
update  
roo00 已提交
209
	public static class Wo extends WrapStringList {
R
roo00 已提交
210 211 212

	}

213
}