From eb0fb8eadc056e36134e00e2e1c57d8170842b81 Mon Sep 17 00:00:00 2001 From: LHD_HY <2872546851@qq.com> Date: Thu, 8 Jan 2026 10:07:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=A2=E9=98=9F=E5=85=B3=E8=81=94=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/admin/dto/TeamDto.java | 5 +++ .../bonus/common/domain/admin/vo/TeamVo.java | 24 +++++++++++++ .../com/bonus/system/mapper/ITeamMapper.java | 29 +++++++++++++++ .../system/service/impl/TeamServiceImpl.java | 36 +++++++++++++++++++ .../resources/mapper/system/TeamMapper.xml | 34 ++++++++++++++++-- 5 files changed, 125 insertions(+), 3 deletions(-) diff --git a/bonus-common/src/main/java/com/bonus/common/domain/admin/dto/TeamDto.java b/bonus-common/src/main/java/com/bonus/common/domain/admin/dto/TeamDto.java index 5d4a817..652115b 100644 --- a/bonus-common/src/main/java/com/bonus/common/domain/admin/dto/TeamDto.java +++ b/bonus-common/src/main/java/com/bonus/common/domain/admin/dto/TeamDto.java @@ -8,8 +8,10 @@ import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.List; import java.util.Optional; /** @@ -35,6 +37,9 @@ public class TeamDto { @Length(max = 32, message = "团队名称字符长度不能超过32", groups = {ADD.class, UPDATE.class}) private String teamName; + @NotEmpty(message = "请选择至少一名团队成员", groups = {ADD.class, UPDATE.class}) + private List memberIds; + /** * 团队备注 */ diff --git a/bonus-common/src/main/java/com/bonus/common/domain/admin/vo/TeamVo.java b/bonus-common/src/main/java/com/bonus/common/domain/admin/vo/TeamVo.java index 81994e5..6fd5791 100644 --- a/bonus-common/src/main/java/com/bonus/common/domain/admin/vo/TeamVo.java +++ b/bonus-common/src/main/java/com/bonus/common/domain/admin/vo/TeamVo.java @@ -4,7 +4,11 @@ import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; /** * @className:TeamVo @@ -36,6 +40,26 @@ public class TeamVo { */ private Long teamNum; + /** + * 新接收数据库GROUP_CONCAT拼接的成员ID字符串(如 "1001,1002,1003") + */ + private String memberIdsStr; + + /** + * 转换后的成员ID数组 + */ + public List getMemberIds() { + // 空值处理:避免字符串为空/Null时转换报错 + if (memberIdsStr == null || memberIdsStr.trim().isEmpty()) { + return new ArrayList<>(); + } + // 将逗号分隔的字符串转成Long类型的List + return Arrays.stream(memberIdsStr.split(",")) + .map(String::trim) // 去除空格(防止拼接时出现多余空格) + .map(Long::valueOf) // 转成Long类型 + .collect(Collectors.toList()); + } + /** * 创建时间 */ diff --git a/bonus-system/src/main/java/com/bonus/system/mapper/ITeamMapper.java b/bonus-system/src/main/java/com/bonus/system/mapper/ITeamMapper.java index 7ada778..6bf5b60 100644 --- a/bonus-system/src/main/java/com/bonus/system/mapper/ITeamMapper.java +++ b/bonus-system/src/main/java/com/bonus/system/mapper/ITeamMapper.java @@ -52,4 +52,33 @@ public interface ITeamMapper { * @date 2025/12/15 17:25 */ List teamIsAssociation(TeamDto dto); + + /** + * 批量插入团队-用户关联数据 + * @param teamId 团队ID + * @param userIds 用户ID列表 + * @return void + * @author lhdhy + * @date 2026/1/7 + */ + void batchInsertUserTeam(@Param("teamId") Long teamId, @Param("userIds") List userIds); + + /** + * 查询指定团队已关联的成员ID列表 + * @param teamId 团队ID + * @return List 用户ID列表 + * @author lhdhy + * @date 2026/1/7 + */ + List selectUserIdsByTeamId(@Param("teamId") Long teamId); + + /** + * 批量删除指定团队的指定成员关联数据 + * @param teamId 团队ID + * @param userIds 要移除的用户ID列表 + * @return void + * @author lhdhy + * @date 2026/1/7 + */ + void batchDeleteUserTeam(@Param("teamId") Long teamId, @Param("userIds") List userIds); } diff --git a/bonus-system/src/main/java/com/bonus/system/service/impl/TeamServiceImpl.java b/bonus-system/src/main/java/com/bonus/system/service/impl/TeamServiceImpl.java index 124c30e..0b18c6f 100644 --- a/bonus-system/src/main/java/com/bonus/system/service/impl/TeamServiceImpl.java +++ b/bonus-system/src/main/java/com/bonus/system/service/impl/TeamServiceImpl.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * @className:TeamServiceImpl @@ -62,6 +63,14 @@ public class TeamServiceImpl implements ITeamService { // 2.添加团队数据 teamMapper.operData(dto, 1); + Long teamId = dto.getTeamId(); + if (teamId == null) { + throw new RuntimeException("团队ID生成失败"); + } + + // 3.批量插入团队成员 + teamMapper.batchInsertUserTeam(teamId, dto.getMemberIds()); + } catch (Exception e) { log.error(e.toString(), e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @@ -71,6 +80,7 @@ public class TeamServiceImpl implements ITeamService { } @Override + @Transactional(rollbackFor = Exception.class) public AjaxResult editData(TeamDto dto) { // 校验数据是否合法 String validResult = validatorsUtils.valid(dto, TeamDto.UPDATE.class); @@ -86,6 +96,32 @@ public class TeamServiceImpl implements ITeamService { // 2.修改团队数据 teamMapper.operData(dto, 2); + Long teamId = dto.getTeamId(); + // 3.查询该团队当前已关联的成员ID列表 + List existMemberIds = teamMapper.selectUserIdsByTeamId(teamId); + // 前端传递的新成员ID列表 + List newMemberIds = dto.getMemberIds(); + + // 需要新增的成员(新选 - 现有) + List addMemberIds = newMemberIds.stream() + .filter(userId -> !existMemberIds.contains(userId)) + .collect(Collectors.toList()); + + // 需要移除的成员(现有 - 新选) + List removeMemberIds = existMemberIds.stream() + .filter(userId -> !newMemberIds.contains(userId)) + .collect(Collectors.toList()); + + // 6.执行新增成员关联 + if (!addMemberIds.isEmpty()) { + teamMapper.batchInsertUserTeam(teamId, addMemberIds); + } + + // 7.执行移除成员关联 + if (!removeMemberIds.isEmpty()) { + teamMapper.batchDeleteUserTeam(teamId, removeMemberIds); + } + } catch (Exception e) { log.error(e.toString(), e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); diff --git a/bonus-system/src/main/resources/mapper/system/TeamMapper.xml b/bonus-system/src/main/resources/mapper/system/TeamMapper.xml index f4168ed..7db3fd4 100644 --- a/bonus-system/src/main/resources/mapper/system/TeamMapper.xml +++ b/bonus-system/src/main/resources/mapper/system/TeamMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + INSERT INTO sys_team @@ -38,7 +38,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" st.team_name AS teamName, st.create_time AS createTime, st.team_remark AS teamRemark, - COUNT(suta.user_id) AS teamNum + COUNT(suta.user_id) AS teamNum, + -- 接该团队的所有成员ID为字符串 + GROUP_CONCAT(DISTINCT suta.user_id) AS memberIdsStr FROM sys_team st LEFT JOIN sys_user_team_association suta ON st.team_id = suta.team_id @@ -47,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND st.del_flag = '0' - GROUP BY st.team_id, st.team_name, st.create_time + GROUP BY st.team_id ORDER BY st.create_time DESC @@ -64,4 +66,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT COUNT(*) FROM sys_user_team_association WHERE team_id = #{teamId} + + + + INSERT INTO sys_user_team_association (user_id, team_id) + VALUES + + (#{userId}, #{teamId}) + + + + + + + + + DELETE FROM sys_user_team_association + WHERE team_id = #{teamId} + AND user_id IN + + #{userId} + +