Parcourir la source

添加字段映射模块,使用字段注解查询对应的值

wanggaokun il y a 1 an
Parent
commit
5849cb5f4d
19 fichiers modifiés avec 481 ajouts et 6 suppressions
  1. 16 0
      eco-common/common-core/src/main/java/org/eco/common/core/service/UserService.java
  2. 19 0
      eco-common/common-mapper/.mvn/wrapper/maven-wrapper.properties
  3. 24 0
      eco-common/common-mapper/pom.xml
  4. 41 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/annotation/FieldMapper.java
  5. 24 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/annotation/FieldMapperType.java
  6. 49 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/config/FieldMapperConfig.java
  7. 34 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/constant/MapperConstant.java
  8. 19 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/FieldMapperInterface.java
  9. 28 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/handler/FieldMapperBeanSerializerModifier.java
  10. 63 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/handler/FieldMapperHandler.java
  11. 27 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/DeptNameMapperImpl.java
  12. 27 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/DictTypeMapperImpl.java
  13. 28 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/NicknameMapperImpl.java
  14. 28 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/OssUrlMapperImpl.java
  15. 26 0
      eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/UserNameMapperImpl.java
  16. 5 0
      eco-common/common-mapper/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  17. 1 0
      eco-common/pom.xml
  18. 3 6
      eco-modules/system/src/main/java/org/eco/system/domain/vo/ImportExportVo.java
  19. 19 0
      eco-modules/system/src/main/java/org/eco/system/service/impl/SysUserServiceImpl.java

+ 16 - 0
eco-common/common-core/src/main/java/org/eco/common/core/service/UserService.java

@@ -15,4 +15,20 @@ public interface UserService {
      */
     String selectUserNameById(Long userId);
 
+    /**
+     * 通过用户ID查询用户账户
+     *
+     * @param userId 用户ID
+     * @return 用户名称
+     */
+    String selectNicknameById(Long userId);
+
+    /**
+     * 通过用户ID查询用户账户
+     *
+     * @param userIds 用户ID 多个用逗号隔开
+     * @return 用户名称
+     */
+    String selectNicknameByIds(String userIds);
+
 }

+ 19 - 0
eco-common/common-mapper/.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wrapperVersion=3.3.2
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip

+ 24 - 0
eco-common/common-mapper/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.eco</groupId>
+        <artifactId>eco-common</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>common-mapper</artifactId>
+
+    <description>
+        common-mapper 字段映射服务
+    </description>
+    <name>common-mapper</name>
+    <dependencies>
+        <dependency>
+            <groupId>org.eco</groupId>
+            <artifactId>common-json</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 41 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/annotation/FieldMapper.java

@@ -0,0 +1,41 @@
+package com.phm.common.mapper.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.phm.common.mapper.core.handler.FieldMapperHandler;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: FieldMapper 字段映射注解
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD})
+@Documented
+@JacksonAnnotationsInside
+@JsonSerialize(using = FieldMapperHandler.class)
+public @interface FieldMapper {
+    /**
+     * 类型 (需与实现类上的 {@link FieldMapperType} 注解type对应)
+     * 默认取当前字段的值 如果设置了 @{@link FieldMapper#mapper()} 则取映射字段的值
+     */
+    String type();
+
+    /**
+     * 映射字段 (如果不为空则取此字段的值)
+     */
+    String mapper() default "";
+
+    /**
+     * 其他条件 例如: 字典type(sys_user_gender)
+     */
+    String other() default "";
+}

+ 24 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/annotation/FieldMapperType.java

@@ -0,0 +1,24 @@
+package com.phm.common.mapper.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: FieldMapperType 映射类型注释 (标注到{@link com.phm.common.mapper.core.FieldMapperInterface} 的实现类)
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+public @interface FieldMapperType {
+    /**
+     * 类型
+     */
+    String type();
+}

+ 49 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/config/FieldMapperConfig.java

@@ -0,0 +1,49 @@
+package com.phm.common.mapper.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import com.phm.common.mapper.core.handler.FieldMapperBeanSerializerModifier;
+import com.phm.common.mapper.core.handler.FieldMapperHandler;
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: FieldMapper配置类
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@Slf4j
+@AutoConfiguration
+public class FieldMapperConfig {
+
+    @Autowired
+    private List<FieldMapperInterface<?>> list;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @PostConstruct
+    public void init() {
+        Map<String, FieldMapperInterface<?>> map = new HashMap<>(list.size());
+        for (FieldMapperInterface<?> trans : list) {
+            if (trans.getClass().isAnnotationPresent(FieldMapperType.class)) {
+                FieldMapperType annotation = trans.getClass().getAnnotation(FieldMapperType.class);
+                map.put(annotation.type(), trans);
+            } else {
+                log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!");
+            }
+        }
+        FieldMapperHandler.TRANSLATION_MAPPER.putAll(map);
+        // 设置 Bean 序列化修改器
+        objectMapper.setSerializerFactory(
+            objectMapper.getSerializerFactory()
+                .withSerializerModifier(new FieldMapperBeanSerializerModifier()));
+    }
+}

+ 34 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/constant/MapperConstant.java

@@ -0,0 +1,34 @@
+package com.phm.common.mapper.constant;
+
+/**
+ * @Description: MapperConstant 常量
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+public interface MapperConstant {
+
+    /**
+     * 用户id转账号
+     */
+    String USER_ID_TO_NAME = "user_id_to_name";
+
+    /**
+     * 用户id转用户名称
+     */
+    String USER_ID_TO_NICKNAME = "user_id_to_nickname";
+
+    /**
+     * 部门id转名称
+     */
+    String DEPT_ID_TO_NAME = "dept_id_to_name";
+
+    /**
+     * 字典type转label
+     */
+    String DICT_TYPE_TO_LABEL = "dict_type_to_label";
+
+    /**
+     * ossId转url
+     */
+    String OSS_ID_TO_URL = "oss_id_to_url";
+}

+ 19 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/FieldMapperInterface.java

@@ -0,0 +1,19 @@
+package com.phm.common.mapper.core;
+
+/**
+ * @Description: FieldMapperInterface接口
+ * (实现类需标注 {@link com.phm.common.mapper.annotation.FieldMapperType} 注解标明翻译类型)
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+public interface FieldMapperInterface <T> {
+
+    /**
+     * 映射
+     *
+     * @param key   需要被映射的键(不为空)
+     * @param other 其他参数
+     * @return 返回键对应的值
+     */
+    T fieldMapper(Object key, String other);
+}

+ 28 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/handler/FieldMapperBeanSerializerModifier.java

@@ -0,0 +1,28 @@
+package com.phm.common.mapper.core.handler;
+
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
+import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
+
+import java.util.List;
+
+/**
+ * @Description: FieldMapperBeanSerializerModifier
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+public class FieldMapperBeanSerializerModifier extends BeanSerializerModifier {
+
+    @Override
+    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
+                                                     List<BeanPropertyWriter> beanProperties) {
+        for (BeanPropertyWriter writer : beanProperties) {
+            // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理
+            if (writer.getSerializer() instanceof FieldMapperHandler serializer) {
+                writer.assignNullSerializer(serializer);
+            }
+        }
+        return beanProperties;
+    }
+}

+ 63 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/handler/FieldMapperHandler.java

@@ -0,0 +1,63 @@
+package com.phm.common.mapper.core.handler;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import com.phm.common.mapper.annotation.FieldMapper;
+import com.phm.common.mapper.config.FieldMapperConfig;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import org.eco.common.core.utils.StringUtils;
+import org.eco.common.core.utils.reflect.ReflectUtils;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Description: FieldMapperHandler
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+public class FieldMapperHandler extends JsonSerializer<Object> implements ContextualSerializer {
+
+    /**
+     * 全局实现类映射器
+     */
+    public static final Map<String, FieldMapperInterface<?>> TRANSLATION_MAPPER = new ConcurrentHashMap<>();
+
+    private FieldMapper fieldMapper;
+    @Override
+    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        FieldMapperInterface<?> trans = TRANSLATION_MAPPER.get(fieldMapper.type());
+        if (ObjectUtil.isNotNull(trans)) {
+            // 如果映射字段不为空 则取映射字段的值
+            if (StringUtils.isNotBlank(fieldMapper.mapper())) {
+                o = ReflectUtils.invokeGetter(jsonGenerator.getCurrentValue(), fieldMapper.mapper());
+            }
+            // 如果为 null 直接写出
+            if (ObjectUtil.isNull(o)) {
+                jsonGenerator.writeNull();
+                return;
+            }
+            Object result = trans.fieldMapper(o, fieldMapper.other());
+            jsonGenerator.writeObject(result);
+        } else {
+            jsonGenerator.writeObject(o);
+        }
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
+        FieldMapper fieldMapper = beanProperty.getAnnotation(FieldMapper.class);
+        if (Objects.nonNull(fieldMapper)) {
+            this.fieldMapper = fieldMapper;
+            return this;
+        }
+        return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
+    }
+}

+ 27 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/DeptNameMapperImpl.java

@@ -0,0 +1,27 @@
+package com.phm.common.mapper.core.impl;
+
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.constant.MapperConstant;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import lombok.AllArgsConstructor;
+import org.eco.common.core.service.DeptService;
+
+/**
+ * @Description: DeptNameMapperImpl 部门名称映射
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.DEPT_ID_TO_NAME)
+public class DeptNameMapperImpl implements FieldMapperInterface<String> {
+    private final DeptService deptService;
+    @Override
+    public String fieldMapper(Object key, String other) {
+        if (key instanceof String ids) {
+            return deptService.selectDeptNameByIds(ids);
+        } else if (key instanceof Long id) {
+            return deptService.selectDeptNameByIds(id.toString());
+        }
+        return null;
+    }
+}

+ 27 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/DictTypeMapperImpl.java

@@ -0,0 +1,27 @@
+package com.phm.common.mapper.core.impl;
+
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.constant.MapperConstant;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import lombok.AllArgsConstructor;
+import org.eco.common.core.service.DictService;
+import org.eco.common.core.utils.StringUtils;
+
+/**
+ * @Description: DictTypeMapperImpl 字典映射
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.DICT_TYPE_TO_LABEL)
+public class DictTypeMapperImpl implements FieldMapperInterface<String> {
+    private final DictService dictService;
+
+    @Override
+    public String fieldMapper(Object key, String other) {
+        if (key instanceof String dictValue && StringUtils.isNotBlank(other)) {
+            return dictService.getDictLabel(other, dictValue);
+        }
+        return null;
+    }
+}

+ 28 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/NicknameMapperImpl.java

@@ -0,0 +1,28 @@
+package com.phm.common.mapper.core.impl;
+
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.constant.MapperConstant;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import lombok.AllArgsConstructor;
+import org.eco.common.core.service.UserService;
+
+/**
+ * @Description: NicknameMapperImpl
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.USER_ID_TO_NICKNAME)
+public class NicknameMapperImpl implements FieldMapperInterface<String> {
+
+    private final UserService userService;
+    @Override
+    public String fieldMapper(Object key, String other) {
+        if (key instanceof Long id) {
+            return userService.selectNicknameByIds(id.toString());
+        } else if (key instanceof String ids) {
+            return userService.selectNicknameByIds(ids);
+        }
+        return null;
+    }
+}

+ 28 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/OssUrlMapperImpl.java

@@ -0,0 +1,28 @@
+package com.phm.common.mapper.core.impl;
+
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.constant.MapperConstant;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import lombok.AllArgsConstructor;
+import org.eco.common.core.service.OssService;
+
+/**
+ * @Description: OssUrlMapperImpl ossUrl映射
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.OSS_ID_TO_URL)
+public class OssUrlMapperImpl implements FieldMapperInterface<String> {
+
+    private final OssService ossService;
+    @Override
+    public String fieldMapper(Object key, String other) {
+        if (key instanceof String ids) {
+            return ossService.selectUrlByIds(ids);
+        } else if (key instanceof Long id) {
+            return ossService.selectUrlByIds(id.toString());
+        }
+        return null;
+    }
+}

+ 26 - 0
eco-common/common-mapper/src/main/java/com/phm/common/mapper/core/impl/UserNameMapperImpl.java

@@ -0,0 +1,26 @@
+package com.phm.common.mapper.core.impl;
+
+import com.phm.common.mapper.annotation.FieldMapperType;
+import com.phm.common.mapper.constant.MapperConstant;
+import com.phm.common.mapper.core.FieldMapperInterface;
+import lombok.AllArgsConstructor;
+import org.eco.common.core.service.UserService;
+
+/**
+ * @Description: UserNameMapperImpl 用户名映射
+ * @Author: GaoKun Wang
+ * @Date: 2024/7/1
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.USER_ID_TO_NAME)
+public class UserNameMapperImpl implements FieldMapperInterface<String> {
+
+    private final UserService userService;
+    @Override
+    public String fieldMapper(Object key, String other) {
+        if (key instanceof Long id) {
+            return userService.selectUserNameById(id);
+        }
+        return null;
+    }
+}

+ 5 - 0
eco-common/common-mapper/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1,5 @@
+com.phm.common.mapper.core.impl.DeptNameMapperImpl
+com.phm.common.mapper.core.impl.DictTypeMapperImpl
+com.phm.common.mapper.core.impl.NicknameMapperImpl
+com.phm.common.mapper.core.impl.OssUrlMapperImpl
+com.phm.common.mapper.core.impl.UserNameMapperImpl

+ 1 - 0
eco-common/pom.xml

@@ -27,6 +27,7 @@
         <module>common-tenant</module>
         <module>common-web</module>
         <module>common-websocket</module>
+        <module>common-mapper</module>
     </modules>
 
     <artifactId>eco-common</artifactId>

+ 3 - 6
eco-modules/system/src/main/java/org/eco/system/domain/vo/ImportExportVo.java

@@ -1,7 +1,6 @@
 package org.eco.system.domain.vo;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -29,7 +28,6 @@ public class ImportExportVo extends BaseEntity implements Serializable {
     /**
      * 唯一编码
      */
-    @ExcelProperty(value = "唯一编码")
     private Long id;
 
     /**
@@ -45,21 +43,20 @@ public class ImportExportVo extends BaseEntity implements Serializable {
     /**
      * 文件名称
      */
-    @ExcelProperty(value = "文件名称")
     private String name;
 
-    @ExcelProperty(value = "文件地址")
+    /**
+     * 文件url
+     */
     private String url;
 
     /**
      * 日志信息
      */
-    @ExcelProperty(value = "日志信息")
     private String logInfo;
 
     /**
      * 状态
      */
-    @ExcelProperty(value = "状态")
     private String status;
 }

+ 19 - 0
eco-modules/system/src/main/java/org/eco/system/service/impl/SysUserServiceImpl.java

@@ -1,5 +1,6 @@
 package org.eco.system.service.impl;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryMethods;
@@ -647,6 +648,24 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
         return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName();
     }
 
+    @Override
+    public String selectNicknameById(Long userId) {
+        SysUserVo sysUser = userMapper.selectOneWithRelationsByQueryAs(query().where(SYS_USER.NICK_NAME.eq(userId)),SysUserVo.class);
+        return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName();
+    }
+
+    @Override
+    public String selectNicknameByIds(String userIds) {
+        List<String> list = new ArrayList<>();
+        for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) {
+            String nickname = SpringUtils.getAopProxy(this).selectNicknameById(id);
+            if (StringUtils.isNotBlank(nickname)) {
+                list.add(nickname);
+            }
+        }
+        return String.join(StringUtils.SEPARATOR, list);
+    }
+
     /**
      * 通过部门id查询当前部门所有用户
      *