From f7a20031883f7f481a2480b4ea53d1be972ed8ea Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Thu, 28 Jun 2018 23:10:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=95=B0=E6=8D=AE=E5=AD=97?= =?UTF-8?q?=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/service/GenericEntityService.java | 3 +- .../hswebframework/web/dict/DictDefine.java | 2 +- .../web/dict/DictDefineRepository.java | 1 + .../hswebframework/web/dict/DictParser.java | 2 +- .../web/dict/DictSupportApi.java | 1 + .../org/hswebframework/web/dict/EnumDict.java | 64 +++++-- .../hswebframework/web/dict/ItemDefine.java | 9 +- .../dict/defaults/DefaultClassDictDefine.java | 3 +- .../web/dict/defaults/DefaultDictDefine.java | 5 +- .../defaults/DefaultDictDefineRepository.java | 78 +------- .../web/dict/defaults/DefaultDictParser.java | 16 +- .../web/dict/defaults/DefaultItemDefine.java | 7 +- .../web/dict/DictDefineTest.java | 56 ------ .../FastJsonGenericHttpMessageConverter.java | 23 +-- .../api/entity/DictionaryItemEntity.java | 59 +++---- .../entity/SimpleDictionaryItemEntity.java | 166 +----------------- .../simple/BoostDictDefineRepository.java | 22 +-- .../dict/DefaultOptionalConvertBuilder.java | 5 + ...tionaryOptionalConvertBuilderStrategy.java | 12 +- .../simple/dict/EnumDictOptionConverter.java | 75 ++++++++ .../simple/dict/EnumDictValueConverter.java | 119 +++++++++++++ .../form/simple/validator/GroovyVlidator.java | 4 +- .../workflow/web/FlowableUtilsController.java | 4 +- 23 files changed, 342 insertions(+), 394 deletions(-) create mode 100644 hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java create mode 100644 hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java diff --git a/hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java b/hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java index 6a16db378..aac1d1c03 100644 --- a/hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java +++ b/hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java @@ -29,6 +29,7 @@ import org.hswebframework.web.validator.group.UpdateGroup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import javax.annotation.PostConstruct; import java.util.ArrayList; @@ -120,7 +121,7 @@ public abstract class GenericEntityService, PK> @Override public PK insert(E entity) { if (entity.getId() != null) { - if ((entity.getId() instanceof String)) { + if ((entity.getId() instanceof String) && !StringUtils.isEmpty(entity.getId())) { tryValidateProperty(entity.getId().toString().matches("[a-zA-Z0-9_\\-]+"), "id", "只能由数字,字母,下划线,和-组成"); } tryValidateProperty(selectByPk(entity.getId()) == null, "id", entity.getId() + "已存在"); diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefine.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefine.java index 2fa346cfa..039c682c7 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefine.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefine.java @@ -16,6 +16,6 @@ public interface DictDefine extends Serializable { String getParserId(); - List getItems(); + List> getItems(); } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefineRepository.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefineRepository.java index 31069c191..0a13e23ba 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefineRepository.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictDefineRepository.java @@ -9,6 +9,7 @@ import java.util.List; public interface DictDefineRepository { DictDefine getDefine(String id); + @Deprecated List getDefine(Class type); void addDefine(DictDefine dictDefine); diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictParser.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictParser.java index 95c103abb..43fad705d 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictParser.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictParser.java @@ -7,7 +7,7 @@ package org.hswebframework.web.dict; public interface DictParser { String getId(); - String parseText(DictDefine dictDefine, String value); + String parseText(DictDefine dictDefine, Object value); String parseValue(DictDefine dictDefine, String text); } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictSupportApi.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictSupportApi.java index 4ffba8112..948d8d1c0 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/DictSupportApi.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/DictSupportApi.java @@ -4,6 +4,7 @@ package org.hswebframework.web.dict; * @author zhouhao * @since 3.0 */ +@Deprecated public interface DictSupportApi { DictParser getParser(String id, String defaultId); diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java index 39fc8d9ef..46147835b 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java @@ -9,14 +9,13 @@ import com.alibaba.fastjson.parser.JSONToken; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.serializer.JSONSerializable; import com.alibaba.fastjson.serializer.JSONSerializer; +import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Predicate; +import java.util.function.Supplier; /** * 枚举字典,使用枚举来实现数据字典,可通过集成此接口来实现一些有趣的功能. @@ -70,17 +69,30 @@ public interface EnumDict extends JSONSerializable { * @param v value * @return 是否相等 */ + @SuppressWarnings("all") default boolean eq(Object v) { + if (v == null) { + return false; + } + if (v instanceof Object[]) { + v = Arrays.asList(v); + } + if (v instanceof Collection) { + return ((Collection) v).stream().anyMatch(this::eq); + } + v = ((Map) v).getOrDefault("value", ((Map) v).get("text")); return this == v || getValue() == v || getValue().equals(v) - || v.equals(getMask()) + || (v instanceof Number ? in(((Number) v).longValue()) : false) || String.valueOf(getValue()).equalsIgnoreCase(String.valueOf(v)) - || getText().equalsIgnoreCase(String.valueOf(v)); + || v.equals(getMask()) + || getText().equalsIgnoreCase(String.valueOf(v) + ); } - default boolean in(long bit) { - return (bit & getMask()) != 0; + default boolean in(long mask) { + return (mask & getMask()) != 0; } /** @@ -100,7 +112,7 @@ public interface EnumDict extends JSONSerializable { * @param 枚举类型 * @return 查找到的结果 */ - static Optional find(Class type, Predicate predicate) { + static Optional find(Class type, Predicate predicate) { if (type.isEnum()) { for (T enumDict : type.getEnumConstants()) { if (predicate.test(enumDict)) { @@ -116,7 +128,7 @@ public interface EnumDict extends JSONSerializable { * * @see this#find(Class, Predicate) */ - static > Optional findByValue(Class type, Object value) { + static > Optional findByValue(Class type, Object value) { return find(type, e -> e.getValue() == value || e.getValue().equals(value) || String.valueOf(e.getValue()).equalsIgnoreCase(String.valueOf(value))); } @@ -125,7 +137,7 @@ public interface EnumDict extends JSONSerializable { * * @see this#find(Class, Predicate) */ - static Optional findByText(Class type, String text) { + static Optional findByText(Class type, String text) { return find(type, e -> e.getText().equalsIgnoreCase(text)); } @@ -134,7 +146,7 @@ public interface EnumDict extends JSONSerializable { * * @see this#find(Class, Predicate) */ - static Optional find(Class type, Object target) { + static Optional find(Class type, Object target) { return find(type, v -> v.eq(target)); } @@ -151,27 +163,41 @@ public interface EnumDict extends JSONSerializable { } @SafeVarargs - static boolean maskIn(long bit, T... t) { + static boolean maskIn(long mask, T... t) { long value = toMask(t); - return (bit & value) == value; + return (mask & value) == value; } @SafeVarargs - static boolean maskInAny(long bit, T... t) { + static boolean maskInAny(long mask, T... t) { long value = toMask(t); - return (bit & value) != 0; + return (mask & value) != 0; } - static List getByMask(Class tClass, long bit) { + static List getByMask(List allOptions, long mask) { + if (allOptions.size() >= 64) { + throw new UnsupportedOperationException("不支持选项超过64个数据字典!"); + } List arr = new ArrayList<>(); - for (T t : tClass.getEnumConstants()) { - if (t.in(bit)) { + List all = allOptions; + for (T t : all) { + if (t.in(mask)) { arr.add(t); } } return arr; } + static List getByMask(Supplier> allOptionsSuppiler, long mask) { + return getByMask(allOptionsSuppiler.get(), mask); + } + + + static List getByMask(Class tClass, long mask) { + + return getByMask(Arrays.asList(tClass.getEnumConstants()), mask); + } + /** * 默认在序列化为json时,默认会以对象方式写出枚举,可通过系统环境变量 hsweb.enum.dict.disableWriteJSONObject关闭默认设置。 * 比如: java -jar -Dhsweb.enum.dict.disableWriteJSONObject=true diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/ItemDefine.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/ItemDefine.java index c09c8660a..ae15cee87 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/ItemDefine.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/ItemDefine.java @@ -6,13 +6,20 @@ import java.util.List; * @author zhouhao * @since 3.0 */ -public interface ItemDefine { +public interface ItemDefine extends EnumDict { String getText(); String getValue(); String getComments(); + int getOrdinal(); + + @Override + default int ordinal() { + return getOrdinal(); + } + List getChildren(); } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java index 9a16c3aa8..2f332515b 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultClassDictDefine.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hswebframework.web.dict.ClassDictDefine; +import org.hswebframework.web.dict.EnumDict; import org.hswebframework.web.dict.ItemDefine; import java.util.List; @@ -23,5 +24,5 @@ public class DefaultClassDictDefine implements ClassDictDefine { private String alias; private String comments; private String parserId; - private List items; + private List items; } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java index 7a168467b..87398a815 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefine.java @@ -4,9 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.hswebframework.web.dict.ClassDictDefine; import org.hswebframework.web.dict.DictDefine; -import org.hswebframework.web.dict.ItemDefine; +import org.hswebframework.web.dict.EnumDict; import java.util.List; @@ -24,5 +23,5 @@ public class DefaultDictDefine implements DictDefine { private String alias; private String comments; private String parserId; - private List items; + private List> items; } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java index 8cc724287..b6ebcf06a 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictDefineRepository.java @@ -43,17 +43,7 @@ public class DefaultDictDefineRepository implements DictDefineRepository { define.setComments(type.getSimpleName()); } - List items = new ArrayList<>(); - - for (T t : type.getEnumConstants()) { - items.add(DefaultItemDefine.builder() - .text(t.getText()) - .comments(t.getComments()) - .value(String.valueOf(t.getValue())) - .build()); - - } - define.setItems(items); + define.setItems(Arrays.asList(type.getEnumConstants())); return define; @@ -64,75 +54,11 @@ public class DefaultDictDefineRepository implements DictDefineRepository { return parsedDict.get(id); } - private List parseField(Class type) { - if (type == Object.class) { - return Collections.emptyList(); - } - List fields = new ArrayList<>(); - ReflectionUtils.doWithFields(type, fields::add); - return fields; - } - @Override public List getDefine(Class type) { - return this.parseDefine(type); + return Collections.emptyList(); } - protected List parseDefine(Class type) { - List defines = new ArrayList<>(); - - if (type.isEnum() && EnumDict.class.isAssignableFrom(type)) { - return Arrays.asList(parseEnumDict(type)); - } - for (Field field : parseField(type)) { - Dict dict = field.getAnnotation(Dict.class); - if (dict == null) { - continue; - } - String id = dict.id(); - DictDefine dictDefine = getDefine(id); - if (dictDefine instanceof ClassDictDefine) { - defines.add(((ClassDictDefine) dictDefine)); - } else { - DefaultClassDictDefine define; - if (dictDefine != null) { - List items = dictDefine.getItems() - .stream() - .map(item -> DefaultItemDefine.builder() - .text(item.getText()) - .value(item.getValue()) - .comments(String.join(",", item.getComments())) - .build()) - .collect(Collectors.toList()); - define = DefaultClassDictDefine.builder() - .id(id) - .alias(dictDefine.getAlias()) - .comments(dictDefine.getComments()) - .field(field.getName()) - .items(items) - .build(); - - } else { - List items = Arrays - .stream(dict.items()) - .map(item -> DefaultItemDefine.builder() - .text(item.text()) - .value(item.value()) - .comments(String.join(",", item.comments())) - .build()).collect(Collectors.toList()); - define = DefaultClassDictDefine.builder() - .id(id) - .alias(dict.alias()) - .comments(dict.comments()) - .field(field.getName()) - .items(items) - .build(); - } - defines.add(define); - } - } - return defines; - } @Override public void addDefine(DictDefine dictDefine) { diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictParser.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictParser.java index e6de7e58c..b289dce92 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictParser.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultDictParser.java @@ -2,8 +2,11 @@ package org.hswebframework.web.dict.defaults; import org.hswebframework.web.dict.DictDefine; import org.hswebframework.web.dict.DictParser; +import org.hswebframework.web.dict.EnumDict; import org.hswebframework.web.dict.ItemDefine; +import java.util.stream.Collectors; + /** * @author zhouhao * @since 3.0 @@ -15,21 +18,20 @@ public class DefaultDictParser implements DictParser { } @Override - public String parseText(DictDefine dictDefine, String value) { + public String parseText(DictDefine dictDefine, Object value) { return dictDefine.getItems() .stream() - .filter(itemDefine -> itemDefine.getValue().equals(value)) - .map(ItemDefine::getText) - .findFirst() - .orElse(value); + .filter(itemDefine -> itemDefine.eq(value)) + .map(EnumDict::getText) + .collect(Collectors.joining(",")); } @Override public String parseValue(DictDefine dictDefine, String text) { return dictDefine.getItems() .stream() - .filter(itemDefine -> itemDefine.getText().equals(text)) - .map(ItemDefine::getValue) + .filter(itemDefine -> itemDefine.eq(text)) + .map(EnumDict::getValue) .findFirst() .orElse(text); } diff --git a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultItemDefine.java b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultItemDefine.java index 57d32daaf..72dd7d015 100644 --- a/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultItemDefine.java +++ b/hsweb-core/src/main/java/org/hswebframework/web/dict/defaults/DefaultItemDefine.java @@ -17,8 +17,9 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class DefaultItemDefine implements ItemDefine { - private String text; - private String value; - private String comments; + private String text; + private String value; + private String comments; + private int ordinal; private List children; } diff --git a/hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java b/hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java index 45f930206..fcd94b660 100644 --- a/hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java +++ b/hsweb-core/src/test/java/org/hswebframework/web/dict/DictDefineTest.java @@ -61,60 +61,4 @@ public class DictDefineTest { } - @Test - public void testParse() { -// JSON.toJSONString("",SerializerFeature.PrettyFormat) - DefaultClassDictDefine define = DefaultClassDictDefine.builder() - .id("test-code") - .field("code") - .build(); - repository.registerDefine(define); - - - List defines = repository.getDefine(UseDictEntity2.class); - assertFalse(defines.isEmpty()); - assertEquals(defines.size(), 2); - - defines = repository.getDefine(UserCode.class); - assertFalse(defines.isEmpty()); - assertEquals(defines.size(), 1); - - assertEquals(defines.get(0).getItems().size(), UserCode.values()); - - - } - - @Test - public void testWrap() { - assertNull(api.wrap(null)); - assertNotNull(api.wrap(new HashMap<>())); - assertNull(api.unwrap(null)); - assertNotNull(api.unwrap(new HashMap<>())); - - UseDictEntity2 entity = new UseDictEntity2(); - entity.setStatus(new Integer(1).byteValue()); - - entity = api.wrap(entity); - - assertEquals(entity.getStatusText(), "正常"); - - entity.setStatus(null); - entity = api.unwrap(entity); - assertEquals(entity.getStatus(), Byte.valueOf((byte) 1)); - - entity.setStatus((byte) 2); - entity = api.unwrap(entity); - assertEquals(entity.getStatus(), Byte.valueOf((byte) 2)); - - entity.setStatus(null); - entity.setStatusText(null); - entity.setCode("1"); - api.wrap(entity); - - assertNull(entity.getStatusText()); - assertEquals(entity.getCode(), "1"); - - api.unwrap(entity); - assertEquals(entity.getCode(), "1"); - } } \ No newline at end of file diff --git a/hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/convert/FastJsonGenericHttpMessageConverter.java b/hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/convert/FastJsonGenericHttpMessageConverter.java index c64a42524..18df84919 100644 --- a/hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/convert/FastJsonGenericHttpMessageConverter.java +++ b/hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/convert/FastJsonGenericHttpMessageConverter.java @@ -39,8 +39,9 @@ import java.util.Set; public class FastJsonGenericHttpMessageConverter extends AbstractGenericHttpMessageConverter implements Ordered { public final static Charset UTF8 = Charset.forName("UTF-8"); - @Autowired(required = false) - private DictSupportApi dictSupportApi; + +// @Autowired(required = false) +// private DictSupportApi dictSupportApi; private Charset charset = UTF8; @@ -116,9 +117,9 @@ public class FastJsonGenericHttpMessageConverter extends AbstractGenericHttpMess } } Object object = JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), type); - if (dictSupportApi != null) { - object = dictSupportApi.unwrap(object); - } +// if (dictSupportApi != null) { +// object = dictSupportApi.unwrap(object); +// } return object; } @@ -149,14 +150,14 @@ public class FastJsonGenericHttpMessageConverter extends AbstractGenericHttpMess String callback = ThreadLocalUtils.getAndRemove("jsonp-callback"); if (obj instanceof ResponseMessage) { ResponseMessage message = (ResponseMessage) obj; - if (dictSupportApi != null) { - message.setResult(dictSupportApi.wrap(message.getResult())); - } +// if (dictSupportApi != null) { +// message.setResult(dictSupportApi.wrap(message.getResult())); +// } text = JSON.toJSONString(obj, FastJsonHttpMessageConverter.parseFilter(message), features); } else { - if (dictSupportApi != null) { - obj = dictSupportApi.wrap(obj); - } +// if (dictSupportApi != null) { +// obj = dictSupportApi.wrap(obj); +// } text = JSON.toJSONString(obj, features); } if (!StringUtils.isNullOrEmpty(callback)) { diff --git a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/DictionaryItemEntity.java b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/DictionaryItemEntity.java index 175fb72d8..d18c07088 100644 --- a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/DictionaryItemEntity.java +++ b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/DictionaryItemEntity.java @@ -17,6 +17,8 @@ package org.hswebframework.web.dictionary.api.entity; import org.hswebframework.web.commons.entity.TreeSortSupportEntity; +import org.hswebframework.web.dict.EnumDict; +import org.hswebframework.web.dict.ItemDefine; import java.util.List; @@ -25,75 +27,58 @@ import java.util.List; * * @author hsweb-generator-online */ -public interface DictionaryItemEntity extends TreeSortSupportEntity { +public interface DictionaryItemEntity extends TreeSortSupportEntity, EnumDict { /*------------------------------------------- | 属性名常量 | ===========================================*/ /** * 字典id */ - String dictId = "dictId"; + String dictId = "dictId"; /** * 名称 */ - String name = "name"; + String name = "name"; /** * 字典值 */ - String value = "value"; + String value = "value"; /** * 字典文本 */ - String text = "text"; + String text = "text"; /** * 字典值类型 */ - String valueType = "valueType"; + String valueType = "valueType"; /** * 是否启用 */ - String status = "status"; + String status = "status"; /** * 说明 */ - String describe = "describe"; + String describe = "describe"; /** * 父级选项 */ - String parentId = "parentId"; + String parentId = "parentId"; /** * 树编码 */ - String path = "path"; + String path = "path"; /** * 快速搜索码 */ - String searchCode = "searchCode"; + String searchCode = "searchCode"; /** * 排序索引 */ - String sortIndex = "sortIndex"; + String sortIndex = "sortIndex"; /** * 树结构层级 */ - String level = "level"; - /** - * 文本提取表达式 - */ - String textExpression = "textExpression"; - - /** - * 文本提取表达式 - */ - String valueExpression = "valueExpression"; - - String getTextExpression(); - - void setTextExpression(String textExpression); - - String getValueExpression(); - - void setValueExpression(String valueExpression); + String level = "level"; /** * @return 字典id @@ -176,4 +161,18 @@ public interface DictionaryItemEntity extends TreeSortSupportEntity { void setSearchCode(String searchCode); void setChildren(List children); + + Integer getOrdinal(); + + void setOrdinal(Integer ordinal); + + @Override + default int ordinal() { + return getOrdinal() == null ? 0 : getOrdinal(); + } + + @Override + default String getComments() { + return getDescribe(); + } } \ No newline at end of file diff --git a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/SimpleDictionaryItemEntity.java b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/SimpleDictionaryItemEntity.java index 820d78693..0fffd1a15 100644 --- a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/SimpleDictionaryItemEntity.java +++ b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-api/src/main/java/org/hswebframework/web/dictionary/api/entity/SimpleDictionaryItemEntity.java @@ -16,6 +16,8 @@ */ package org.hswebframework.web.dictionary.api.entity; +import lombok.Getter; +import lombok.Setter; import org.hswebframework.web.commons.entity.SimpleTreeSortSupportEntity; import java.util.List; @@ -25,6 +27,8 @@ import java.util.List; * * @author hsweb-generator-online */ +@Getter +@Setter public class SimpleDictionaryItemEntity extends SimpleTreeSortSupportEntity implements DictionaryItemEntity { //字典id private String dictId; @@ -37,7 +41,7 @@ public class SimpleDictionaryItemEntity extends SimpleTreeSortSupportEntity children; - @Override - @SuppressWarnings("unchecked") - public List getChildren() { - return children; - } - - @Override - public void setChildren(List children) { - this.children = children; - } - - @Override - public String getTextExpression() { - return textExpression; - } - - @Override - public void setTextExpression(String textExpression) { - this.textExpression = textExpression; - } - - @Override - public String getValueExpression() { - return valueExpression; - } - - @Override - public void setValueExpression(String valueExpression) { - this.valueExpression = valueExpression; - } - - /** - * @return 字典id - */ - @Override - public String getDictId() { - return this.dictId; - } - - /** - * 设置 字典id - */ - @Override - public void setDictId(String dictId) { - this.dictId = dictId; - } - - /** - * @return 名称 - */ - @Override - public String getName() { - return this.name; - } - - /** - * 设置 名称 - */ - @Override - public void setName(String name) { - this.name = name; - } - - /** - * @return 字典值 - */ - @Override - public String getValue() { - return this.value; - } - - /** - * 设置 字典值 - */ - @Override - public void setValue(String value) { - this.value = value; - } - - /** - * @return 字典文本 - */ - @Override - public String getText() { - return this.text; - } - - /** - * 设置 字典文本 - */ - @Override - public void setText(String text) { - this.text = text; - } - - /** - * @return 字典值类型 - */ - @Override - public String getValueType() { - return this.valueType; - } - - /** - * 设置 字典值类型 - */ - @Override - public void setValueType(String valueType) { - this.valueType = valueType; - } - - /** - * @return 是否启用 - */ - @Override - public Byte getStatus() { - return this.status; - } - - /** - * 设置 是否启用 - */ - @Override - public void setStatus(Byte enabled) { - this.status = enabled; - } - - /** - * @return 说明 - */ - @Override - public String getDescribe() { - return this.describe; - } - - /** - * 设置 说明 - */ - @Override - public void setDescribe(String describe) { - this.describe = describe; - } - - /** - * @return 快速搜索码 - */ - @Override - public String getSearchCode() { - return this.searchCode; - } - - /** - * 设置 快速搜索码 - */ - @Override - public void setSearchCode(String searchCode) { - this.searchCode = searchCode; - } } \ No newline at end of file diff --git a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-local/src/main/java/org/hswebframework/web/dictionary/simple/BoostDictDefineRepository.java b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-local/src/main/java/org/hswebframework/web/dictionary/simple/BoostDictDefineRepository.java index e223338b7..6e9033fc9 100644 --- a/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-local/src/main/java/org/hswebframework/web/dictionary/simple/BoostDictDefineRepository.java +++ b/hsweb-system/hsweb-system-dictionary/hsweb-system-dictionary-local/src/main/java/org/hswebframework/web/dictionary/simple/BoostDictDefineRepository.java @@ -1,11 +1,9 @@ package org.hswebframework.web.dictionary.simple; -import org.hswebframework.web.dict.ClassDictDefine; import org.hswebframework.web.dict.DictDefine; -import org.hswebframework.web.dict.ItemDefine; +import org.hswebframework.web.dict.EnumDict; import org.hswebframework.web.dict.defaults.DefaultDictDefine; import org.hswebframework.web.dict.defaults.DefaultDictDefineRepository; -import org.hswebframework.web.dict.defaults.DefaultItemDefine; import org.hswebframework.web.dictionary.api.DictionaryService; import org.hswebframework.web.dictionary.api.entity.DictionaryEntity; import org.springframework.beans.factory.annotation.Autowired; @@ -13,8 +11,8 @@ import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * @author zhouhao @@ -34,15 +32,8 @@ public class BoostDictDefineRepository extends DefaultDictDefineRepository { if (entity == null) { return super.getDefine(id); } - List items = entity.getItems() - .stream() - .map(item -> DefaultItemDefine - .builder() - .value(item.getValue()) - .text(item.getText()) - .comments(item.getDescribe()) - .build()) - .collect(Collectors.toList()); + List> items = new ArrayList<>(entity.getItems()); + return DefaultDictDefine.builder() .id(id) @@ -51,9 +42,4 @@ public class BoostDictDefineRepository extends DefaultDictDefineRepository { .build(); } - @Override - @Cacheable(key = "'DictDefineByClass:'+#type.name") - public List getDefine(Class type) { - return super.getDefine(type); - } } diff --git a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DefaultOptionalConvertBuilder.java b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DefaultOptionalConvertBuilder.java index 3c8022746..eefb8d38c 100644 --- a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DefaultOptionalConvertBuilder.java +++ b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DefaultOptionalConvertBuilder.java @@ -5,7 +5,9 @@ import org.hswebframework.web.entity.form.DictConfig; import org.hswebframework.web.service.form.OptionalConvertBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import java.util.Collections; import java.util.List; /** @@ -20,6 +22,9 @@ public class DefaultOptionalConvertBuilder implements OptionalConvertBuilder { @Override public OptionConverter build(DictConfig dictConfig) { + if(CollectionUtils.isEmpty(strategies)){ + return null; + } return strategies.stream() .filter(strategy -> strategy.support(dictConfig.getType())) .findFirst() diff --git a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java index 1dec9738f..211bca379 100644 --- a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java +++ b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/DictionaryOptionalConvertBuilderStrategy.java @@ -3,7 +3,9 @@ package org.hswebframework.web.service.form.simple.dict; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.hswebframework.ezorm.core.OptionConverter; +import org.hswebframework.web.dict.DictDefineRepository; import org.hswebframework.web.entity.form.DictConfig; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -13,15 +15,21 @@ import org.springframework.stereotype.Component; */ @Component public class DictionaryOptionalConvertBuilderStrategy implements OptionalConvertBuilderStrategy { + @Autowired(required = false) + private DictDefineRepository dictDefineRepository; + @Override public boolean support(String type) { - return "dict".equals(type); + return "dict".equals(type) && dictDefineRepository != null; } + @Override public OptionConverter build(DictConfig dictConfig) { JSONObject conf = JSON.parseObject(dictConfig.getConfig()); - String dictType=conf.getString("dictType"); + String dictType = conf.getString("dictType"); + + return null; } diff --git a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java new file mode 100644 index 000000000..667ead988 --- /dev/null +++ b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictOptionConverter.java @@ -0,0 +1,75 @@ +package org.hswebframework.web.service.form.simple.dict; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.ezorm.core.OptionConverter; +import org.hswebframework.web.dict.EnumDict; + +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +@Slf4j +public class EnumDictOptionConverter implements OptionConverter { + + protected Supplier> allOptionSupplier; + + @Getter + @Setter + protected boolean multi; + + @Getter + @Setter + protected boolean writeObject; + + protected String fieldName; + + public EnumDictOptionConverter(Supplier> supplier, String fieldName) { + this.allOptionSupplier = supplier; + this.fieldName = fieldName; + } + + @Override + public Object getOptions() { + return allOptionSupplier.get(); + } + + @Override + public String getFieldName() { + return fieldName; + } + + @Override + public Object converterData(Object o) { + //什么也不做,EnumDictValueConverter会进行处理 + return o; + } + + @Override + @SuppressWarnings("all") + public Object converterValue(Object o) { + List values; + if (o instanceof String) { + values = Arrays.asList(((String) o).split("[, ; ;]")); + } else if (o instanceof Object[]) { + values = Arrays.asList(((Object[]) o)); + } else if (o instanceof Collection) { + values = new ArrayList<>(((Collection) o)); + } else { + values = Collections.singletonList(o); + } + if (writeObject) { + return allOptionSupplier.get() + .stream() + .filter(e -> e.eq(o)) + .collect(Collectors.toSet()); + } + return allOptionSupplier.get() + .stream() + .filter(e -> e.eq(o)) + .map(EnumDict::getText) + .map(String::valueOf) + .collect(Collectors.joining(",")); + } +} diff --git a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java new file mode 100644 index 000000000..3b555c0ae --- /dev/null +++ b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/dict/EnumDictValueConverter.java @@ -0,0 +1,119 @@ +package org.hswebframework.web.service.form.simple.dict; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.ezorm.core.ValueConverter; +import org.hswebframework.web.dict.EnumDict; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +@Slf4j +public class EnumDictValueConverter implements ValueConverter { + + protected Supplier> allOptionSupplier; + + protected Function orElseGet = v -> { + log.warn("选项[{}]在字典中不存在.全部选项:[{}]", v, allOptionSupplier.get()); + return null; + }; + + public EnumDictValueConverter(Supplier> allOptionSupplier) { + this.allOptionSupplier = allOptionSupplier; + } + + public EnumDictValueConverter(Supplier> allOptionSupplier, Function orElseGet) { + this.allOptionSupplier = allOptionSupplier; + this.orElseGet = orElseGet; + } + + @Setter + @Getter + private boolean multi = true; + + @Setter + @Getter + private boolean dataToMask = true; + + protected T find(Object value) { + return allOptionSupplier.get() + .stream() + .filter(e -> e.eq(value)) + .findFirst() + .orElseGet(() -> orElseGet.apply(value)); + + } + + @Override + @SuppressWarnings("all") + public Object getData(Object o) { + if (StringUtils.isEmpty(o)) { + return o; + } + //多选 + if (multi) { + List values; + if (o instanceof String) { + values = Arrays.asList(((String) o).split("[, ; ;]")); + } else if (o instanceof Object[]) { + values = Arrays.asList(((Object[]) o)); + } else if (o instanceof Collection) { + values = new ArrayList<>(((Collection) o)); + } else { + values = Collections.singletonList(o); + } + //转为mask + if (dataToMask) { + if (o instanceof Number) { + return ((Number) o).longValue(); + } + return EnumDict.toMask(values.stream() + .map(this::find) + .filter(Objects::nonNull) + .toArray(EnumDict[]::new)); + } + //以逗号分隔 + return values.stream() + .map(this::find) + .filter(Objects::nonNull) + .map(EnumDict::getValue) + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + + return Optional.ofNullable(this.find(o)) + .map(EnumDict::getValue) + .orElse(o); + } + + @Override + public Object getValue(Object o) { + if (multi) { + if (dataToMask) { + Long mask = null; + if (org.hswebframework.utils.StringUtils.isNumber(o)) { + mask = org.hswebframework.utils.StringUtils.toLong(o); + } + if (mask != null) { + return EnumDict.getByMask(allOptionSupplier, mask) + .stream() + .map(EnumDict::getValue) + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + } + return allOptionSupplier.get() + .stream() + .filter(e -> e.eq(o)) + .map(EnumDict::getValue) + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + return o; + } + +} diff --git a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java index 0b797c1c9..1e310ba31 100644 --- a/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java +++ b/hsweb-system/hsweb-system-dynamic-form/hsweb-system-dynamic-form-local/src/main/java/org/hswebframework/web/service/form/simple/validator/GroovyVlidator.java @@ -1,7 +1,5 @@ package org.hswebframework.web.service.form.simple.validator; -/** - * Created by zhouhao on 2017/7/12. - */ public class GroovyVlidator { + } diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java index 46439428e..1ad089a7b 100644 --- a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableUtilsController.java @@ -39,11 +39,11 @@ public class FlowableUtilsController { List activities = bpmActivityService.getActivitiesById(procDefId, null); for (ActivityImpl activity : activities) { Map map = new HashMap<>(); - if ("startEvent".equals(activity.getProperty("dimension"))) { + if ("startEvent".equals(activity.getProperty("type"))) { map.put("id", activity.getId()); map.put("name", "流程发起者"); // map.put("info", actDefService.selectSingle(single(ActDefEntity.actId, activity.getId()))); - } else if ("userTask".equals(activity.getProperty("dimension"))) { + } else if ("userTask".equals(activity.getProperty("type"))) { map.put("id", activity.getId()); map.put("name", activity.getProperty("name").toString()); // map.put("info", actDefService.selectSingle(single(ActDefEntity.actId, activity.getId())));