From 5a14497dfdfe3baa5849ed9a5f8b7ff1db97ee2c Mon Sep 17 00:00:00 2001 From: zhouhao Date: Fri, 22 Jun 2018 16:01:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=80=99=E9=80=89=E4=BA=BA?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dimension/CandidateDimension.java | 2 - .../DefaultCandidateDimensionParser.java | 32 +++++++---- .../CandidateDimensionParserStrategy.java | 27 ++++++++- ...tmentCandidateDimensionParserStrategy.java | 46 +++++++++++++++ .../OrgCandidateDimensionParserStrategy.java | 44 +++++++++++++++ ...itionCandidateDimensionParserStrategy.java | 44 +++++++++++++++ .../RoleCandidateDimensionParserStrategy.java | 37 ++++++++++++ .../UserCandidateDimensionParserStrategy.java | 23 ++++++++ ...DefaultCandidateDimensionParserTest.groovy | 56 +++++++++++++++++++ 9 files changed, 296 insertions(+), 15 deletions(-) create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/DepartmentCandidateDimensionParserStrategy.java create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/OrgCandidateDimensionParserStrategy.java create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/PositionCandidateDimensionParserStrategy.java create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RoleCandidateDimensionParserStrategy.java create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/UserCandidateDimensionParserStrategy.java create mode 100644 hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParserTest.groovy diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java index 98940687e..acc0d8d15 100644 --- a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/CandidateDimension.java @@ -1,6 +1,5 @@ package org.hswebframework.web.workflow.dimension; -import java.io.Serializable; import java.util.Collections; import java.util.List; @@ -12,7 +11,6 @@ public interface CandidateDimension { List getCandidateUserIdList(); - CandidateDimension empty = Collections::emptyList; } diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java index 48aad2856..38a7334d5 100644 --- a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParser.java @@ -6,15 +6,16 @@ import io.vavr.Lazy; import org.apache.commons.collections.CollectionUtils; import org.hswebframework.web.workflow.dimension.parser.CandidateDimensionParserStrategy; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; +@Component public class DefaultCandidateDimensionParser implements CandidateDimensionParser { - @Autowired(required = false) private List strategies; @@ -22,20 +23,29 @@ public class DefaultCandidateDimensionParser implements CandidateDimensionParser public CandidateDimension parse(String jsonConfig) { JSONObject jsonObject = JSON.parseObject(jsonConfig); String type = jsonObject.getString("type"); - List ids = jsonObject.getJSONArray("list").toJavaList(String.class); + CandidateDimensionParserStrategy.StrategyConfig config = jsonObject + .toJavaObject(CandidateDimensionParserStrategy.StrategyConfig.class); + if (config.getConfig() == null) { + config.setConfig(jsonObject); + } - if (StringUtils.isEmpty(type) || CollectionUtils.isEmpty(strategies) || CollectionUtils.isEmpty(ids)) { + if (StringUtils.isEmpty(type) + || CollectionUtils.isEmpty(strategies) + || CollectionUtils.isEmpty(config.getIdList())) { return CandidateDimension.empty; } - return Lazy.val(() -> - (CandidateDimension) () -> strategies - .stream() - .filter(strategy -> strategy.support(type)) - .map(strategy -> strategy.parse(ids)) - .filter(CollectionUtils::isNotEmpty) - .flatMap(Collection::stream) - .collect(Collectors.toList()), CandidateDimension.class); + return Lazy.val(() -> { + List list = strategies + .stream() + .filter(strategy -> strategy.support(type)) + .map(strategy -> strategy.parse(config)) + .filter(CollectionUtils::isNotEmpty) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + return (CandidateDimension) () -> list; + } + , CandidateDimension.class); } } diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java index c74111d90..767253366 100644 --- a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/CandidateDimensionParserStrategy.java @@ -1,9 +1,32 @@ package org.hswebframework.web.workflow.dimension.parser; +import lombok.Getter; +import lombok.Setter; + import java.util.List; +import java.util.Map; +import java.util.Optional; public interface CandidateDimensionParserStrategy { - boolean support(String type); + String DIMENSION_USER = "user"; + String DIMENSION_ROLE = "role"; + String DIMENSION_POSITION = "position"; + String DIMENSION_DEPARTMENT = "department"; + String DIMENSION_ORG = "org"; - List parse(List ids); + boolean support(String dimension); + + List parse(StrategyConfig config); + + @Getter + @Setter + class StrategyConfig { + private List idList; + + private Map config; + + public Optional getConfig(String name) { + return config == null ? Optional.empty() : Optional.ofNullable(config.get(name)); + } + } } diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/DepartmentCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/DepartmentCandidateDimensionParserStrategy.java new file mode 100644 index 000000000..26333ea84 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/DepartmentCandidateDimensionParserStrategy.java @@ -0,0 +1,46 @@ +package org.hswebframework.web.workflow.dimension.parser; + +import org.hswebframework.web.entity.authorization.UserEntity; +import org.hswebframework.web.service.authorization.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.hswebframework.web.commons.entity.param.QueryParamEntity.empty; + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@Component +@ConditionalOnBean(UserService.class) +public class DepartmentCandidateDimensionParserStrategy implements CandidateDimensionParserStrategy { + + @Autowired(required = false) + private UserService userService; + + @Override + public boolean support(String dimension) { + return DIMENSION_DEPARTMENT.equals(dimension) && userService != null; + } + + @Override + public List parse(StrategyConfig config) { + + String type = config.getConfig("tree") + .map(String::valueOf) + .map("-"::concat) + .orElse(""); + + return userService.select( + empty().noPaging() + //https://github.com/hs-web/hsweb-framework/tree/master/hsweb-system/hsweb-system-organizational#sql条件 + .where("id", "user-in-department" + type, config.getIdList())) + .stream() + .map(UserEntity::getId) + .collect(Collectors.toList()); + } +} diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/OrgCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/OrgCandidateDimensionParserStrategy.java new file mode 100644 index 000000000..7f5a8e482 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/OrgCandidateDimensionParserStrategy.java @@ -0,0 +1,44 @@ +package org.hswebframework.web.workflow.dimension.parser; + +import org.hswebframework.web.entity.authorization.UserEntity; +import org.hswebframework.web.service.authorization.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.hswebframework.web.commons.entity.param.QueryParamEntity.empty; + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@Component +@ConditionalOnBean(UserService.class) +public class OrgCandidateDimensionParserStrategy implements CandidateDimensionParserStrategy { + + @Autowired(required = false) + private UserService userService; + + @Override + public boolean support(String dimension) { + return DIMENSION_ORG.equals(dimension) && userService != null; + } + + @Override + public List parse(StrategyConfig config) { + String type = config.getConfig("tree") + .map(String::valueOf) + .map("-"::concat) + .orElse(""); + return userService.select( + empty().noPaging() + //https://github.com/hs-web/hsweb-framework/tree/master/hsweb-system/hsweb-system-organizational#sql条件 + .where("id", "user-in-org" + type, config.getIdList())) + .stream() + .map(UserEntity::getId) + .collect(Collectors.toList()); + } +} diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/PositionCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/PositionCandidateDimensionParserStrategy.java new file mode 100644 index 000000000..a44569511 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/PositionCandidateDimensionParserStrategy.java @@ -0,0 +1,44 @@ +package org.hswebframework.web.workflow.dimension.parser; + +import org.hswebframework.web.entity.authorization.UserEntity; +import org.hswebframework.web.service.authorization.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.hswebframework.web.commons.entity.param.QueryParamEntity.*; + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@Component +@ConditionalOnBean(UserService.class) +public class PositionCandidateDimensionParserStrategy implements CandidateDimensionParserStrategy { + + @Autowired(required = false) + private UserService userService; + + @Override + public boolean support(String dimension) { + return DIMENSION_POSITION.equals(dimension) && userService != null; + } + + @Override + public List parse(StrategyConfig config) { + String type = config.getConfig("tree") + .map(String::valueOf) + .map("-"::concat) + .orElse(""); + return userService.select( + empty().noPaging() + //https://github.com/hs-web/hsweb-framework/tree/master/hsweb-system/hsweb-system-organizational#sql条件 + .where("id", "user-in-position"+type, config.getIdList())) + .stream() + .map(UserEntity::getId) + .collect(Collectors.toList()); + } +} diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RoleCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RoleCandidateDimensionParserStrategy.java new file mode 100644 index 000000000..9d7dde234 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RoleCandidateDimensionParserStrategy.java @@ -0,0 +1,37 @@ +package org.hswebframework.web.workflow.dimension.parser; + +import org.hswebframework.web.entity.authorization.UserEntity; +import org.hswebframework.web.service.authorization.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@Component +@ConditionalOnBean(UserService.class) +public class RoleCandidateDimensionParserStrategy implements CandidateDimensionParserStrategy { + + + @Autowired(required = false) + private UserService userService; + + + @Override + public boolean support(String dimension) { + return DIMENSION_ROLE.equals(dimension) && userService != null; + } + + @Override + public List parse(StrategyConfig config) { + return userService.selectByUserByRole(config.getIdList()) + .stream() + .map(UserEntity::getId) + .collect(Collectors.toList()); + } +} diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/UserCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/UserCandidateDimensionParserStrategy.java new file mode 100644 index 000000000..33c80a387 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/UserCandidateDimensionParserStrategy.java @@ -0,0 +1,23 @@ +package org.hswebframework.web.workflow.dimension.parser; + +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@Component +public class UserCandidateDimensionParserStrategy implements CandidateDimensionParserStrategy { + + @Override + public boolean support(String dimension) { + return DIMENSION_USER.equals(dimension); + } + + @Override + public List parse(StrategyConfig config) { + return config.getIdList(); + } +} diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParserTest.groovy b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParserTest.groovy new file mode 100644 index 000000000..8b0ed8e60 --- /dev/null +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/test/java/org/hswebframework/web/workflow/dimension/DefaultCandidateDimensionParserTest.groovy @@ -0,0 +1,56 @@ +package org.hswebframework.web.workflow.dimension + +import org.hswebframework.web.workflow.flowable.TestApplication +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ContextConfiguration +import org.springframework.test.context.web.WebAppConfiguration +import spock.lang.Specification + +/** + * @author zhouhao + * @since 3.0.0-RC + */ +@WebAppConfiguration +@ContextConfiguration +@SpringBootTest(classes = [TestApplication.class], properties = ["classpath:application.yml"]) +class DefaultCandidateDimensionParserTest extends Specification { + + @Autowired + private CandidateDimensionParser parser; + + def "Test Parse User"() { + setup: + def config = """ {"type":"user","idList":["admin"]} """ + and: + def dimension = parser.parse(config) + expect: + dimension != null + dimension.getCandidateUserIdList() != null + !dimension.getCandidateUserIdList().isEmpty() + dimension.getCandidateUserIdList().get(0) == "admin" + } + + def "Test Parse Role"() { + setup: + def config = """ {"type":"role","idList":["admin"]} """ + and: + def dimension = parser.parse(config) + expect: + dimension != null + dimension.getCandidateUserIdList() != null + dimension != CandidateDimension.empty + } + + + def "Test Parse Position"() { + setup: + def config = """ {"type":"position","idList":["test"],"tree":"parent"} """ + and: + def dimension = parser.parse(config) + expect: + dimension != null + dimension.getCandidateUserIdList() != null + dimension != CandidateDimension.empty + } +}