Merge remote-tracking branch 'base-version/main' into dev

This commit is contained in:
chenbowen
2025-09-23 14:58:33 +08:00
5 changed files with 180 additions and 5 deletions

View File

@@ -0,0 +1,123 @@
package com.zt.plat.framework.common.util.user;
import cn.hutool.core.collection.CollUtil;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 用户名称填充工具类
* 通用的用户信息填充工具,可在各个模块中使用
*
* @author ZT
*/
public class UserNameEnrichUtils {
/**
* 批量设置创建人名称
*
* @param items 需要设置创建人名称的对象列表
* @param creatorExtractor 创建人ID提取器
* @param creatorNameSetter 创建人名称设置器
* @param userNicknameProvider 用户昵称提供者函数
*/
public static <T> void setCreatorNames(List<T> items,
Function<T, String> creatorExtractor,
BiConsumer<T, String> creatorNameSetter,
Function<Collection<Long>, Map<Long, String>> userNicknameProvider) {
if (CollUtil.isEmpty(items) || userNicknameProvider == null) {
return;
}
// 提取所有创建人ID
Set<Long> creatorIds = items.stream()
.map(creatorExtractor)
.filter(Objects::nonNull)
.filter(creator -> !creator.isEmpty())
.map(creatorId -> {
try {
return Long.parseLong(creatorId);
} catch (NumberFormatException e) {
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (creatorIds.isEmpty()) {
return;
}
// 批量获取用户昵称
Map<Long, String> userNicknameMap = userNicknameProvider.apply(creatorIds);
// 设置创建人名称
items.forEach(item -> {
String creatorId = creatorExtractor.apply(item);
if (creatorId != null && !creatorId.isEmpty()) {
try {
Long id = Long.parseLong(creatorId);
String nickname = userNicknameMap.get(id);
if (nickname != null) {
creatorNameSetter.accept(item, nickname);
}
} catch (NumberFormatException e) {
// 忽略无效的ID格式
}
}
});
}
/**
* 设置单个对象的创建人名称
* 直接复用批量设置的逻辑
*
* @param item 需要设置创建人名称的对象
* @param creatorExtractor 创建人ID提取器
* @param creatorNameSetter 创建人名称设置器
* @param userNicknameProvider 用户昵称提供者函数
*/
public static <T> void setCreatorName(T item,
Function<T, String> creatorExtractor,
BiConsumer<T, String> creatorNameSetter,
Function<Collection<Long>, Map<Long, String>> userNicknameProvider) {
if (item == null) {
return;
}
// 直接复用批量设置的逻辑
setCreatorNames(Collections.singletonList(item), creatorExtractor, creatorNameSetter, userNicknameProvider);
}
/**
* 创建通用的用户昵称提供者
* 这是一个通用的实现,可以直接在各个模块中使用
*
* @param userDataProvider 用户数据提供者接收用户ID集合返回用户数据Map
* @param nicknameExtractor 从用户数据中提取昵称的函数
* @return 用户昵称提供者函数
*/
public static <UserData> Function<Collection<Long>, Map<Long, String>> createUserNicknameProvider(
Function<Collection<Long>, Map<Long, UserData>> userDataProvider,
Function<UserData, String> nicknameExtractor) {
return userIds -> {
if (CollUtil.isEmpty(userIds)) {
return Collections.emptyMap();
}
Map<Long, UserData> userDataMap = userDataProvider.apply(userIds);
if (userDataMap == null || userDataMap.isEmpty()) {
return Collections.emptyMap();
}
return userDataMap.entrySet().stream()
.filter(entry -> entry.getValue() != null)
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> nicknameExtractor.apply(entry.getValue()),
(existing, replacement) -> existing // 处理重复key的情况
));
};
}
}