add 新增 通用翻译模块 ruoyi-common-translation 实现(部门名、字典、oss、用户名)

2.X
疯狂的狮子li 2 years ago
parent 5a7d39a53b
commit e039986248

@ -17,4 +17,13 @@ public interface RemoteFileService {
* @return
*/
SysFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException;
/**
* ossIdurl
*
* @param ossIds ossId
* @return url
*/
String selectUrlByIds(String ossIds);
}

@ -0,0 +1,18 @@
package com.ruoyi.system.api;
/**
*
*
* @author Lion Li
*/
public interface RemoteDeptService {
/**
* ID
*
* @param deptIds ID
* @return
*/
String selectDeptNameByIds(String deptIds);
}

@ -44,4 +44,11 @@ public interface RemoteUserService {
*/
Boolean registerUserInfo(SysUser sysUser);
/**
* userId
*
* @param userId id
* @return
*/
String selectUserNameById(Long userId);
}

@ -34,6 +34,7 @@
<module>ruoyi-common-sentinel</module>
<module>ruoyi-common-skylog</module>
<module>ruoyi-common-prometheus</module>
<module>ruoyi-common-translation</module>
</modules>
<artifactId>ruoyi-common</artifactId>

@ -161,6 +161,13 @@
<artifactId>ruoyi-common-prometheus</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-translation</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

@ -30,6 +30,16 @@ public interface CacheNames {
*/
String SYS_DICT = "sys_dict";
/**
*
*/
String SYS_USER_NAME = "sys_user_name#30d";
/**
*
*/
String SYS_DEPT = "sys_dept#30d";
/**
* OSS
*/

@ -0,0 +1,42 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>1.5.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-translation</artifactId>
<description>
ruoyi-common-translation 通用翻译功能
</description>
<dependencies>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-dict</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-resource</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,39 @@
package com.ruoyi.common.translation.annotation;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ruoyi.common.translation.core.handler.TranslationHandler;
import java.lang.annotation.*;
/**
*
*
* @author Lion Li
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Documented
@JacksonAnnotationsInside
@JsonSerialize(using = TranslationHandler.class)
public @interface Translation {
/**
* ( {@link com.ruoyi.common.translation.annotation.TranslationType} type)
* <p>
* @{@link Translation#mapper()}
*/
String type();
/**
* ()
*/
String mapper() default "";
/**
* : type(sys_user_sex)
*/
String other() default "";
}

@ -0,0 +1,21 @@
package com.ruoyi.common.translation.annotation;
import java.lang.annotation.*;
/**
* ({@link com.ruoyi.common.translation.core.TranslationInterface} )
*
* @author Lion Li
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
public @interface TranslationType {
/**
*
*/
String type();
}

@ -0,0 +1,50 @@
package com.ruoyi.common.translation.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.translation.annotation.TranslationType;
import com.ruoyi.common.translation.core.TranslationInterface;
import com.ruoyi.common.translation.core.handler.TranslationBeanSerializerModifier;
import com.ruoyi.common.translation.core.handler.TranslationHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*
* @author Lion Li
*/
@Slf4j
@AutoConfiguration
public class TranslationConfig {
@Autowired
private List<TranslationInterface> list;
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void init() {
Map<String, TranslationInterface> map = new HashMap<>(list.size());
for (TranslationInterface trans : list) {
if (trans.getClass().isAnnotationPresent(TranslationType.class)) {
TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class);
map.put(annotation.type(), trans);
} else {
log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!");
}
}
TranslationHandler.TRANSLATION_MAPPER.putAll(map);
// 设置 Bean 序列化修改器
objectMapper.setSerializerFactory(
objectMapper.getSerializerFactory()
.withSerializerModifier(new TranslationBeanSerializerModifier()));
}
}

@ -0,0 +1,30 @@
package com.ruoyi.common.translation.constant;
/**
*
*
* @author Lion Li
*/
public interface TransConstant {
/**
* id
*/
String USER_ID_TO_NAME = "user_id_to_name";
/**
* id
*/
String DEPT_ID_TO_NAME = "dept_id_to_name";
/**
* typelabel
*/
String DICT_TYPE_TO_LABEL = "dict_type_to_label";
/**
* ossIdurl
*/
String OSS_ID_TO_URL = "oss_id_to_url";
}

@ -0,0 +1,17 @@
package com.ruoyi.common.translation.core;
/**
* ( {@link com.ruoyi.common.translation.annotation.TranslationType} )
*
* @author Lion Li
*/
public interface TranslationInterface {
/**
*
*
* @param key ()
* @return
*/
String translation(Object key, String other);
}

@ -0,0 +1,29 @@
package com.ruoyi.common.translation.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;
/**
* Bean Null
*
* @author Lion Li
*/
public class TranslationBeanSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
List<BeanPropertyWriter> beanProperties) {
for (BeanPropertyWriter writer : beanProperties) {
// 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理
if (writer.getSerializer() instanceof TranslationHandler) {
writer.assignNullSerializer(writer.getSerializer());
}
}
return beanProperties;
}
}

@ -0,0 +1,65 @@
package com.ruoyi.common.translation.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.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.reflect.ReflectUtils;
import com.ruoyi.common.translation.annotation.Translation;
import com.ruoyi.common.translation.core.TranslationInterface;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
*
*
* @author Lion Li
*/
@Slf4j
public class TranslationHandler extends JsonSerializer<Object> implements ContextualSerializer {
/**
*
*/
public static final Map<String, TranslationInterface> TRANSLATION_MAPPER = new ConcurrentHashMap<>();
private Translation translation;
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type());
if (ObjectUtil.isNotNull(trans)) {
// 如果映射字段不为空 则取映射字段的值
if (StringUtils.isNotBlank(translation.mapper())) {
value = ReflectUtils.invokeGetter(gen.getCurrentValue(), translation.mapper());
}
// 如果为 null 直接写出
if (ObjectUtil.isNull(value)) {
gen.writeNull();
return;
}
String result = trans.translation(value, translation.other());
gen.writeString(result);
} else {
gen.writeObject(value);
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Translation translation = property.getAnnotation(Translation.class);
if (Objects.nonNull(translation)) {
this.translation = translation;
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}

@ -0,0 +1,27 @@
package com.ruoyi.common.translation.core.impl;
import com.ruoyi.common.translation.annotation.TranslationType;
import com.ruoyi.common.translation.constant.TransConstant;
import com.ruoyi.common.translation.core.TranslationInterface;
import com.ruoyi.system.api.RemoteDeptService;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;
/**
*
*
* @author Lion Li
*/
@Component
@AllArgsConstructor
@TranslationType(type = TransConstant.DEPT_ID_TO_NAME)
public class DeptNameTranslationImpl implements TranslationInterface {
@DubboReference
private RemoteDeptService remoteDeptService;
public String translation(Object key, String other) {
return remoteDeptService.selectDeptNameByIds(key.toString());
}
}

@ -0,0 +1,29 @@
package com.ruoyi.common.translation.core.impl;
import com.ruoyi.common.core.service.DictService;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.translation.annotation.TranslationType;
import com.ruoyi.common.translation.constant.TransConstant;
import com.ruoyi.common.translation.core.TranslationInterface;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
/**
*
*
* @author Lion Li
*/
@Component
@AllArgsConstructor
@TranslationType(type = TransConstant.DICT_TYPE_TO_LABEL)
public class DictTypeTranslationImpl implements TranslationInterface {
private final DictService dictService;
public String translation(Object key, String other) {
if (key instanceof String && StringUtils.isNotBlank(other)) {
return dictService.getDictLabel(other, key.toString());
}
return null;
}
}

@ -0,0 +1,27 @@
package com.ruoyi.common.translation.core.impl;
import com.ruoyi.common.translation.annotation.TranslationType;
import com.ruoyi.common.translation.constant.TransConstant;
import com.ruoyi.common.translation.core.TranslationInterface;
import com.ruoyi.resource.api.RemoteFileService;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;
/**
* OSS
*
* @author Lion Li
*/
@Component
@AllArgsConstructor
@TranslationType(type = TransConstant.OSS_ID_TO_URL)
public class OssUrlTranslationImpl implements TranslationInterface {
@DubboReference
private RemoteFileService ossService;
public String translation(Object key, String other) {
return ossService.selectUrlByIds(key.toString());
}
}

@ -0,0 +1,27 @@
package com.ruoyi.common.translation.core.impl;
import com.ruoyi.common.translation.annotation.TranslationType;
import com.ruoyi.common.translation.constant.TransConstant;
import com.ruoyi.common.translation.core.TranslationInterface;
import com.ruoyi.system.api.RemoteUserService;
import lombok.AllArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;
/**
*
*
* @author Lion Li
*/
@Component
@AllArgsConstructor
@TranslationType(type = TransConstant.USER_ID_TO_NAME)
public class UserNameTranslationImpl implements TranslationInterface {
@DubboReference
private RemoteUserService remoteUserService;
public String translation(Object key, String other) {
return remoteUserService.selectUserNameById((Long) key);
}
}

@ -13,22 +13,31 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class SysOssBo extends BaseEntity {
/**
* ossId
*/
private Long ossId;
/**
*
*/
private String fileName;
/**
*
*/
private String originalName;
/**
*
*/
private String fileSuffix;
/**
* URL
*/
private String url;
/**
*
*/

@ -7,11 +7,11 @@ import com.ruoyi.common.oss.entity.UploadResult;
import com.ruoyi.common.oss.factory.OssFactory;
import com.ruoyi.resource.api.RemoteFileService;
import com.ruoyi.resource.api.domain.SysFile;
import com.ruoyi.resource.domain.SysOss;
import com.ruoyi.resource.mapper.SysOssMapper;
import com.ruoyi.resource.domain.bo.SysOssBo;
import com.ruoyi.resource.service.ISysOssService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -22,11 +22,11 @@ import org.springframework.transaction.annotation.Transactional;
*/
@Slf4j
@Service
@RequiredArgsConstructor
@DubboService
public class RemoteFileServiceImpl implements RemoteFileService {
@Autowired
private SysOssMapper sysOssMapper;
private final ISysOssService sysOssService;
/**
*
@ -39,13 +39,13 @@ public class RemoteFileServiceImpl implements RemoteFileService {
OssClient storage = OssFactory.instance();
UploadResult uploadResult = storage.uploadSuffix(file, suffix, contentType);
// 保存文件信息
SysOss oss = new SysOss();
SysOssBo oss = new SysOssBo();
oss.setUrl(uploadResult.getUrl());
oss.setFileSuffix(suffix);
oss.setFileName(uploadResult.getFilename());
oss.setOriginalName(originalFilename);
oss.setService(storage.getConfigKey());
sysOssMapper.insert(oss);
sysOssService.insertByBo(oss);
SysFile sysFile = new SysFile();
sysFile.setOssId(oss.getOssId());
sysFile.setName(uploadResult.getFilename());
@ -57,4 +57,15 @@ public class RemoteFileServiceImpl implements RemoteFileService {
}
}
/**
* ossIdurl
*
* @param ossIds ossId
* @return url
*/
@Override
public String selectUrlByIds(String ossIds) {
return sysOssService.selectUrlByIds(ossIds);
}
}

@ -22,12 +22,15 @@ public interface ISysOssService {
List<SysOssVo> listByIds(Collection<Long> ossIds);
String selectUrlByIds(String ossIds);
SysOssVo getById(Long ossId);
SysOssVo upload(MultipartFile file);
Boolean insertByBo(SysOssBo bo);
void download(Long ossId, HttpServletResponse response) throws IOException;
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

@ -1,5 +1,6 @@
package com.ruoyi.resource.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -31,10 +32,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -69,6 +67,18 @@ public class SysOssServiceImpl implements ISysOssService {
return list;
}
@Override
public String selectUrlByIds(String ossIds) {
List<String> list = new ArrayList<>();
for (Long id : Arrays.stream(ossIds.split(",")).map(Long::parseLong).collect(Collectors.toList())) {
SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);
if (ObjectUtil.isNotNull(vo)) {
list.add(this.matchingUrl(vo).getUrl());
}
}
return String.join(",", list);
}
private LambdaQueryWrapper<SysOss> buildQueryWrapper(SysOssBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SysOss> lqw = Wrappers.lambdaQuery();
@ -131,6 +141,16 @@ public class SysOssServiceImpl implements ISysOssService {
return this.matchingUrl(sysOssVo);
}
@Override
public Boolean insertByBo(SysOssBo bo) {
SysOss oss = BeanUtil.toBean(bo, SysOss.class);
boolean flag = baseMapper.insert(oss) > 0;
if (flag) {
bo.setOssId(oss.getOssId());
}
return flag;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {

@ -0,0 +1,25 @@
package com.ruoyi.system.dubbo;
import com.ruoyi.system.api.RemoteDeptService;
import com.ruoyi.system.service.ISysDeptService;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
/**
*
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteDeptServiceImpl implements RemoteDeptService {
private final ISysDeptService sysDeptService;
@Override
public String selectDeptNameByIds(String deptIds) {
return sysDeptService.selectDeptNameByIds(deptIds);
}
}

@ -10,7 +10,7 @@ import org.springframework.stereotype.Service;
import java.util.List;
/**
*
*
*
* @author Lion Li
*/

@ -23,7 +23,7 @@ import org.springframework.stereotype.Service;
import java.util.List;
/**
*
*
*
* @author Lion Li
*/
@ -98,6 +98,11 @@ public class RemoteUserServiceImpl implements RemoteUserService {
return userService.registerUser(sysUser);
}
@Override
public String selectUserNameById(Long userId) {
return userService.selectUserNameById(userId);
}
/**
*
*/

@ -51,6 +51,14 @@ public interface ISysDeptService {
*/
SysDept selectDeptById(Long deptId);
/**
* ID
*
* @param deptIds ID
* @return
*/
String selectDeptNameByIds(String deptIds);
/**
* ID
*

@ -206,4 +206,12 @@ public interface ISysUserService {
*/
int deleteUserByIds(Long[] userIds);
/**
* ID
*
* @param userId ID
* @return
*/
String selectUserNameById(Long userId);
}

@ -6,11 +6,14 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.TreeBuildUtils;
import com.ruoyi.common.mybatis.helper.DataBaseHelper;
import com.ruoyi.common.redis.utils.CacheUtils;
import com.ruoyi.common.satoken.utils.LoginHelper;
import com.ruoyi.system.api.domain.SysDept;
import com.ruoyi.system.api.domain.SysRole;
@ -20,11 +23,14 @@ import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysDeptService;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
*
@ -106,6 +112,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
* @param deptId ID
* @return
*/
@Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId")
@Override
public SysDept selectDeptById(Long deptId) {
SysDept dept = baseMapper.selectById(deptId);
@ -115,6 +122,24 @@ public class SysDeptServiceImpl implements ISysDeptService {
return dept;
}
/**
* ID
*
* @param deptIds ID
* @return
*/
@Override
public String selectDeptNameByIds(String deptIds) {
List<String> list = new ArrayList<>();
for (Long id : Arrays.stream(deptIds.split(",")).map(Long::parseLong).collect(Collectors.toList())) {
SysDept dept = SpringUtils.getAopProxy(this).selectDeptById(id);
if (ObjectUtil.isNotNull(dept)) {
list.add(dept.getDeptName());
}
}
return String.join(",", list);
}
/**
* ID
*
@ -210,6 +235,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
* @param dept
* @return
*/
@CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#dept.deptId")
@Override
public int updateDept(SysDept dept) {
SysDept newParentDept = baseMapper.selectById(dept.getParentId());
@ -260,7 +286,9 @@ public class SysDeptServiceImpl implements ISysDeptService {
list.add(dept);
}
if (list.size() > 0) {
baseMapper.updateBatchById(list);
if (baseMapper.updateBatchById(list)) {
list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId()));
}
}
}
@ -270,6 +298,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
* @param deptId ID
* @return
*/
@CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId")
@Override
public int deleteDeptById(Long deptId) {
return baseMapper.deleteById(deptId);

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StreamUtils;
@ -27,6 +28,7 @@ import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@ -486,4 +488,12 @@ public class SysUserServiceImpl implements ISysUserService {
return baseMapper.deleteBatchIds(ids);
}
@Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId")
@Override
public String selectUserNameById(Long userId) {
SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserName).eq(SysUser::getUserId, userId));
return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName();
}
}

Loading…
Cancel
Save