From f9e85456e3dda6969dbdfa58528bc023f9656cf8 Mon Sep 17 00:00:00 2001 From: liuhanqing <447067298@qq.com> Date: Sat, 16 Jan 2021 23:38:50 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90dict=E3=80=91=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=BC=96=E7=A0=81=E7=BF=BB=E8=AF=91=E9=80=9A?= =?UTF-8?q?=E8=BF=87jackson=E6=B3=A8=E8=A7=A3=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roses/kernel/rule/enums/TreeNodeEnum.java | 2 +- kernel-d-sms/sms-spring-boot-starter/pom.xml | 7 -- kernel-s-dict/dict-api/pom.xml | 9 +- .../roses/kernel/dict/api/DictApi.java | 13 +- .../api/serializer/DictValueSerializer.java | 116 ++++++++++++++++++ .../modular/service/impl/DictServiceImpl.java | 27 ++++ .../system-business-notice/pom.xml | 7 ++ .../notice/modular/entity/SysNotice.java | 11 +- 8 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/serializer/DictValueSerializer.java diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/TreeNodeEnum.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/TreeNodeEnum.java index 1cd846388..e4d23811c 100644 --- a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/TreeNodeEnum.java +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/enums/TreeNodeEnum.java @@ -53,7 +53,7 @@ public enum TreeNodeEnum { * @author liuhanqing * @date 2021/1/15 13:36 */ - public static String codeToMessage(String code) { + public static String codeToName(String code) { if (null != code) { for (TreeNodeEnum e : TreeNodeEnum.values()) { if (e.getCode().equals(code)) { diff --git a/kernel-d-sms/sms-spring-boot-starter/pom.xml b/kernel-d-sms/sms-spring-boot-starter/pom.xml index d63e78118..70a762ff5 100644 --- a/kernel-d-sms/sms-spring-boot-starter/pom.xml +++ b/kernel-d-sms/sms-spring-boot-starter/pom.xml @@ -24,13 +24,6 @@ 1.0.0 - - - cn.stylefeng.roses - sms-business-validation - 1.0.0 - - diff --git a/kernel-s-dict/dict-api/pom.xml b/kernel-s-dict/dict-api/pom.xml index e6e9cc297..4cc928e6c 100644 --- a/kernel-s-dict/dict-api/pom.xml +++ b/kernel-s-dict/dict-api/pom.xml @@ -16,7 +16,14 @@ jar - + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + diff --git a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java index 9ce66e23c..4acae4912 100644 --- a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java +++ b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java @@ -9,11 +9,22 @@ package cn.stylefeng.roses.kernel.dict.api; public interface DictApi { /** - * 获取字典名称通过id + * 获取字典名称通过code * * @author fengshuonan * @date 2020/12/25 14:14 */ String getDictNameByDictCode(String dictCode); + /** + * 通过字典类型编码和字典编码获取名称 + * + * @param dictTypeCode 字典类型编码 + * @param dictCode 字典编码 + * @return 字典名称 + * @author liuhanqing + * @date 2021/1/16 23:18 + */ + String getDictName(String dictTypeCode, String dictCode); + } diff --git a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/serializer/DictValueSerializer.java b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/serializer/DictValueSerializer.java new file mode 100644 index 000000000..a2edcb44c --- /dev/null +++ b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/serializer/DictValueSerializer.java @@ -0,0 +1,116 @@ +package cn.stylefeng.roses.kernel.dict.api.serializer; + +import cn.hutool.core.util.StrUtil; +import cn.stylefeng.roses.kernel.dict.api.context.DictContext; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; + +import java.io.IOException; +import java.lang.reflect.Type; + +/** + * jackson 序列化获取字典名称 + *

+ * 使用@JsonSerialize(using=DictValueSerializer.class) + * + * @author liuhanqing + * @date 2021/1/16 22:21 + */ +@JacksonStdImpl +public final class DictValueSerializer + extends StdScalarSerializer { + private static final long serialVersionUID = 1L; + /** + * 字典类型编码和字典值的分隔符 + */ + private static final String SEPARATOR = "|"; + /** + * 空值字符串 + */ + private static final String NULL_STR = "null"; + /** + * 字典值之前分隔符 + */ + private static final String VALUE_SEPARATOR = ","; + + public DictValueSerializer() { + super(String.class, false); + } + + @Override + public boolean isEmpty(SerializerProvider prov, Object value) { + String str = (String) value; + return str.length() == 0; + } + + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { + + if (value == null) { + gen.writeNull(); + return; + } + + String strVal = value.toString(); + // 判断需要翻译字典值是否为不空且含有字典标识 + if (StrUtil.isNotBlank(strVal) && strVal.indexOf(SEPARATOR) > 0) { + // 分隔需要序列化的值 + String[] dictArr = strVal.split("\\|"); + if (dictArr.length == 2) { + // 获取字典编码值 + String dictCode = dictArr[1]; + if (StrUtil.isBlank(dictCode) || NULL_STR.equals(dictArr[1])) { + strVal = StrUtil.EMPTY; + } else { + // 获取字典名称逻辑,多个名称用逗号分隔 + String[] codeArr = dictCode.split(VALUE_SEPARATOR); + if (codeArr.length > 0) { + if (codeArr.length == 1) { + strVal = DictContext.me().getDictName(dictArr[0], codeArr[0]); + } else { + StringBuffer sb = new StringBuffer(); + for (String dic : codeArr) { + String dicVal = DictContext.me().getDictName(dictArr[0], dic); + if (StrUtil.isNotBlank(dicVal)) { + sb.append(dicVal).append(","); + } + } + if (StrUtil.isNotEmpty(sb)) { + strVal = StrUtil.removeSuffix(sb.toString(), ","); + } else { + strVal = dictArr[1]; + } + } + } + } + } else { + strVal = StrUtil.EMPTY; + } + } + gen.writeString(strVal); + } + + @Override + public final void serializeWithType(Object value, JsonGenerator gen, SerializerProvider provider, + TypeSerializer typeSer) throws IOException { + // no type info, just regular serialization + gen.writeString((String) value); + } + + @Override + public JsonNode getSchema(SerializerProvider provider, Type typeHint) { + return createSchemaNode("string", true); + } + + @Override + public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException { + visitStringFormat(visitor, typeHint); + } +} diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java index 51520a929..221b33c7b 100644 --- a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java +++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java @@ -296,6 +296,33 @@ public class DictServiceImpl extends ServiceImpl implements return StrUtil.EMPTY; } } + @Override + public String getDictName(String dictTypeCode, String dictCode) { + LambdaQueryWrapper sysDictLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysDictLambdaQueryWrapper.eq(SysDict::getDictTypeCode, dictTypeCode); + sysDictLambdaQueryWrapper.eq(SysDict::getDictCode, dictCode); + sysDictLambdaQueryWrapper.ne(SysDict::getDelFlag, YesOrNotEnum.Y.getCode()); + + List list = this.list(sysDictLambdaQueryWrapper); + + // 如果查询不到字典,则返回空串 + if (list.isEmpty()) { + return StrUtil.EMPTY; + } + + // 字典code存在多个重复的,返回空串并打印错误日志 + if (list.size() > 1) { + log.error(DICT_CODE_REPEAT.getUserTip(), "", dictCode); + return StrUtil.EMPTY; + } + + String dictName = list.get(0).getDictName(); + if (dictName != null) { + return dictName; + } else { + return StrUtil.EMPTY; + } + } /** * 批量修改pids的请求 diff --git a/kernel-s-system/system-business-notice/pom.xml b/kernel-s-system/system-business-notice/pom.xml index 296954e47..86a747d4a 100644 --- a/kernel-s-system/system-business-notice/pom.xml +++ b/kernel-s-system/system-business-notice/pom.xml @@ -61,6 +61,13 @@ 1.0.0 + + + cn.stylefeng.roses + dict-api + 1.0.0 + + diff --git a/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/entity/SysNotice.java b/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/entity/SysNotice.java index 3bd509662..2b37219c4 100644 --- a/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/entity/SysNotice.java +++ b/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/entity/SysNotice.java @@ -1,17 +1,16 @@ package cn.stylefeng.roses.kernel.notice.modular.entity; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; -import cn.stylefeng.roses.kernel.message.api.enums.MessagePriorityLevelEnum; +import cn.stylefeng.roses.kernel.dict.api.serializer.DictValueSerializer; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; /** * 通知表 @@ -79,12 +78,16 @@ public class SysNotice extends BaseEntity { @TableField(value = "del_flag", fill = FieldFill.INSERT) private String delFlag; - public String getPriorityLevelValue(){ + /*public String getPriorityLevelValue(){ AtomicReference value = new AtomicReference<>(""); Optional.ofNullable(this.priorityLevel).ifPresent(val ->{ value.set(MessagePriorityLevelEnum.getName(this.priorityLevel)); }); return value.get(); + }*/ + @JsonSerialize(using = DictValueSerializer.class) + public String getPriorityLevelValue() { + return "priority_level|" + this.priorityLevel; } }