From 386561125ef6a67cac044508bdacdaad3f27350d Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Thu, 7 Aug 2025 11:17:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/vo/ProjectMemberResp.java | 42 ++++++++--- .../dite/znpt/domain/vo/TeamMemberQuery.java | 39 ++++++++++ .../dite/znpt/mapper/ProjectMemberMapper.java | 6 +- .../znpt/service/ProjectMemberService.java | 7 +- .../impl/ProjectMemberServiceImpl.java | 75 ++++++++++++++++--- .../resources/mapper/ProjectMemberMapper.xml | 70 ++++++++--------- .../controller/ProjectMemberController.java | 12 +++ 7 files changed, 190 insertions(+), 61 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java index a633545..c69e49c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -45,8 +46,34 @@ public class ProjectMemberResp { @ApiModelProperty("用户ID") private String userId; - @ApiModelProperty("用户姓名") - private String userName; + // ========================== 前端需要的字段 ========================== + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("项目岗位") + private String position; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("技能标签") + private String skills; + + @ApiModelProperty("入职日期") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate joinDate; + + @ApiModelProperty("备注") + private String remark; + + // ========================== 保留的原有字段(用于内部处理) ========================== @ApiModelProperty("用户账号") private String userAccount; @@ -69,15 +96,10 @@ public class ProjectMemberResp { @ApiModelProperty("岗位描述") private String jobDesc; - @ApiModelProperty("加入时间") - private LocalDate joinDate; - @ApiModelProperty("离开时间") + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate leaveDate; - @ApiModelProperty("状态") - private String status; - - @ApiModelProperty("备注") - private String remark; + @ApiModelProperty("状态描述") + private String statusDesc; } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java new file mode 100644 index 0000000..c147e51 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 团队成员查询参数(支持筛选、分页、搜索) + */ +@Data +@ApiModel(value="TeamMemberQuery对象", description="团队成员查询参数") +public class TeamMemberQuery { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("姓名搜索") + private String name; + + @ApiModelProperty("岗位筛选") + private String position; + + @ApiModelProperty("状态筛选") + private String status; + + @ApiModelProperty("当前页码") + private Integer pageNum = 1; + + @ApiModelProperty("每页大小") + private Integer pageSize = 10; + + @ApiModelProperty("排序列") + private String orderByColumn; + + @ApiModelProperty("排序方向") + private String isAsc = "asc"; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java index a66a598..106a33d 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java @@ -3,8 +3,8 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ProjectMemberEntity; import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -17,7 +17,7 @@ import java.util.List; public interface ProjectMemberMapper extends BaseMapper { /** - * 根据项目ID查询项目人员列表 + * 获取项目团队成员列表(支持筛选、分页、搜索) */ - List queryByProjectId(@Param("projectId") String projectId); + List queryTeamMembers(TeamMemberQuery query); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java index b743cd2..7640640 100644 --- a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -1,11 +1,10 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.entity.ProjectMemberEntity; import com.dite.znpt.domain.vo.*; -import java.util.List; - /** * @author wangna * @date 2025/08/05 @@ -14,9 +13,9 @@ import java.util.List; public interface ProjectMemberService extends IService { /** - * 根据项目ID查询项目人员列表(看板功能需要) + * 获取项目团队成员列表(支持筛选、分页、搜索) */ - List selectByProjectId(String projectId); + PageResult getProjectTeamMembers(TeamMemberQuery query); // ========================== 项目看板相关方法 ========================== diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 68a9e1f..06705f0 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -5,16 +5,19 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.entity.*; import com.dite.znpt.domain.vo.ProjectDetailResp; import com.dite.znpt.domain.vo.ProjectKanbanDataResp; import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectMemberMapper; import com.dite.znpt.service.*; +import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -43,10 +46,18 @@ public class ProjectMemberServiceImpl extends ServiceImpl selectByProjectId(String projectId) { - List list = this.baseMapper.queryByProjectId(projectId); + public PageResult getProjectTeamMembers(TeamMemberQuery query) { + // 设置分页参数 + PageUtil.startPage(); + + // 查询团队成员列表 + List list = this.baseMapper.queryTeamMembers(query); + + // 丰富成员信息 enrichMemberInfo(list); - return list; + + // 返回分页结果 + return PageResult.ok(list); } /** @@ -77,9 +88,47 @@ public class ProjectMemberServiceImpl extends ServiceImpl { UserEntity user = userMap.get(member.getUserId()); if (user != null) { - member.setUserName(user.getName()); + // 映射前端需要的字段 + member.setName(user.getName()); + member.setPhone(user.getMobile()); + member.setEmail(user.getEmail()); + + // 保留原有字段用于内部处理 + member.setUserAccount(user.getAccount()); member.setUserAvatar(user.getAvatar()); } + + // 映射岗位信息 - 使用角色类型描述作为岗位 + member.setPosition(member.getRoleTypeDesc()); + + // 映射技能标签 - 暂时设为空,因为数据库中没有这个字段 + member.setSkills(""); + + // 设置状态描述 + 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("未知"); + } + + // 设置角色类型描述 + 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("其他"); + } }); } @@ -148,8 +197,11 @@ public class ProjectMemberServiceImpl extends ServiceImpl projectMembers = selectByProjectId(projectId); + // 获取项目人员信息 - 使用新的查询方法 + TeamMemberQuery query = new TeamMemberQuery(); + query.setProjectId(projectId); + PageResult memberResult = getProjectTeamMembers(query); + List projectMembers = memberResult.getRows(); resp.setProjectMembers(projectMembers); // 计算团队规模 @@ -158,7 +210,7 @@ public class ProjectMemberServiceImpl extends ServiceImpl "PROJECT_MANAGER".equals(member.getRoleType())) - .map(ProjectMemberResp::getUserName) + .map(ProjectMemberResp::getName) .findFirst() .orElse(""); resp.setManager(managerName); @@ -253,15 +305,18 @@ public class ProjectMemberServiceImpl extends ServiceImpl members = selectByProjectId(project.getProjectId()); + // 获取项目人员信息 - 使用新的查询方法 + TeamMemberQuery query = new TeamMemberQuery(); + query.setProjectId(project.getProjectId()); + PageResult memberResult = getProjectTeamMembers(query); + List members = memberResult.getRows(); // 按角色类型分组,并去重用户名 Map memberNames = members.stream() .collect(Collectors.groupingBy( ProjectMemberResp::getRoleType, Collectors.mapping( - ProjectMemberResp::getUserName, + ProjectMemberResp::getName, Collectors.collectingAndThen( Collectors.toSet(), // 使用Set去重 set -> String.join(",", set) diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml index bb1a416..81892d0 100644 --- a/core/src/main/resources/mapper/ProjectMemberMapper.xml +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -2,35 +2,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + SELECT DISTINCT pm.member_id, pm.project_id, p.project_name, @@ -41,26 +15,54 @@ pm.task_id, pt.task_name, pm.user_id, - u.name as user_name, + u.name as name, u.account as user_account, u.avatar as user_avatar, + u.mobile as phone, + u.email as email, pm.role_type, - pm.role_type as role_type_desc, + CASE + WHEN pm.role_type = 'PROJECT_MANAGER' THEN '项目经理' + WHEN pm.role_type = 'SAFETY_OFFICER' THEN '安全员' + WHEN pm.role_type = 'QUALITY_OFFICER' THEN '质量员' + WHEN pm.role_type = 'CONSTRUCTOR' THEN '施工员' + WHEN pm.role_type = 'TEAM_LEADER' THEN '施工组长' + ELSE '其他' + END as role_type_desc, pm.job_code, pm.job_code as job_code_desc, pm.job_desc, pm.join_date, pm.leave_date, pm.status, - pm.remark + CASE + WHEN pm.status = 'ACTIVE' THEN '在职' + WHEN pm.status = 'INACTIVE' THEN '离职' + WHEN pm.status = 'PENDING' THEN '待入职' + ELSE '未知' + END as status_desc, + pm.remark, + pm.create_time FROM project_member pm LEFT JOIN project p ON pm.project_id COLLATE utf8mb4_general_ci = p.project_id COLLATE utf8mb4_general_ci LEFT JOIN turbine t ON pm.turbine_id COLLATE utf8mb4_general_ci = t.turbine_id COLLATE utf8mb4_general_ci LEFT JOIN project_task_group ptg ON pm.task_group_id COLLATE utf8mb4_general_ci = ptg.group_id COLLATE utf8mb4_general_ci LEFT JOIN project_task pt ON pm.task_id COLLATE utf8mb4_general_ci = pt.task_id COLLATE utf8mb4_general_ci LEFT JOIN user u ON pm.user_id COLLATE utf8mb4_general_ci = u.user_id COLLATE utf8mb4_general_ci - WHERE pm.project_id = #{projectId} - AND pm.status = 'ACTIVE' + + + AND pm.project_id = #{projectId} + + + AND u.name LIKE CONCAT('%', #{name}, '%') + + + AND pm.role_type = #{position} + + + AND pm.status = #{status} + + ORDER BY pm.create_time DESC diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java index 85a2c6c..f785c18 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -1,9 +1,12 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ProjectDetailResp; import com.dite.znpt.domain.vo.ProjectKanbanDataResp; import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import com.dite.znpt.service.ProjectMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -28,6 +31,15 @@ public class ProjectMemberController { @Resource private ProjectMemberService projectMemberService; + @ApiOperation(value = "获取项目团队成员列表(支持筛选、分页、搜索)", httpMethod = "GET") + @GetMapping("/project/{projectId}/team-members") + public PageResult getProjectTeamMembers( + @PathVariable String projectId, + TeamMemberQuery query) { + query.setProjectId(projectId); + return projectMemberService.getProjectTeamMembers(query); + } + // ========================== 项目看板相关接口 ========================== @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET")