消除人员重复bug

This commit is contained in:
wangna0328 2025-08-08 14:52:14 +08:00
parent b45766d377
commit d4b06d9c66
2 changed files with 140 additions and 106 deletions

View File

@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@ -50,11 +51,22 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
// 查询团队成员列表
List<ProjectMemberResp> list = this.baseMapper.queryTeamMembers(query);
// 按用户ID去重保留第一个记录
Map<String, ProjectMemberResp> uniqueMembers = list.stream()
.collect(Collectors.toMap(
ProjectMemberResp::getUserId,
member -> member,
(existing, replacement) -> existing // 如果有重复保留第一个
));
// 转换为列表
List<ProjectMemberResp> uniqueList = new ArrayList<>(uniqueMembers.values());
// 丰富成员信息
enrichMemberInfo(list);
enrichMemberInfo(uniqueList);
// 返回分页结果
return PageResult.ok(list);
return PageResult.ok(uniqueList);
}
/**
@ -86,43 +98,81 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
UserEntity user = userMap.get(member.getUserId());
if (user != null) {
// 映射前端需要的字段
member.setName(user.getName());
member.setPhone(user.getMobile());
member.setEmail(user.getEmail());
member.setName(user.getName() != null ? user.getName() : "");
member.setPhone(user.getMobile() != null ? user.getMobile() : "");
member.setEmail(user.getEmail() != null ? user.getEmail() : "");
// 保留原有字段用于内部处理
member.setUserAccount(user.getAccount());
member.setUserAvatar(user.getAvatar());
member.setUserAccount(user.getAccount() != null ? user.getAccount() : "");
member.setUserAvatar(user.getAvatar() != null ? user.getAvatar() : "");
} else {
// 如果用户信息不存在设置默认值
member.setName("");
member.setPhone("");
member.setEmail("");
member.setUserAccount("");
member.setUserAvatar("");
}
// 映射岗位信息 - 使用角色类型描述作为岗位
member.setPosition(member.getRoleTypeDesc());
member.setPosition(member.getRoleTypeDesc() != null ? member.getRoleTypeDesc() : "");
// 映射技能标签 - 暂时设为空因为数据库中没有这个字段
member.setSkills("");
// 处理其他可能为NULL的字段
if (member.getTurbineId() == null) {
member.setTurbineId("");
}
if (member.getTurbineName() == null) {
member.setTurbineName("");
}
if (member.getTaskGroupId() == null) {
member.setTaskGroupId("");
}
if (member.getTaskGroupName() == null) {
member.setTaskGroupName("");
}
if (member.getTaskId() == null) {
member.setTaskId("");
}
if (member.getTaskName() == null) {
member.setTaskName("");
}
if (member.getRemark() == null) {
member.setRemark("");
}
// 设置状态描述
if ("ACTIVE".equals(member.getStatus())) {
member.setStatusDesc("在职");
} else if ("INACTIVE".equals(member.getStatus())) {
member.setStatusDesc("离职");
} else if ("PENDING".equals(member.getStatus())) {
member.setStatusDesc("待入职");
if (member.getStatus() != null) {
if ("ACTIVE".equals(member.getStatus())) {
member.setStatusDesc("在职");
} else if ("INACTIVE".equals(member.getStatus())) {
member.setStatusDesc("离职");
} else if ("PENDING".equals(member.getStatus())) {
member.setStatusDesc("待入职");
} else {
member.setStatusDesc("未知");
}
} else {
member.setStatusDesc("未知");
}
// 设置角色类型描述
if ("PROJECT_MANAGER".equals(member.getRoleType())) {
member.setRoleTypeDesc("项目经理");
} else if ("SAFETY_OFFICER".equals(member.getRoleType())) {
member.setRoleTypeDesc("安全员");
} else if ("QUALITY_OFFICER".equals(member.getRoleType())) {
member.setRoleTypeDesc("质量员");
} else if ("CONSTRUCTOR".equals(member.getRoleType())) {
member.setRoleTypeDesc("施工员");
} else if ("TEAM_LEADER".equals(member.getRoleType())) {
member.setRoleTypeDesc("施工组长");
if (member.getRoleType() != null) {
if ("PROJECT_MANAGER".equals(member.getRoleType())) {
member.setRoleTypeDesc("项目经理");
} else if ("SAFETY_OFFICER".equals(member.getRoleType())) {
member.setRoleTypeDesc("安全员");
} else if ("QUALITY_OFFICER".equals(member.getRoleType())) {
member.setRoleTypeDesc("质量员");
} else if ("CONSTRUCTOR".equals(member.getRoleType())) {
member.setRoleTypeDesc("施工员");
} else if ("TEAM_LEADER".equals(member.getRoleType())) {
member.setRoleTypeDesc("施工组长");
} else {
member.setRoleTypeDesc("其他");
}
} else {
member.setRoleTypeDesc("其他");
}
@ -131,41 +181,8 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
@Override
public ProjectMemberResp createTeamMember(TeamMemberReq req) {
// 验证项目是否存在
ProjectEntity project = projectService.getById(req.getProjectId());
if (project == null) {
throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST);
}
// 验证用户是否存在
UserEntity user = userService.getById(req.getUserId());
if (user == null) {
throw new ServiceException("用户不存在");
}
// 验证机组是否存在如果指定了机组
if (StrUtil.isNotBlank(req.getTurbineId())) {
TurbineEntity turbine = turbineService.getById(req.getTurbineId());
if (turbine == null) {
throw new ServiceException("机组不存在");
}
}
// 验证任务组是否存在如果指定了任务组
if (StrUtil.isNotBlank(req.getTaskGroupId())) {
ProjectTaskGroupEntity taskGroup = projectTaskGroupService.getById(req.getTaskGroupId());
if (taskGroup == null) {
throw new ServiceException("任务组不存在");
}
}
// 验证任务是否存在如果指定了任务
if (StrUtil.isNotBlank(req.getTaskId())) {
ProjectTaskEntity task = projectTaskService.getById(req.getTaskId());
if (task == null) {
throw new ServiceException("任务不存在");
}
}
// 验证请求参数
validateTeamMemberRequest(req);
// 创建项目成员实体
ProjectMemberEntity entity = new ProjectMemberEntity();
@ -186,41 +203,8 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
throw new ServiceException("项目成员不存在");
}
// 验证项目是否存在
ProjectEntity project = projectService.getById(req.getProjectId());
if (project == null) {
throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST);
}
// 验证用户是否存在
UserEntity user = userService.getById(req.getUserId());
if (user == null) {
throw new ServiceException("用户不存在");
}
// 验证机组是否存在如果指定了机组
if (StrUtil.isNotBlank(req.getTurbineId())) {
TurbineEntity turbine = turbineService.getById(req.getTurbineId());
if (turbine == null) {
throw new ServiceException("机组不存在");
}
}
// 验证任务组是否存在如果指定了任务组
if (StrUtil.isNotBlank(req.getTaskGroupId())) {
ProjectTaskGroupEntity taskGroup = projectTaskGroupService.getById(req.getTaskGroupId());
if (taskGroup == null) {
throw new ServiceException("任务组不存在");
}
}
// 验证任务是否存在如果指定了任务
if (StrUtil.isNotBlank(req.getTaskId())) {
ProjectTaskEntity task = projectTaskService.getById(req.getTaskId());
if (task == null) {
throw new ServiceException("任务不存在");
}
}
// 验证请求参数
validateTeamMemberRequest(req);
// 更新成员信息
BeanUtil.copyProperties(req, existingMember);
@ -246,6 +230,47 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
return this.removeByIds(CollUtil.toList(memberIds));
}
/**
* 验证团队成员请求参数
*/
private void validateTeamMemberRequest(TeamMemberReq req) {
// 验证项目是否存在
ProjectEntity project = projectService.getById(req.getProjectId());
if (project == null) {
throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST);
}
// 验证用户是否存在
UserEntity user = userService.getById(req.getUserId());
if (user == null) {
throw new ServiceException("用户不存在");
}
// 验证机组是否存在如果指定了机组
if (StrUtil.isNotBlank(req.getTurbineId())) {
TurbineEntity turbine = turbineService.getById(req.getTurbineId());
if (turbine == null) {
throw new ServiceException("机组不存在");
}
}
// 验证任务组是否存在如果指定了任务组
if (StrUtil.isNotBlank(req.getTaskGroupId())) {
ProjectTaskGroupEntity taskGroup = projectTaskGroupService.getById(req.getTaskGroupId());
if (taskGroup == null) {
throw new ServiceException("任务组不存在");
}
}
// 验证任务是否存在如果指定了任务
if (StrUtil.isNotBlank(req.getTaskId())) {
ProjectTaskEntity task = projectTaskService.getById(req.getTaskId());
if (task == null) {
throw new ServiceException("任务不存在");
}
}
}
/**
* 根据成员ID获取成员信息
*/
@ -468,19 +493,28 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
// 设置项目经理
item.setManager(memberNames.get("PROJECT_MANAGER"));
// 设置团队规模
item.setTeamSize(members.size());
// 设置团队规模 - 使用去重后的数量
item.setTeamSize((int) members.stream()
.map(ProjectMemberResp::getUserId)
.distinct()
.count());
// 转换为团队成员列表
// 转换为团队成员列表 - 按用户ID去重
List<ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp> teamMembers = members.stream()
.map(member -> {
ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp();
// 先复制所有同名字段
BeanUtil.copyProperties(member, teamMember);
// 手动处理字段名不一致的字段
teamMember.setUserName(member.getName()); // name -> userName
return teamMember;
})
.collect(Collectors.toMap(
ProjectMemberResp::getUserId, // 按用户ID去重
member -> {
ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp();
// 先复制所有同名字段
BeanUtil.copyProperties(member, teamMember);
// 手动处理字段名不一致的字段
teamMember.setUserName(member.getName()); // name -> userName
return teamMember;
},
(existing, replacement) -> existing // 如果有重复保留第一个
))
.values()
.stream()
.collect(Collectors.toList());
item.setTeamMembers(teamMembers);

View File

@ -4,7 +4,7 @@
<!-- 获取项目团队成员列表(支持筛选、分页、搜索) -->
<select id="queryTeamMembers" resultType="com.dite.znpt.domain.vo.ProjectMemberResp">
SELECT DISTINCT
SELECT
pm.member_id,
pm.project_id,
p.project_name,