ActionGetWorkOrWorkCompleted.java 10.3 KB
Newer Older
R
roo00 已提交
1 2 3 4
package com.x.processplatform.assemble.surface.jaxrs.control;

import java.util.HashMap;
import java.util.Map;
Z
zhourui 已提交
5
import java.util.concurrent.CompletableFuture;
6
import java.util.concurrent.TimeUnit;
R
roo00 已提交
7

R
bug fix  
roo00 已提交
8
import org.apache.commons.lang3.BooleanUtils;
R
roo00 已提交
9 10 11

import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
Z
zhourui 已提交
12
import com.x.base.core.project.config.Config;
R
roo00 已提交
13 14 15 16 17 18 19
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.PropertyTools;
import com.x.processplatform.assemble.surface.Business;
R
Ray 已提交
20
import com.x.processplatform.assemble.surface.ThisApplication;
R
roo00 已提交
21 22 23 24 25 26 27 28 29 30 31
import com.x.processplatform.core.entity.content.Read;
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.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkLog;
import com.x.processplatform.core.entity.element.Activity;
import com.x.processplatform.core.entity.element.ActivityType;
import com.x.processplatform.core.entity.element.Manual;
import com.x.processplatform.core.entity.element.util.WorkLogTree;
import com.x.processplatform.core.entity.element.util.WorkLogTree.Node;
R
bug fix  
roo00 已提交
32
import com.x.processplatform.core.entity.element.util.WorkLogTree.Nodes;
R
roo00 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45

class ActionGetWorkOrWorkCompleted extends BaseAction {

	private static Logger logger = LoggerFactory.getLogger(ActionGetWorkOrWorkCompleted.class);

	private Boolean canManageApplicationOrProcess = null;

	private WorkLogTree workLogTree = null;

	private Boolean hasReadWithJob = null;

	private Boolean hasTaskWithWork = null;

R
roo00 已提交
46 47
	private Boolean hasTaskCompletedWithJob = null;

48 49
	private Boolean hasPauseTaskWithWork = null;

R
roo00 已提交
50 51
	private Map<String, Boolean> hasTaskCompletedWithActivityToken = new HashMap<>();

Z
zhourui 已提交
52
	ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
Z
zhourui 已提交
53
		ActionResult<Wo> result = new ActionResult<>();
54 55
		CompletableFuture<Wo> getFuture = this.getFuture(effectivePerson, workOrWorkCompleted);
		CompletableFuture<Boolean> checkControlFuture = this.checkControlFuture(effectivePerson, workOrWorkCompleted);
Z
zhourui 已提交
56 57 58
		result.setData(getFuture.get(Config.processPlatform().getAsynchronousTimeout(), TimeUnit.SECONDS));
		if (BooleanUtils
				.isFalse(checkControlFuture.get(Config.processPlatform().getAsynchronousTimeout(), TimeUnit.SECONDS))) {
59 60 61 62 63 64 65
			throw new ExceptionAccessDenied(effectivePerson, workOrWorkCompleted);
		}
		return result;
	}

	private CompletableFuture<Wo> getFuture(EffectivePerson effectivePerson, String workOrWorkCompleted) {
		return CompletableFuture.supplyAsync(() -> {
Z
zhourui 已提交
66 67 68 69 70 71 72 73 74 75
			Wo wo = null;
			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
				Business business = new Business(emc);
				Work work = emc.find(workOrWorkCompleted, Work.class);
				if (null != work) {
					wo = this.work(business, effectivePerson, work);
				} else {
					WorkCompleted workCompleted = emc.flag(workOrWorkCompleted, WorkCompleted.class);
					if (null != workCompleted) {
						wo = this.workCompleted(business, effectivePerson, workCompleted);
Z
zhourui 已提交
76 77
					}
				}
Z
zhourui 已提交
78 79
			} catch (Exception e) {
				logger.error(e);
R
roo00 已提交
80
			}
Z
zhourui 已提交
81
			return wo;
R
Ray 已提交
82
		}, ThisApplication.threadPool());
R
roo00 已提交
83 84 85 86 87 88 89
	}

	private Wo workCompleted(Business business, EffectivePerson effectivePerson, WorkCompleted workCompleted)
			throws Exception {
		Wo wo = new Wo();
		wo.setAllowVisit(true);
		wo.setAllowReadProcessing(this.hasReadWithJob(business, effectivePerson, workCompleted.getJob()));
R
bug fix  
roo00 已提交
90 91 92
		wo.setAllowRollback(
				this.canManageApplicationOrProcess(business, effectivePerson, workCompleted.getApplication(),
						workCompleted.getProcess()) || BooleanUtils.isTrue(workCompleted.getAllowRollback()));
R
roo00 已提交
93 94 95 96 97 98 99 100 101
		return wo;
	}

	private Wo work(Business business, EffectivePerson effectivePerson, Work work) throws Exception {

		Wo wo = new Wo();

		Activity activity = business.getActivity(work);

O
o2null 已提交
102
		// 是否可以看到
R
roo00 已提交
103
		wo.setAllowVisit(true);
O
o2null 已提交
104
		// 是否可以直接流转
R
roo00 已提交
105
		wo.setAllowProcessing(this.hasTaskWithWork(business, effectivePerson, work.getId()));
O
o2null 已提交
106
		// 是否可以处理待阅
R
roo00 已提交
107
		wo.setAllowReadProcessing(this.hasReadWithJob(business, effectivePerson, work.getJob()));
O
o2null 已提交
108
		// 是否可以保存数据
R
roo00 已提交
109 110 111
		wo.setAllowSave(
				this.canManageApplicationOrProcess(business, effectivePerson, work.getApplication(), work.getProcess())
						|| this.hasTaskWithWork(business, effectivePerson, work.getId()));
O
o2null 已提交
112
		// 是否可以重置处理人
R
roo00 已提交
113 114
		wo.setAllowReset(PropertyTools.getOrElse(activity, Manual.allowReset_FIELDNAME, Boolean.class, false)
				&& wo.getAllowSave());
O
o2null 已提交
115
		// 是否可以调度
Z
zhourui 已提交
116
		wo.setAllowReroute(PropertyTools.getOrElse(activity, Activity.allowReroute_FIELDNAME, Boolean.class, false)
R
roo00 已提交
117 118
				&& this.canManageApplicationOrProcess(business, effectivePerson, work.getApplication(),
						work.getProcess()));
O
o2null 已提交
119
		// 是否可以删除
R
roo00 已提交
120 121
		wo.setAllowDelete(PropertyTools.getOrElse(activity, Manual.allowDeleteWork_FIELDNAME, Boolean.class, false)
				&& wo.getAllowSave());
O
o2null 已提交
122
		// 是否可以挂起待办,暂停待办计时
123
		if (PropertyTools.getOrElse(activity, Manual.allowPause_FIELDNAME, Boolean.class, false) && wo.getAllowSave()) {
Z
zhourui 已提交
124 125 126 127 128 129 130 131
			// 如果已经处于挂起状态,那么允许恢复
			if (this.hasPauseTaskWithWork(business, effectivePerson, work.getId())) {
				wo.setAllowResume(true);
			} else {
				wo.setAllowPause(true);
			}
		}

O
o2null 已提交
132 133
		// 是否可以增加会签分支
		if (BooleanUtils.isTrue(PropertyTools.getOrElse(activity, Manual.allowAddSplit_FIELDNAME, Boolean.class, false))
R
bug fix  
roo00 已提交
134
				&& BooleanUtils.isTrue(work.getSplitting())) {
R
roo00 已提交
135 136
			Node node = this.workLogTree(business, work.getJob()).location(work);
			if (null != node) {
R
bug fix  
roo00 已提交
137
				Nodes ups = node.upTo(ActivityType.manual, ActivityType.agent, ActivityType.choice, ActivityType.delay,
R
Ray 已提交
138
						ActivityType.embed, ActivityType.invoke, ActivityType.parallel, ActivityType.split);
R
bug fix  
roo00 已提交
139 140 141 142 143 144
				for (Node o : ups) {
					if (this.hasTaskCompletedWithActivityToken(business, effectivePerson,
							o.getWorkLog().getFromActivityToken())) {
						wo.setAllowAddSplit(true);
						break;
					}
R
roo00 已提交
145 146 147
				}
			}
		}
O
o2null 已提交
148 149 150
		// 是否可以召回
		if (BooleanUtils
				.isTrue(PropertyTools.getOrElse(activity, Manual.allowRetract_FIELDNAME, Boolean.class, false))) {
R
roo00 已提交
151 152
			Node node = this.workLogTree(business, work.getJob()).location(work);
			if (null != node) {
R
bug fix  
roo00 已提交
153
				Nodes ups = node.upTo(ActivityType.manual, ActivityType.agent, ActivityType.choice, ActivityType.delay,
R
roo00 已提交
154
						ActivityType.embed, ActivityType.invoke);
R
bug fix  
roo00 已提交
155
				for (Node o : ups) {
156 157
					if (this.hasTaskCompletedWithActivityToken(business, effectivePerson,
							o.getWorkLog().getFromActivityToken())) {
R
bug fix  
roo00 已提交
158 159 160
						wo.setAllowRetract(true);
						break;
					}
R
roo00 已提交
161 162 163
				}
			}
		}
O
o2null 已提交
164
		// 是否可以回滚
R
roo00 已提交
165 166 167
		wo.setAllowRollback(PropertyTools.getOrElse(activity, Manual.allowRollback_FIELDNAME, Boolean.class, false)
				&& this.canManageApplicationOrProcess(business, effectivePerson, work.getApplication(),
						work.getProcess()));
O
o2null 已提交
168
		// 是否可以提醒
R
roo00 已提交
169 170
		wo.setAllowPress(PropertyTools.getOrElse(activity, Manual.allowPress_FIELDNAME, Boolean.class, false)
				&& this.hasTaskCompletedWithJob(business, effectivePerson, work.getJob()));
O
o2null 已提交
171
		// 是否可以看到
R
roo00 已提交
172 173 174 175 176 177 178
		wo.setAllowVisit(true);

		return wo;

	}

	private boolean hasTaskCompletedWithActivityToken(Business business, EffectivePerson effectivePerson,
O
o2null 已提交
179 180 181 182 183 184 185 186 187 188 189
			String activityToken) {
		return this.hasTaskCompletedWithActivityToken.computeIfAbsent(activityToken, k -> {
			try {
				return business.entityManagerContainer().countEqualAndEqual(TaskCompleted.class,
						TaskCompleted.person_FIELDNAME, effectivePerson.getDistinguishedName(),
						TaskCompleted.activityToken_FIELDNAME, activityToken) > 0;
			} catch (Exception e) {
				logger.error(e);
			}
			return false;
		});
R
roo00 已提交
190 191 192 193 194 195 196 197 198 199
	}

	private boolean hasTaskWithWork(Business business, EffectivePerson effectivePerson, String work) throws Exception {
		if (null == this.hasTaskWithWork) {
			this.hasTaskWithWork = business.entityManagerContainer().countEqualAndEqual(Task.class,
					Task.person_FIELDNAME, effectivePerson.getDistinguishedName(), Task.work_FIELDNAME, work) > 0;
		}
		return this.hasTaskWithWork;
	}

Z
zhourui 已提交
200 201
	private boolean hasPauseTaskWithWork(Business business, EffectivePerson effectivePerson, String work)
			throws Exception {
202 203
		if (null == this.hasPauseTaskWithWork) {
			this.hasPauseTaskWithWork = business.entityManagerContainer().countEqualAndEqualAndEqual(Task.class,
Z
zhourui 已提交
204 205 206
					Task.person_FIELDNAME, effectivePerson.getDistinguishedName(), Task.work_FIELDNAME, work,
					Task.pause_FIELDNAME, true) > 0;
		}
207
		return this.hasPauseTaskWithWork;
Z
zhourui 已提交
208 209
	}

R
roo00 已提交
210 211 212 213 214 215 216 217 218 219
	private boolean hasTaskCompletedWithJob(Business business, EffectivePerson effectivePerson, String job)
			throws Exception {
		if (null == this.hasTaskCompletedWithJob) {
			this.hasTaskCompletedWithJob = business.entityManagerContainer().countEqualAndEqual(TaskCompleted.class,
					TaskCompleted.person_FIELDNAME, effectivePerson.getDistinguishedName(), TaskCompleted.job_FIELDNAME,
					job) > 0;
		}
		return this.hasTaskCompletedWithJob;
	}

R
roo00 已提交
220 221 222 223 224 225 226 227 228 229 230
	private boolean hasReadWithJob(Business business, EffectivePerson effectivePerson, String job) throws Exception {
		if (null == this.hasReadWithJob) {
			this.hasReadWithJob = business.entityManagerContainer().countEqualAndEqual(Read.class,
					Read.person_FIELDNAME, effectivePerson.getDistinguishedName(), Read.job_FIELDNAME, job) > 0;
		}
		return this.hasReadWithJob;
	}

	private WorkLogTree workLogTree(Business business, String job) throws Exception {
		if (null == this.workLogTree) {
			this.workLogTree = new WorkLogTree(business.entityManagerContainer().fetchEqual(WorkLog.class,
R
bug fix  
roo00 已提交
231
					WorkLogTree.RELY_WORKLOG_ITEMS, WorkLog.job_FIELDNAME, job));
R
roo00 已提交
232 233 234 235 236 237 238 239 240 241 242 243 244
		}
		return this.workLogTree;
	}

	private boolean canManageApplicationOrProcess(Business business, EffectivePerson effectivePerson,
			String application, String process) throws Exception {
		if (null == canManageApplicationOrProcess) {
			this.canManageApplicationOrProcess = business.canManageApplicationOrProcess(effectivePerson, application,
					process);
		}
		return this.canManageApplicationOrProcess;
	}

Z
zhourui 已提交
245
	public static class Wo extends AbstractControl {
R
roo00 已提交
246

O
o2null 已提交
247 248
		private static final long serialVersionUID = -4677744478291468477L;

R
roo00 已提交
249 250 251
	}

}