mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-06-05 04:13:20 +08:00
优化关系
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -12,6 +12,4 @@ public interface PersonRelations extends LinkedRelations<PersonRelations> {
|
||||
*/
|
||||
OrgRelations org();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -174,7 +174,6 @@ class RelationsManagerTests extends Specification {
|
||||
.relations("总监")
|
||||
.all()
|
||||
|
||||
|
||||
def orgRelationList = pre
|
||||
.org()
|
||||
.andParents()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user