ActionListWithPerson.java 6.8 KB
Newer Older
R
roo00 已提交
1 2 3 4
package com.x.processplatform.assemble.surface.jaxrs.application;

import java.util.ArrayList;
import java.util.List;
O
o2sword 已提交
5
import java.util.Optional;
6
import java.util.stream.Collectors;
R
roo00 已提交
7 8 9 10 11 12 13 14 15 16 17 18

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.project.bean.WrapCopier;
import com.x.base.core.project.bean.WrapCopierFactory;
O
o2sword 已提交
19 20
import com.x.base.core.project.cache.Cache;
import com.x.base.core.project.cache.CacheManager;
R
roo00 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.organization.OrganizationDefinition;
import com.x.base.core.project.tools.ListTools;
import com.x.processplatform.assemble.surface.Business;
import com.x.processplatform.core.entity.element.Application;
import com.x.processplatform.core.entity.element.Application_;
import com.x.processplatform.core.entity.element.Process;
import com.x.processplatform.core.entity.element.Process_;

class ActionListWithPerson extends BaseAction {

	/**
	 * 1.身份在可使用列表中<br/>
	 * 2.组织在可使用组织中 <br/>
	 * 4.没有限定身份和组织 <br/>
	 * 5.个人在应用管理员中 <br/>
	 * 6.应用的创建人员 <br/>
	 * 7.个人有Manage权限或者ProcessPlatformManager身份
	 */
	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson) throws Exception {
		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
			Business business = new Business(emc);
			ActionResult<List<Wo>> result = new ActionResult<>();
O
o2sword 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
			Cache.CacheKey cacheKey = new Cache.CacheKey(this.getClass(), effectivePerson.getDistinguishedName());
			Optional<?> optional = CacheManager.get(cacheCategory, cacheKey);
			if (optional.isPresent()) {
				result.setData((List<Wo>) optional.get());
			}else {
				List<Wo> wos = new ArrayList<>();
				List<String> identities = business.organization().identity().listWithPerson(effectivePerson);
				/** 去除部门以及上级部门,如果设置了一级部门可用,那么一级部门下属的二级部门也可用 */
				List<String> units = business.organization().unit().listWithPersonSupNested(effectivePerson);
				List<String> roles = business.organization().role().listWithPerson(effectivePerson);
				List<String> groups = business.organization().group().listWithIdentity(identities);
				List<String> ids = this.list(business, effectivePerson, roles, identities, units, groups);
				for (String id : ids) {
					Application o = business.application().pick(id);
					if (null != o) {
						wos.add(Wo.copier.copy(o));
					}
Z
zhourui 已提交
62
				}
O
o2sword 已提交
63
				wos = business.application().sort(wos);
Z
zhourui 已提交
64
				
O
o2sword 已提交
65
				result.setData(wos);
R
roo00 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
			}
			return result;
		}
	}

	public static class Wo extends Application {

		private static final long serialVersionUID = -4862564047240738097L;

		static WrapCopier<Application, Wo> copier = WrapCopierFactory.wo(Application.class, Wo.class, null,
				JpaObject.FieldsInvisible);

	}

	/**
	 * 从可见的application中获取一份ids<br/>
	 * 从可启动的process中获取一份ids <br/>
	 * 两份ids的交集,这样避免列示只有application没有可以启动process的应用
	 */
	private List<String> list(Business business, EffectivePerson effectivePerson, List<String> roles,
O
o2sword 已提交
86
			List<String> identities, List<String> units, List<String> groups) throws Exception {
Z
zhourui 已提交
87 88
//		List<String> ids = this.listFromApplication(business, effectivePerson, roles, identities, units);
//		return ids;
O
o2sword 已提交
89
		List<String> fromProcessIds = this.listFromProcess(business, effectivePerson, roles, identities, units, groups);
Z
zhourui 已提交
90
		return fromProcessIds;
R
roo00 已提交
91
//		return ListUtils.intersection(ids, fromProcessIds);
R
roo00 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
	}

	private List<String> listFromApplication(Business business, EffectivePerson effectivePerson, List<String> roles,
			List<String> identities, List<String> units) throws Exception {
		List<String> list = new ArrayList<>();
		EntityManager em = business.entityManagerContainer().get(Application.class);
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<String> cq = cb.createQuery(String.class);
		Root<Application> root = cq.from(Application.class);
		if (effectivePerson.isNotManager() && (!business.organization().person().hasRole(effectivePerson,
				OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager))) {
			Predicate p = cb.and(cb.isEmpty(root.get(Application_.availableIdentityList)),
					cb.isEmpty(root.get(Application_.availableUnitList)));
			p = cb.or(p, cb.isMember(effectivePerson.getDistinguishedName(), root.get(Application_.controllerList)));
			p = cb.or(p, cb.equal(root.get(Application_.creatorPerson), effectivePerson.getDistinguishedName()));
			if (ListTools.isNotEmpty(identities)) {
				p = cb.or(p, root.get(Application_.availableIdentityList).in(identities));
			}
			if (ListTools.isNotEmpty(units)) {
				p = cb.or(p, root.get(Application_.availableUnitList).in(units));
			}
			cq.where(p);
		}
115 116
		return em.createQuery(cq.select(root.get(Application_.id))).getResultList().stream().distinct()
				.collect(Collectors.toList());
R
roo00 已提交
117 118 119 120 121 122 123
	}

	/**
	 * 
	 * 从Process中获取可以启动的Process的application.
	 */
	private List<String> listFromProcess(Business business, EffectivePerson effectivePerson, List<String> roles,
O
o2sword 已提交
124
			List<String> identities, List<String> units, List<String> groups) throws Exception {
R
roo00 已提交
125 126 127 128 129 130 131 132
		EntityManager em = business.entityManagerContainer().get(Process.class);
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<String> cq = cb.createQuery(String.class);
		Root<Process> root = cq.from(Process.class);
		Predicate p = cb.conjunction();
		if (effectivePerson.isNotManager() && (!business.organization().person().hasRole(effectivePerson,
				OrganizationDefinition.Manager, OrganizationDefinition.ProcessPlatformManager))) {
			p = cb.and(cb.isEmpty(root.get(Process_.startableIdentityList)),
O
o2sword 已提交
133 134
					cb.isEmpty(root.get(Process_.startableUnitList)),
					cb.isEmpty(root.get(Process_.startableGroupList)));
R
roo00 已提交
135 136 137 138 139 140 141 142
			p = cb.or(p, cb.isMember(effectivePerson.getDistinguishedName(), root.get(Process_.controllerList)));
			p = cb.or(p, cb.equal(root.get(Process_.creatorPerson), effectivePerson.getDistinguishedName()));
			if (ListTools.isNotEmpty(identities)) {
				p = cb.or(p, root.get(Process_.startableIdentityList).in(identities));
			}
			if (ListTools.isNotEmpty(units)) {
				p = cb.or(p, root.get(Process_.startableUnitList).in(units));
			}
O
o2sword 已提交
143 144 145
			if (ListTools.isNotEmpty(groups)) {
				p = cb.or(p, root.get(Process_.startableGroupList).in(groups));
			}
R
roo00 已提交
146
		}
147 148
		cq.select(root.get(Process_.application)).where(p);
		return em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList());
R
roo00 已提交
149 150
	}
}