团队关联人员功能

This commit is contained in:
LHD_HY 2026-01-08 10:07:31 +08:00
parent ae0ffa83a7
commit eb0fb8eadc
5 changed files with 125 additions and 3 deletions

View File

@ -8,8 +8,10 @@ import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Optional; import java.util.Optional;
/** /**
@ -35,6 +37,9 @@ public class TeamDto {
@Length(max = 32, message = "团队名称字符长度不能超过32", groups = {ADD.class, UPDATE.class}) @Length(max = 32, message = "团队名称字符长度不能超过32", groups = {ADD.class, UPDATE.class})
private String teamName; private String teamName;
@NotEmpty(message = "请选择至少一名团队成员", groups = {ADD.class, UPDATE.class})
private List<Long> memberIds;
/** /**
* 团队备注 * 团队备注
*/ */

View File

@ -4,7 +4,11 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* @className:TeamVo * @className:TeamVo
@ -36,6 +40,26 @@ public class TeamVo {
*/ */
private Long teamNum; private Long teamNum;
/**
* 新接收数据库GROUP_CONCAT拼接的成员ID字符串 "1001,1002,1003"
*/
private String memberIdsStr;
/**
* 转换后的成员ID数组
*/
public List<Long> 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());
}
/** /**
* 创建时间 * 创建时间
*/ */

View File

@ -52,4 +52,33 @@ public interface ITeamMapper {
* @date 2025/12/15 17:25 * @date 2025/12/15 17:25
*/ */
List<Integer> teamIsAssociation(TeamDto dto); List<Integer> 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<Long> userIds);
/**
* 查询指定团队已关联的成员ID列表
* @param teamId 团队ID
* @return List<Long> 用户ID列表
* @author lhdhy
* @date 2026/1/7
*/
List<Long> 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<Long> userIds);
} }

View File

@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
/** /**
* @className:TeamServiceImpl * @className:TeamServiceImpl
@ -62,6 +63,14 @@ public class TeamServiceImpl implements ITeamService {
// 2.添加团队数据 // 2.添加团队数据
teamMapper.operData(dto, 1); teamMapper.operData(dto, 1);
Long teamId = dto.getTeamId();
if (teamId == null) {
throw new RuntimeException("团队ID生成失败");
}
// 3.批量插入团队成员
teamMapper.batchInsertUserTeam(teamId, dto.getMemberIds());
} catch (Exception e) { } catch (Exception e) {
log.error(e.toString(), e); log.error(e.toString(), e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@ -71,6 +80,7 @@ public class TeamServiceImpl implements ITeamService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult editData(TeamDto dto) { public AjaxResult editData(TeamDto dto) {
// 校验数据是否合法 // 校验数据是否合法
String validResult = validatorsUtils.valid(dto, TeamDto.UPDATE.class); String validResult = validatorsUtils.valid(dto, TeamDto.UPDATE.class);
@ -86,6 +96,32 @@ public class TeamServiceImpl implements ITeamService {
// 2.修改团队数据 // 2.修改团队数据
teamMapper.operData(dto, 2); teamMapper.operData(dto, 2);
Long teamId = dto.getTeamId();
// 3.查询该团队当前已关联的成员ID列表
List<Long> existMemberIds = teamMapper.selectUserIdsByTeamId(teamId);
// 前端传递的新成员ID列表
List<Long> newMemberIds = dto.getMemberIds();
// 需要新增的成员新选 - 现有
List<Long> addMemberIds = newMemberIds.stream()
.filter(userId -> !existMemberIds.contains(userId))
.collect(Collectors.toList());
// 需要移除的成员现有 - 新选
List<Long> 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) { } catch (Exception e) {
log.error(e.toString(), e); log.error(e.toString(), e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

View File

@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bonus.system.mapper.ITeamMapper"> <mapper namespace="com.bonus.system.mapper.ITeamMapper">
<!--操作团队数据--> <!--操作团队数据-->
<insert id="operData"> <insert id="operData" useGeneratedKeys="true" keyProperty="params.teamId" keyColumn="team_id">
<if test="operType == 1"> <if test="operType == 1">
INSERT INTO sys_team INSERT INTO sys_team
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
@ -38,7 +38,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
st.team_name AS teamName, st.team_name AS teamName,
st.create_time AS createTime, st.create_time AS createTime,
st.team_remark AS teamRemark, 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 FROM sys_team st
LEFT JOIN sys_user_team_association suta ON st.team_id = suta.team_id LEFT JOIN sys_user_team_association suta ON st.team_id = suta.team_id
<where> <where>
@ -47,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if> </if>
AND st.del_flag = '0' AND st.del_flag = '0'
</where> </where>
GROUP BY st.team_id, st.team_name, st.create_time GROUP BY st.team_id
ORDER BY st.create_time DESC ORDER BY st.create_time DESC
</select> </select>
<!--查询团队名称是否重复--> <!--查询团队名称是否重复-->
@ -64,4 +66,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT COUNT(*) SELECT COUNT(*)
FROM sys_user_team_association WHERE team_id = #{teamId} FROM sys_user_team_association WHERE team_id = #{teamId}
</select> </select>
<!-- 批量插入团队-用户关联数据 -->
<insert id="batchInsertUserTeam">
INSERT INTO sys_user_team_association (user_id, team_id)
VALUES
<foreach collection="userIds" item="userId" separator=",">
(#{userId}, #{teamId})
</foreach>
</insert>
<!-- 查询指定团队已关联的成员ID列表 -->
<select id="selectUserIdsByTeamId" resultType="java.lang.Long">
SELECT user_id
FROM sys_user_team_association
WHERE team_id = #{teamId}
</select>
<!-- 批量删除指定团队的指定成员关联数据 -->
<delete id="batchDeleteUserTeam">
DELETE FROM sys_user_team_association
WHERE team_id = #{teamId}
AND user_id IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</delete>
</mapper> </mapper>