From bb21405761fb8563b1856969e45cbc885e5734eb Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 09:02:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E8=8E=B7=E5=8F=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/annotation/UserIdField.java | 14 ++ .../platform/annotation/UserNameField.java | 14 ++ .../common/utils/UserNameFillHelper.java | 190 ++++++++++++++++++ .../ApprovalChangeLogController.java | 7 +- .../data/domain/ApprovalChangeLog.java | 4 + .../service/IApprovalChangeLogService.java | 2 +- .../impl/ApprovalChangeLogServiceImpl.java | 72 +++---- 7 files changed, 265 insertions(+), 38 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/annotation/UserIdField.java create mode 100644 backend/src/main/java/com/yfd/platform/annotation/UserNameField.java create mode 100644 backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java diff --git a/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java b/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java new file mode 100644 index 0000000..43721a2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java @@ -0,0 +1,14 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记字段为用户ID字段,用于用户名称自动填充 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserIdField { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java b/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java new file mode 100644 index 0000000..583d9b8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java @@ -0,0 +1,14 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记字段为用户名字段,用于接收自动填充的用户名称 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserNameField { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java b/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java new file mode 100644 index 0000000..86157c4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java @@ -0,0 +1,190 @@ +package com.yfd.platform.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.annotation.UserIdField; +import com.yfd.platform.annotation.UserNameField; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysUserMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户名称自动填充工具类 + *

+ * 使用方式: + * 1. 在实体类的用户ID字段上添加 @UserIdField 注解 + * 2. 在对应需要填充用户名的字段上添加 @UserNameField 注解 + * 3. 调用 {@link #fillUserNames(List)} 方法自动填充 + * + *

+ * 示例:
+ * {@code
+ * @Data
+ * public class MyEntity {
+ *     @UserIdField
+ *     private String userId;
+ *
+ *     @UserNameField
+ *     private String userName;
+ * }
+ *
+ * // 使用
+ * List list = ...;
+ * userNameFillHelper.fillUserNames(list);
+ * }
+ * 
+ */ +@Component +public class UserNameFillHelper { + + @Resource + private SysUserMapper sysUserMapper; + + /** + * 批量填充用户名称 + * + * @param list 需要填充的实体列表 + */ + public void fillUserNames(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + + Class clazz = list.get(0).getClass(); + Field[] fields = clazz.getDeclaredFields(); + + Field idField = null; + Field nameField = null; + + for (Field field : fields) { + if (field.isAnnotationPresent(UserIdField.class)) { + idField = field; + idField.setAccessible(true); + } + if (field.isAnnotationPresent(UserNameField.class)) { + nameField = field; + nameField.setAccessible(true); + } + } + + if (idField == null || nameField == null) { + return; + } + + Set userIds = new HashSet<>(); + for (T item : list) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + userIds.add(idValue.toString()); + } + } catch (IllegalAccessException e) { + continue; + } + } + + if (userIds.isEmpty()) { + return; + } + + List users = sysUserMapper.selectBatchIds(userIds); + Map userNameMap = users.stream() + .collect(Collectors.toMap(SysUser::getId, SysUser::getNickname, (a, b) -> a)); + + for (T item : list) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + String userName = userNameMap.get(idValue.toString()); + nameField.set(item, StrUtil.blankToDefault(userName, "未知")); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + + /** + * 批量填充用户名称(支持多个用户ID字段) + *

+ * 使用方式:在实体类中定义多个 @UserIdField 和 @UserNameField 配对字段 + * + * @param list 需要填充的实体列表 + * @param idFields 用户ID字段名数组 + * @param nameFields 用户名字段名数组 + */ + public void fillUserNames(List list, String[] idFields, String[] nameFields) { + if (CollUtil.isEmpty(list) || idFields == null || nameFields == null || idFields.length != nameFields.length) { + return; + } + + Class clazz = list.get(0).getClass(); + Field[] allFields = clazz.getDeclaredFields(); + Map fieldMap = new HashMap<>(); + for (Field field : allFields) { + fieldMap.put(field.getName(), field); + } + + List idFieldList = new ArrayList<>(); + List nameFieldList = new ArrayList<>(); + for (String idFieldName : idFields) { + Field f = fieldMap.get(idFieldName); + if (f != null) { + f.setAccessible(true); + idFieldList.add(f); + } + } + for (String nameFieldName : nameFields) { + Field f = fieldMap.get(nameFieldName); + if (f != null) { + f.setAccessible(true); + nameFieldList.add(f); + } + } + + if (idFieldList.isEmpty() || nameFieldList.isEmpty()) { + return; + } + + Set userIds = new HashSet<>(); + for (T item : list) { + for (Field idField : idFieldList) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + userIds.add(idValue.toString()); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + + if (userIds.isEmpty()) { + return; + } + + List users = sysUserMapper.selectBatchIds(userIds); + Map userNameMap = users.stream() + .collect(Collectors.toMap(SysUser::getId, SysUser::getNickname, (a, b) -> a)); + + for (T item : list) { + for (int i = 0; i < idFieldList.size() && i < nameFieldList.size(); i++) { + try { + Object idValue = idFieldList.get(i).get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + String userName = userNameMap.get(idValue.toString()); + nameFieldList.get(i).set(item, StrUtil.blankToDefault(userName, "未知")); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java index 26e019f..49a2d2f 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java @@ -2,6 +2,7 @@ package com.yfd.platform.data.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.utils.UserNameFillHelper; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.ApprovalChangeLog; import com.yfd.platform.data.domain.ApprovalLog; @@ -28,6 +29,9 @@ public class ApprovalChangeLogController { @Resource private IApprovalChangeLogService approvalChangeLogService; + @Resource + private UserNameFillHelper userNameFillHelper; + @GetMapping("/list") @Operation(summary = "查询变更记录列表") public ResponseResult list() { @@ -39,7 +43,8 @@ public class ApprovalChangeLogController { @Operation(summary = "分页查询变更记录列表(通用)") public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { Page approvalChangeLogPage = DataSourceRequestUtil.executeQuery(request, ApprovalChangeLog.class, approvalChangeLogService); - approvalChangeLogService.fillUserNames(approvalChangeLogPage.getRecords()); + userNameFillHelper.fillUserNames(approvalChangeLogPage.getRecords()); + // approvalChangeLogService.fillUserNames(approvalChangeLogPage.getRecords()); return ResponseResult.successData(approvalChangeLogPage); } diff --git a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java index 171d46f..24673fd 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java @@ -1,6 +1,8 @@ package com.yfd.platform.data.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.UserIdField; +import com.yfd.platform.annotation.UserNameField; import lombok.Data; import lombok.EqualsAndHashCode; @@ -59,12 +61,14 @@ public class ApprovalChangeLog implements Serializable { /** * 操作人ID */ + @UserIdField private String operatorId; /** * 操作人名称 */ @TableField(exist = false) + @UserNameField private String operatorName; /** diff --git a/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java index 756e9fb..92d7e2c 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java +++ b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java @@ -17,7 +17,7 @@ public interface IApprovalChangeLogService extends IService { */ List getByApprovalId(String approvalId); - void fillUserNames(List list); +// void fillUserNames(List list); /** * 根据草稿数据ID查询变更记录 diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java index c6dbc3c..0e4782a 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java @@ -29,42 +29,42 @@ public class ApprovalChangeLogServiceImpl extends ServiceImpl getByApprovalId(String approvalId) { return approvalChangeLogMapper.selectByApprovalId(approvalId); } - @Override - public void fillUserNames(List list) { - if (list == null || list.isEmpty()) { - return; - } - - Set userIds = new HashSet<>(); - for (ApprovalChangeLog vo : list) { - if (StrUtil.isNotBlank(vo.getApprovalId())) { - userIds.add(vo.getApprovalId()); - } - if (StrUtil.isNotBlank(vo.getOperatorId())) { - userIds.add(vo.getOperatorId()); - } - } - - if (userIds.isEmpty()) { - return; - } - - Map userNameMap = new HashMap<>(); - List users = sysUserMapper.selectBatchIds(userIds); - for (SysUser user : users) { - userNameMap.put(user.getId(), user.getNickname()); - } - - for (ApprovalChangeLog vo : list) { - if (StrUtil.isNotBlank(vo.getApprovalId())) { - vo.setApprovalName(userNameMap.get(vo.getApprovalId())); - } - if (StrUtil.isNotBlank(vo.getOperatorId())) { - vo.setOperatorName(userNameMap.get(vo.getOperatorId())); - } - - } - } +// @Override +// public void fillUserNames(List list) { +// if (list == null || list.isEmpty()) { +// return; +// } +// +// Set userIds = new HashSet<>(); +// for (ApprovalChangeLog vo : list) { +// if (StrUtil.isNotBlank(vo.getApprovalId())) { +// userIds.add(vo.getApprovalId()); +// } +// if (StrUtil.isNotBlank(vo.getOperatorId())) { +// userIds.add(vo.getOperatorId()); +// } +// } +// +// if (userIds.isEmpty()) { +// return; +// } +// +// Map userNameMap = new HashMap<>(); +// List users = sysUserMapper.selectBatchIds(userIds); +// for (SysUser user : users) { +// userNameMap.put(user.getId(), user.getNickname()); +// } +// +// for (ApprovalChangeLog vo : list) { +// if (StrUtil.isNotBlank(vo.getApprovalId())) { +// vo.setApprovalName(userNameMap.get(vo.getApprovalId())); +// } +// if (StrUtil.isNotBlank(vo.getOperatorId())) { +// vo.setOperatorName(userNameMap.get(vo.getOperatorId())); +// } +// +// } +// } @Override public List getByDataId(String dataId) { return approvalChangeLogMapper.selectByDataId(dataId);