From 91f7c0091372dff5aa7194433279877c40cee562 Mon Sep 17 00:00:00 2001 From: LHD_HY <2872546851@qq.com> Date: Thu, 8 Jan 2026 10:09:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=85=B3=E8=81=94=E5=9B=A2?= =?UTF-8?q?=E9=98=9F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/entity/SysUser.java | 110 ++++++++++++++---- .../core/domain/entity/SysUserTeam.java | 62 ++++++++++ .../bonus/system/mapper/SysUserMapper.java | 17 +++ .../service/impl/SysUserServiceImpl.java | 83 +++++++++++++ .../resources/mapper/system/SysUserMapper.xml | 41 ++++++- 5 files changed, 289 insertions(+), 24 deletions(-) create mode 100644 bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUserTeam.java diff --git a/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUser.java b/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUser.java index eb2c2a4..82fa4c1 100644 --- a/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUser.java +++ b/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUser.java @@ -1,8 +1,12 @@ package com.bonus.common.core.domain.entity; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import javax.validation.constraints.*; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.bonus.common.annotation.Excel; @@ -105,6 +109,12 @@ public class SysUser extends BaseEntity /**用户密钥*/ private String secret; + /** 临时字段:接收数据库GROUP_CONCAT拼接的团队ID字符串(如 "1,2,3") */ + private String teamIdsStr; + + /**团队ID列表(通过teamIdsStr动态转换,无独立成员变量)*/ + private List teamIds; + /** 角色名称 */ private String roleName; @@ -342,29 +352,87 @@ public class SysUser extends BaseEntity this.roleName = roleName; } + /** + * 获取团队ID列表(核心改造:从teamIdsStr动态转换,兼容空值) + * @return 团队ID列表(空值返回空数组,避免NullPointerException) + */ + public List getTeamIds() + { + // 优先使用手动设置的teamIds(兼容原有业务逻辑) + if (this.teamIds != null) { + return this.teamIds; + } + // 空值处理:teamIdsStr为空时返回空数组 + if (StringUtils.isBlank(teamIdsStr)) { + return new ArrayList<>(); + } + // 将逗号分隔的字符串转换为Long类型的List + return Arrays.stream(teamIdsStr.split(",")) + .map(String::trim) // 去除空格,兼容"1, 2,3"格式 + .map(Long::valueOf) // 转换为Long类型 + .collect(Collectors.toList()); + } + + /** + * 设置团队ID列表(同时同步更新teamIdsStr,保证数据一致性) + * @param teamIds 团队ID列表 + */ + public void setTeamIds(List teamIds) + { + this.teamIds = teamIds; + // 同步更新teamIdsStr:List转逗号分隔的字符串 + if (teamIds == null || teamIds.isEmpty()) { + this.teamIdsStr = ""; + } else { + this.teamIdsStr = teamIds.stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + } + + /** + * 获取数据库映射的团队ID字符串 + * @return 逗号分隔的团队ID字符串 + */ + public String getTeamIdsStr() { + return teamIdsStr; + } + + /** + * 设置数据库映射的团队ID字符串 + * @param teamIdsStr 逗号分隔的团队ID字符串 + */ + public void setTeamIdsStr(String teamIdsStr) { + this.teamIdsStr = teamIdsStr; + // 清空手动设置的teamIds,确保getTeamIds()优先使用转换后的值 + this.teamIds = null; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("userId", getUserId()) - .append("deptId", getDeptId()) - .append("userName", getUserName()) - .append("nickName", getNickName()) - .append("email", getEmail()) - .append("phonenumber", getPhonenumber()) - .append("sex", getSex()) - .append("avatar", getAvatar()) - .append("password", getPassword()) - .append("status", getStatus()) - .append("delFlag", getDelFlag()) - .append("loginIp", getLoginIp()) - .append("loginDate", getLoginDate()) - .append("pwdUpdateDate", getPwdUpdateDate()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .append("dept", getDept()) - .toString(); + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("pwdUpdateDate", getPwdUpdateDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .append("teamIdsStr", getTeamIdsStr()) + .append("teamIds", getTeamIds()) + .toString(); } } diff --git a/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUserTeam.java b/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUserTeam.java new file mode 100644 index 0000000..ebff98a --- /dev/null +++ b/bonus-common/src/main/java/com/bonus/common/core/domain/entity/SysUserTeam.java @@ -0,0 +1,62 @@ +package com.bonus.common.core.domain.entity; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import java.io.Serializable; + +/** + * 用户和团队关联表 sys_user_team_association + * + * @author bonus + */ +public class SysUserTeam implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 用户ID(联合主键) */ + private Long userId; + + /** 团队ID(联合主键) */ + private Long teamId; + + /** 空参构造方法 */ + public SysUserTeam() + { + } + + /** 含参构造方法:快速创建用户-团队关联对象 */ + public SysUserTeam(Long userId, Long teamId) + { + this.userId = userId; + this.teamId = teamId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getTeamId() + { + return teamId; + } + + public void setTeamId(Long teamId) + { + this.teamId = teamId; + } + + /** 重写toString方法:便于日志打印和调试 */ + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("teamId", getTeamId()) + .toString(); + } +} diff --git a/bonus-system/src/main/java/com/bonus/system/mapper/SysUserMapper.java b/bonus-system/src/main/java/com/bonus/system/mapper/SysUserMapper.java index c1c6aea..0a61440 100644 --- a/bonus-system/src/main/java/com/bonus/system/mapper/SysUserMapper.java +++ b/bonus-system/src/main/java/com/bonus/system/mapper/SysUserMapper.java @@ -1,6 +1,8 @@ package com.bonus.system.mapper; import java.util.List; + +import com.bonus.common.core.domain.entity.SysUserTeam; import org.apache.ibatis.annotations.Param; import com.bonus.common.core.domain.entity.SysUser; @@ -126,4 +128,19 @@ public interface SysUserMapper public SysUser checkEmailUnique(String email); String getPassWord(); + /** + * 批量插入用户-团队关联 + */ + int batchUserTeam(List list); + + /** + * 根据用户ID查询关联的团队ID列表 + */ + List selectTeamIdsByUserId(Long userId); + + /** + * 批量删除用户-团队关联 + */ + int batchDeleteUserTeam(@Param("userId") Long userId, @Param("teamIds") List teamIds); + } diff --git a/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java b/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java index 94525fb..0b6e88d 100644 --- a/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java +++ b/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java @@ -1,10 +1,13 @@ package com.bonus.system.service.impl; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.validation.Validator; +import com.bonus.common.core.domain.entity.SysUserTeam; import com.bonus.common.utils.DesensitizedUtil; import com.bonus.common.utils.GenerateUtil; import com.bonus.common.utils.encryption.Sm4Utils; @@ -254,6 +257,8 @@ public class SysUserServiceImpl implements ISysUserService { insertUserPost(user); // 新增用户与角色管理 insertUserRole(user); + // 批量插入用户-团队关联 + insertUserTeam(user); return rows; } @@ -286,6 +291,8 @@ public class SysUserServiceImpl implements ISysUserService { userPostMapper.deleteUserPostByUserId(userId); // 新增用户与岗位管理 insertUserPost(user); + // 用户-团队关联 + syncUserTeam(user); return userMapper.updateUser(user); } @@ -521,4 +528,80 @@ public class SysUserServiceImpl implements ISysUserService { public String getPassWord() { return userMapper.getPassWord(); } + /** + * 新增用户-团队关联信息 + * @param user 用户对象 + */ + public void insertUserTeam(SysUser user) { + if (user == null || user.getUserId() == null) { + return; + } + List teamIds = user.getTeamIds(); + // 空值校验 + if (CollectionUtils.isEmpty(teamIds)) { + return; + } + // 批量插入用户-团队关联 + List list = new ArrayList<>(teamIds.size()); + for (Long teamId : teamIds) { + // 过滤空值 + if (teamId == null) { + continue; + } + SysUserTeam ut = new SysUserTeam(); + ut.setUserId(user.getUserId()); + ut.setTeamId(teamId); + list.add(ut); + } + if (!list.isEmpty()) { + userMapper.batchUserTeam(list); + } + } + + /** + * 同步用户-团队关联 + * @param user 用户对象 + */ + public void syncUserTeam(SysUser user) { + if (user == null || user.getUserId() == null) { + return; + } + Long userId = user.getUserId(); + // 1. 查询该用户当前已关联的团队ID列表(直接初始化时完成空值处理,避免后续重新赋值) + List existTeamIds = userMapper.selectTeamIdsByUserId(userId) == null + ? Collections.emptyList() + : userMapper.selectTeamIdsByUserId(userId); + + // 2. 前端传递的新团队ID列表(直接初始化时完成空值处理,避免后续重新赋值) + List newTeamIds = user.getTeamIds() == null + ? Collections.emptyList() + : user.getTeamIds(); + + // 3. 需要新增的团队(新选 - 现有) + List addTeamIds = newTeamIds.stream() + .filter(teamId -> teamId != null && !existTeamIds.contains(teamId)) + .collect(Collectors.toList()); + + // 4. 需要移除的团队(现有 - 新选) + List removeTeamIds = existTeamIds.stream() + .filter(teamId -> !newTeamIds.contains(teamId)) + .collect(Collectors.toList()); + + // 5. 执行新增团队关联 + if (!addTeamIds.isEmpty()) { + List addList = new ArrayList<>(addTeamIds.size()); + for (Long teamId : addTeamIds) { + SysUserTeam ut = new SysUserTeam(); + ut.setUserId(userId); + ut.setTeamId(teamId); + addList.add(ut); + } + userMapper.batchUserTeam(addList); + } + + // 6. 执行移除团队关联 + if (!removeTeamIds.isEmpty()) { + userMapper.batchDeleteUserTeam(userId, removeTeamIds); + } + } } diff --git a/bonus-system/src/main/resources/mapper/system/SysUserMapper.xml b/bonus-system/src/main/resources/mapper/system/SysUserMapper.xml index 3b8c0d0..8b08cc8 100644 --- a/bonus-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/bonus-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -25,6 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -58,14 +59,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join sys_role r on r.role_id = ur.role_id - select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, - d.leader ,dksr.role_id,dksr.role_name + u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, + d.leader ,dksr.role_id,dksr.role_name, + GROUP_CONCAT(t.team_id) as teamIds from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_user_role dksur on u.user_id = dksur.user_id left join sys_role dksr on dksr.role_id = dksur.role_id + left join sys_user_team_association t on u.user_id = t.user_id where u.del_flag = '0' AND u.user_id = #{userId} @@ -91,6 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )) + GROUP BY u.user_id ${params.dataScope} @@ -238,4 +242,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + select user_id, team_id from sys_user_team_association + + + + + INSERT INTO sys_user_team_association (user_id, team_id) + VALUES + + (#{item.userId}, #{item.teamId}) + + + + + + + + + DELETE FROM sys_user_team_association + WHERE user_id = #{userId} + AND team_id IN + + #{teamId} + + + +