优化关系

This commit is contained in:
zhouhao
2018-06-25 19:01:00 +08:00
parent 7500b54f15
commit 4f9ee89b78
9 changed files with 79 additions and 29 deletions

View File

@@ -5,7 +5,7 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public interface LinkedRelations<C extends LinkedRelations> {
public interface LinkedRelations<C extends LinkedRelations> {
/**
* 获取指定方向以及维度的关系链,如: 我是李四的经理,张三是我的经理
@@ -135,9 +135,19 @@ public interface LinkedRelations<C extends LinkedRelations> {
return stream().collect(Collectors.toList());
}
/**
* 获取所有的关系目标标识,通常是人员的id
*
* @return 人员id
*/
default List<String> allTarget() {
return stream().map(Relation::getTarget).collect(Collectors.toList());
}
/**
* @return 全部关系信息的stream
*/
Stream<Relation> stream();
C deep();
}

View File

@@ -12,6 +12,4 @@ public interface PersonRelations extends LinkedRelations<PersonRelations> {
*/
OrgRelations org();
}

View File

@@ -4,6 +4,16 @@ import java.util.List;
public interface RelationsManager {
/**
* 根据人员id获取人员的关系链
* <pre>
* PersonRelations me = getPersonRelationsByPersonId(personId);
* me.department().relations("总监").all()
* </pre>
*
* @param personId 人员id
* @return 人员关系链
*/
PersonRelations getPersonRelationsByPersonId(String personId);
PersonRelations getPersonRelationsByUserId(String userId);

View File

@@ -75,7 +75,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
@Override
public DepartmentRelations not(String property, Object value) {
departmentQuery.not(property, value);
// positionQuery.not(property, value);
return super.not(property, value);
}
@@ -83,7 +82,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
@Override
public DepartmentRelations is(String property, Object value) {
departmentQuery.is(property, value);
// positionQuery.is(property, value);
return super.is(property, value);
}
@@ -104,7 +102,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
if (CollectionUtils.isEmpty(positionIdList)) {
return super.relationStream(allDepartmentId);
}
//将岗位里的人员转为关系信息
Stream<Relation> relationStream = positions.stream()
.flatMap(position -> {
List<PersonEntity> personEntities = cache.get(position.getId());
@@ -118,15 +116,17 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
relation.setName(position.getName());
relation.setTarget(person.getId());
relation.setTargetObject(person);
//固定方向,因为从逻辑都是某人是某部门的某岗位
relation.setDirection(Relation.Direction.REVERSE);
//维度默认为岗位
relation.setDimension(Relation.TYPE_POSITION);
//关系标识为岗位id
relation.setRelation(position.getId());
return (Relation) relation;
});
});
return Stream.concat(relationStream, super.relationStream(allDepartmentId));
}
@@ -135,6 +135,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
}
@SuppressWarnings("all")
//获取所有的岗位
private Supplier<List<PositionEntity>> positionSupplier = Lazy.val(() -> {
List<String> departmentId = getAllDepartmentId();
if (CollectionUtils.isEmpty(departmentId)) {
@@ -152,6 +153,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
return (Supplier) () -> positions;
}, Supplier.class);
//获取所有的部门
private Supplier<List<String>> allDepartmentId = createLazyIdSupplier(() -> {
Set<String> departmentId = new HashSet<>(targetIdSupplier.get());
if (CollectionUtils.isEmpty(departmentId)) {
@@ -168,7 +170,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
}
//包含子级
if (includeChildren) {
allChildren = departmentId.stream()
.map(serviceContext.getDepartmentService()::selectAllChildNode)
.flatMap(Collection::stream)
@@ -227,6 +228,11 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
.collect(Collectors.toList());
}
@Override
public DepartmentRelations deep() {
return new DefaultDepartmentRelations(serviceContext, allDepartmentId);
}
@Override
@SuppressWarnings("unchecked")
public PersonRelations persons() {

View File

@@ -5,13 +5,11 @@ import org.hswebframework.ezorm.core.NestConditional;
import org.hswebframework.ezorm.core.dsl.Query;
import org.hswebframework.web.commons.entity.param.QueryParamEntity;
import org.hswebframework.web.entity.organizational.PersonEntity;
import org.hswebframework.web.organizational.authorization.relation.LinkedRelations;
import org.hswebframework.web.organizational.authorization.relation.Relation;
import org.hswebframework.web.organizational.authorization.relation.RelationTargetHolder;
import org.hswebframework.web.organizational.authorization.relation.SimpleRelation;
import org.hswebframework.web.organizational.authorization.relation.*;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@SuppressWarnings("all")
@@ -41,13 +39,13 @@ public class DefaultLinkedRelations<C extends LinkedRelations> implements Linked
case ALL:
query
.nest()
.nest()
.is("relationTypeFrom", dimension).is("relationId", relation)
.end()
.nest()
.is("relationTypeFrom", dimension).is("relationId", relation)
.end()
.or()
.nest()
.is("relationTypeTo", dimension).is("relationId", relation)
.end()
.nest()
.is("relationTypeTo", dimension).is("relationId", relation)
.end()
.end();
break;
@@ -121,6 +119,17 @@ public class DefaultLinkedRelations<C extends LinkedRelations> implements Linked
});
}
@Override
public C deep() {
if (this.getClass() != DefaultLinkedRelations.class) {
throw new UnsupportedOperationException("子类未实现deep方法");
}
return (C) new DefaultLinkedRelations<C>(serviceContext, () -> all()
.stream()
.map(Relation::getTarget)
.collect(Collectors.toList()));
}
@Override
public Stream<Relation> stream() {
return relationStream(targetIdSupplier);

View File

@@ -3,6 +3,7 @@ package org.hswebframework.web.service.organizational.simple.relations;
import org.hswebframework.web.entity.organizational.DepartmentEntity;
import org.hswebframework.web.organizational.authorization.relation.DepartmentRelations;
import org.hswebframework.web.organizational.authorization.relation.OrgRelations;
import org.hswebframework.web.organizational.authorization.relation.Relation;
import java.util.List;
import java.util.function.Supplier;
@@ -34,9 +35,14 @@ public class DefaultOrgRelations extends DefaultLinkedRelations<OrgRelations> im
public DepartmentRelations department() {
return new DefaultDepartmentRelations(serviceContext, () -> serviceContext
.getDepartmentService()
.selectByOrgIds(targetIdSupplier.get(),includeChildren,includeParents)
.selectByOrgIds(targetIdSupplier.get(), includeChildren, includeParents)
.stream()
.map(DepartmentEntity::getId)
.collect(Collectors.toList()));
}
@Override
public OrgRelations deep() {
return new DefaultOrgRelations(serviceContext, () -> stream().map(Relation::getTarget).collect(Collectors.toList()));
}
}

View File

@@ -1,13 +1,10 @@
package org.hswebframework.web.service.organizational.simple.relations;
import org.hswebframework.web.organizational.authorization.relation.*;
import org.hswebframework.web.service.authorization.UserService;
import org.hswebframework.web.service.organizational.PersonService;
import org.hswebframework.web.service.organizational.RelationInfoService;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
public class DefaultPersonRelations extends DefaultLinkedRelations<PersonRelations> implements PersonRelations {
@@ -17,11 +14,23 @@ public class DefaultPersonRelations extends DefaultLinkedRelations<PersonRelatio
}
protected List<String> getAllOrg() {
return serviceContext.getPersonService().selectAllOrgId(targetIdSupplier.get());
return serviceContext
.getPersonService()
.selectAllOrgId(targetIdSupplier.get());
}
protected List<String> getAllDepartment() {
return serviceContext.getPersonService().selectAllDepartmentId(targetIdSupplier.get());
return serviceContext
.getPersonService()
.selectAllDepartmentId(targetIdSupplier.get());
}
@Override
public PersonRelations deep() {
return new DefaultPersonRelations(serviceContext, () -> all()
.stream()
.map(Relation::getTarget)
.collect(Collectors.toList()));
}
@Override

View File

@@ -174,7 +174,6 @@ class RelationsManagerTests extends Specification {
.relations("总监")
.all()
def orgRelationList = pre
.org()
.andParents()

View File

@@ -5,7 +5,8 @@ import lombok.extern.slf4j.Slf4j;
import org.hswebframework.expands.script.engine.DynamicScriptEngine;
import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory;
import org.hswebframework.web.Maps;
import org.hswebframework.web.commons.entity.GenericEntity;
import org.hswebframework.web.entity.authorization.UserEntity;
import org.hswebframework.web.entity.organizational.PersonEntity;
import org.hswebframework.web.organizational.authorization.relation.PersonRelations;
import org.hswebframework.web.organizational.authorization.relation.Relation;
import org.hswebframework.web.organizational.authorization.relation.RelationsManager;
@@ -81,8 +82,10 @@ public class RelationCandidateDimensionParserStrategy implements CandidateDimens
return (String) o;
} else if (o instanceof Relation) {
Object target = ((Relation) o).getTargetObject();
if (target instanceof GenericEntity) {
return String.valueOf(((GenericEntity) target).getId());
if (target instanceof PersonEntity) {
return ((PersonEntity) target).getUserId();
} else if (target instanceof UserEntity) {
return ((UserEntity) target).getId();
} else {
return ((Relation) o).getRelation();
}