Compare commits

..

1 Commits

11 changed files with 18 additions and 359 deletions

View File

@ -1,41 +0,0 @@
package com.dite.znpt.domain.vo;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDate;
@Data
@ApiModel("项目初始化任务请求参数")
public class ProjectInitTaskReq {
@ApiModelProperty("任务名称")
private String taskName;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目任务编号不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目任务编号长度不能超过100字符")
@ApiModelProperty("项目任务编号")
private String taskCode;
@NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划开始时间不能为空")
@ApiModelProperty("计划开始时间")
private LocalDate planStartDate;
@NotNull(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "计划结束时间不能为空")
@ApiModelProperty("计划结束时间")
private LocalDate planEndDate;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务组id不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 32, message = "任务组id长度不能超过32字符")
@ApiModelProperty("任务组id")
private String taskGroupId;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "任务负责人id不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "任务负责人id长度不能超过100字符")
@ApiModelProperty("任务负责人id")
private String mainUserId;
}

View File

@ -32,15 +32,6 @@ public class ProjectKanbanDataResp {
@ApiModelProperty("已验收项目列表") @ApiModelProperty("已验收项目列表")
private List<ProjectKanbanItem> acceptedProjects; private List<ProjectKanbanItem> acceptedProjects;
@ApiModelProperty("验收中项目列表")
private List<ProjectKanbanItem> acceptanceProjects;
@ApiModelProperty("回款中项目列表")
private List<ProjectKanbanItem> collectionProjects;
@ApiModelProperty("已结算项目列表")
private List<ProjectKanbanItem> settledProjects;
@Data @Data
@ApiModel(value="ProjectKanbanItem对象", description="项目看板项目项") @ApiModel(value="ProjectKanbanItem对象", description="项目看板项目项")
public static class ProjectKanbanItem { public static class ProjectKanbanItem {

View File

@ -31,15 +31,6 @@ public class ProjectKanbanStatsResp {
@ApiModelProperty("已验收项目数") @ApiModelProperty("已验收项目数")
private Long acceptedProjectCount; private Long acceptedProjectCount;
@ApiModelProperty("验收中项目数")
private Long acceptanceProjectCount;
@ApiModelProperty("回款中项目数")
private Long collectionProjectCount;
@ApiModelProperty("已结算项目数")
private Long settledProjectCount;
@ApiModelProperty("总机组数") @ApiModelProperty("总机组数")
private Long totalTurbineCount; private Long totalTurbineCount;

View File

@ -1,6 +1,5 @@
package com.dite.znpt.domain.vo; package com.dite.znpt.domain.vo;
import com.dite.znpt.domain.entity.ProjectTaskEntity;
import com.dite.znpt.util.ValidationGroup; import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -11,7 +10,6 @@ import javax.validation.constraints.Size;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
/** /**
* @Author: gaoxiong * @Author: gaoxiong
@ -33,6 +31,7 @@ public class ProjectReq implements Serializable {
@ApiModelProperty("项目来源") @ApiModelProperty("项目来源")
private String projectOrigin; private String projectOrigin;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目预算不能为空")
@ApiModelProperty("项目预算") @ApiModelProperty("项目预算")
private Integer projectBudget; private Integer projectBudget;
@ -128,7 +127,4 @@ public class ProjectReq implements Serializable {
@ApiModelProperty("其他杂费") @ApiModelProperty("其他杂费")
private Double othersCost; private Double othersCost;
@ApiModelProperty("项目初始任务")
private List<ProjectInitTaskReq> tasks;
} }

View File

@ -1,60 +0,0 @@
package com.dite.znpt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author wangna
* @date 2025/08/05
* @Description: 团队成员更新请求类用于更新操作移除必填验证
*/
@Data
@ApiModel(value="TeamMemberUpdateReq对象", description="团队成员更新请求类")
public class TeamMemberUpdateReq implements Serializable {
@ApiModelProperty("项目ID")
private String projectId;
@ApiModelProperty("机组ID可选")
private String turbineId;
@ApiModelProperty("任务组ID可选")
private String taskGroupId;
@ApiModelProperty("任务ID可选")
private String taskId;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("项目角色类型PROJECT_MANAGER-项目经理SAFETY_OFFICER-安全员QUALITY_OFFICER-质量员CONSTRUCTOR-施工人员TEAM_LEADER-施工组长")
private String roleType;
@ApiModelProperty("具体岗位代码GROUND_SERVICE-地勤DRIVER-司机ASCENDING-登高等)")
private String jobCode;
@ApiModelProperty("岗位描述")
private String jobDesc;
@ApiModelProperty("加入时间")
private LocalDate joinDate;
@ApiModelProperty("离开时间")
private LocalDate leaveDate;
@ApiModelProperty("状态ACTIVE-在职INACTIVE-离职PENDING-待入职")
private String status = "ACTIVE";
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("用户电话")
private String phone;
@ApiModelProperty("用户邮箱")
private String email;
}

View File

@ -15,14 +15,11 @@ import java.util.List;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum ProjectStatusEnum { public enum ProjectStatusEnum {
PENDING(0, "未开"), PENDING(0, "待施"),
IN_PREPARATION(1, "筹备"), IN_PROGRESS(1, "施工"),
IN_PROGRESS(2, "开工中"), COMPLETED(2, "已完工"),
AUDITED(3, "已审核"), AUDITED(3, "已审核"),
COMPLETED(4, "已完工"), ACCEPTED(4, "已验收");
ACCEPTED(5, "已验收"),
IN_COLLECTION(6, "回款中"),
SETTLED(7, "已结算");
private final int code; private final int code;
private final String desc; private final String desc;

View File

@ -27,11 +27,6 @@ public interface ProjectMemberService extends IService<ProjectMemberEntity> {
*/ */
ProjectMemberResp updateTeamMember(String memberId, TeamMemberReq req); ProjectMemberResp updateTeamMember(String memberId, TeamMemberReq req);
/**
* 更新团队成员信息使用更新专用请求类
*/
ProjectMemberResp updateTeamMember(String memberId, TeamMemberUpdateReq req);
/** /**
* 删除团队成员支持单个或批量删除 * 删除团队成员支持单个或批量删除
*/ */

View File

@ -262,15 +262,6 @@ public class EquipmentApprovalServiceImpl implements EquipmentApprovalService {
// 保存到数据库 // 保存到数据库
equipmentApprovalMapper.insert(entity); equipmentApprovalMapper.insert(entity);
// 更新设备采购状态 - 新增逻辑
try {
updateEquipmentProcurementStatus(req.getEquipmentId(), "PENDING_APPROVAL");
log.info("设备采购状态更新成功设备ID: {}", req.getEquipmentId());
} catch (Exception e) {
log.error("设备采购状态更新失败设备ID: {}", req.getEquipmentId(), e);
// 不抛出异常避免影响审批流程
}
// 发送通知 - 使用日志记录后续可以扩展为WebSocket通知 // 发送通知 - 使用日志记录后续可以扩展为WebSocket通知
log.info("采购申请提交成功,设备名称: {}, 申请人: {}", log.info("采购申请提交成功,设备名称: {}, 申请人: {}",
req.getEquipmentName(), getCurrentUserName()); req.getEquipmentName(), getCurrentUserName());
@ -289,33 +280,6 @@ public class EquipmentApprovalServiceImpl implements EquipmentApprovalService {
log.info("采购申请提交成功审批ID: {}", entity.getApprovalId()); log.info("采购申请提交成功审批ID: {}", entity.getApprovalId());
} }
/**
* 更新设备采购状态
*/
private void updateEquipmentProcurementStatus(String equipmentId, String status) {
if (equipmentId == null || equipmentId.trim().isEmpty()) {
log.warn("设备ID为空跳过状态更新");
return;
}
try {
log.info("准备更新设备采购状态设备ID: {}, 新状态: {}", equipmentId, status);
// 这里可以添加具体的更新逻辑
// 例如equipmentMapper.updateProcurementStatus(equipmentId, status);
// 由于循环依赖问题建议通过事件机制或异步处理来避免循环依赖
// 暂时记录日志后续可以通过以下方式实现
// 1. 使用Spring事件机制
// 2. 使用异步处理
// 3. 重构服务架构避免循环依赖
} catch (Exception e) {
log.error("更新设备采购状态失败设备ID: {}, 状态: {}", equipmentId, status, e);
throw e;
}
}
@Override @Override
public IPage<EquipmentApprovalResp> getMyProcurementApplications(EquipmentApprovalListReq req) { public IPage<EquipmentApprovalResp> getMyProcurementApplications(EquipmentApprovalListReq req) {
log.info("开始获取我的采购申请,请求参数: {}", req); log.info("开始获取我的采购申请,请求参数: {}", req);

View File

@ -1,6 +1,5 @@
package com.dite.znpt.service.impl; package com.dite.znpt.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -19,7 +18,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -190,14 +188,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
ProjectMemberEntity entity = new ProjectMemberEntity(); ProjectMemberEntity entity = new ProjectMemberEntity();
BeanUtil.copyProperties(req, entity); BeanUtil.copyProperties(req, entity);
// 设置创建和更新信息
String currentUserId = StpUtil.getLoginIdAsString();
LocalDateTime now = LocalDateTime.now();
entity.setCreateBy(currentUserId);
entity.setCreateTime(now);
entity.setUpdateBy(currentUserId);
entity.setUpdateTime(now);
// 保存到数据库 // 保存到数据库
this.save(entity); this.save(entity);
@ -218,85 +208,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
// 更新成员信息 // 更新成员信息
BeanUtil.copyProperties(req, existingMember); BeanUtil.copyProperties(req, existingMember);
// 设置更新信息
existingMember.setUpdateBy(StpUtil.getLoginIdAsString());
existingMember.setUpdateTime(LocalDateTime.now());
this.updateById(existingMember);
// 返回更新后的成员信息
return getTeamMemberById(memberId);
}
@Override
public ProjectMemberResp updateTeamMember(String memberId, TeamMemberUpdateReq req) {
// 验证成员是否存在
ProjectMemberEntity existingMember = this.getById(memberId);
if (existingMember == null) {
throw new ServiceException("项目成员不存在");
}
// 更新成员信息 - 只更新非空字段保留原有值
if (StrUtil.isNotBlank(req.getTurbineId())) {
existingMember.setTurbineId(req.getTurbineId());
}
if (StrUtil.isNotBlank(req.getTaskGroupId())) {
existingMember.setTaskGroupId(req.getTaskGroupId());
}
if (StrUtil.isNotBlank(req.getTaskId())) {
existingMember.setTaskId(req.getTaskId());
}
if (StrUtil.isNotBlank(req.getRoleType())) {
existingMember.setRoleType(req.getRoleType());
}
if (StrUtil.isNotBlank(req.getJobCode())) {
existingMember.setJobCode(req.getJobCode());
}
if (StrUtil.isNotBlank(req.getJobDesc())) {
existingMember.setJobDesc(req.getJobDesc());
}
if (req.getJoinDate() != null) {
existingMember.setJoinDate(req.getJoinDate());
}
if (req.getLeaveDate() != null) {
existingMember.setLeaveDate(req.getLeaveDate());
}
if (StrUtil.isNotBlank(req.getStatus())) {
existingMember.setStatus(req.getStatus());
}
if (StrUtil.isNotBlank(req.getRemark())) {
existingMember.setRemark(req.getRemark());
}
// 验证关联数据是否存在只验证非空字段
validateUpdateTeamMemberRequest(req, existingMember);
// 如果更新了用户信息电话或邮箱同时更新用户表
if (StrUtil.isNotBlank(req.getPhone()) || StrUtil.isNotBlank(req.getEmail())) {
UserEntity user = userService.getById(existingMember.getUserId());
if (user != null) {
boolean needUpdateUser = false;
if (StrUtil.isNotBlank(req.getPhone())) {
user.setMobile(req.getPhone());
needUpdateUser = true;
}
if (StrUtil.isNotBlank(req.getEmail())) {
user.setEmail(req.getEmail());
needUpdateUser = true;
}
if (needUpdateUser) {
user.setUpdateBy(StpUtil.getLoginIdAsString());
user.setUpdateTime(LocalDateTime.now());
userService.updateById(user);
}
}
}
// 设置更新信息
existingMember.setUpdateBy(StpUtil.getLoginIdAsString());
existingMember.setUpdateTime(LocalDateTime.now());
this.updateById(existingMember); this.updateById(existingMember);
// 返回更新后的成员信息 // 返回更新后的成员信息
@ -360,64 +271,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
} }
} }
/**
* 验证更新团队成员请求参数只验证非空字段
*/
private void validateUpdateTeamMemberRequest(TeamMemberReq req, ProjectMemberEntity existingMember) {
// 验证机组是否存在如果指定了机组
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("任务不存在");
}
}
}
/**
* 验证更新团队成员请求参数只验证非空字段
*/
private void validateUpdateTeamMemberRequest(TeamMemberUpdateReq req, ProjectMemberEntity existingMember) {
// 验证机组是否存在如果指定了机组
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获取成员信息 * 根据成员ID获取成员信息
*/ */
@ -433,17 +286,10 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
// 查询并返回单个成员信息 // 查询并返回单个成员信息
List<ProjectMemberResp> list = this.baseMapper.queryTeamMembers(query); List<ProjectMemberResp> list = this.baseMapper.queryTeamMembers(query);
ProjectMemberResp member = list.stream() return list.stream()
.filter(m -> m.getMemberId().equals(memberId)) .filter(member -> member.getMemberId().equals(memberId))
.findFirst() .findFirst()
.orElse(null); .orElse(null);
if (member != null) {
// 丰富成员信息
enrichMemberInfo(CollUtil.toList(member));
}
return member;
} }
// ========================== 项目看板相关方法实现 ========================== // ========================== 项目看板相关方法实现 ==========================
@ -454,15 +300,11 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
// 统计项目数量 // 统计项目数量
resp.setTotalProjectsCount(projectService.count()); resp.setTotalProjectsCount(projectService.count());
resp.setPendingProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 0).count()); // 未开工 resp.setPendingProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 0).count());
resp.setInProgressProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 1).count()); // 筹备中 resp.setInProgressProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 1).count());
resp.setCompletedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 2).count()); // 开工中 resp.setCompletedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 2).count());
resp.setAuditedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 3).count()); // 已审核 resp.setAuditedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 3).count());
resp.setAcceptedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 4).count()); // 已完工 resp.setAcceptedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 4).count());
// 新增状态统计
resp.setAcceptanceProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 5).count()); // 已验收
resp.setCollectionProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 6).count()); // 回款中
resp.setSettledProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 7).count()); // 已结算
// 统计机组数量 // 统计机组数量
resp.setTotalTurbineCount(turbineService.count()); resp.setTotalTurbineCount(turbineService.count());
@ -494,15 +336,11 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
ProjectKanbanDataResp resp = new ProjectKanbanDataResp(); ProjectKanbanDataResp resp = new ProjectKanbanDataResp();
// 获取各状态的项目列表 // 获取各状态的项目列表
resp.setPendingProjects(getProjectKanbanItems(0)); // 未开工 resp.setPendingProjects(getProjectKanbanItems(0));
resp.setInProgressProjects(getProjectKanbanItems(1)); // 筹备中 resp.setInProgressProjects(getProjectKanbanItems(1));
resp.setCompletedProjects(getProjectKanbanItems(2)); // 开工中 resp.setCompletedProjects(getProjectKanbanItems(2));
resp.setAuditedProjects(getProjectKanbanItems(3)); // 已审核 resp.setAuditedProjects(getProjectKanbanItems(3));
resp.setAcceptedProjects(getProjectKanbanItems(4)); // 已完工 resp.setAcceptedProjects(getProjectKanbanItems(4));
// 新增状态项目列表
resp.setAcceptanceProjects(getProjectKanbanItems(5)); // 已验收
resp.setCollectionProjects(getProjectKanbanItems(6)); // 回款中
resp.setSettledProjects(getProjectKanbanItems(7)); // 已结算
return resp; return resp;
} }

View File

@ -1,15 +1,12 @@
package com.dite.znpt.service.impl; package com.dite.znpt.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.constant.Message; import com.dite.znpt.constant.Message;
import com.dite.znpt.converts.Converts; import com.dite.znpt.converts.Converts;
import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.ProjectEntity;
import com.dite.znpt.domain.entity.ProjectTaskEntity;
import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.entity.UserEntity;
import com.dite.znpt.domain.vo.ProjectInitTaskReq;
import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListReq;
import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectListResp;
import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectReq;
@ -19,7 +16,6 @@ import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.ProjectMapper; import com.dite.znpt.mapper.ProjectMapper;
import com.dite.znpt.service.ProjectService; import com.dite.znpt.service.ProjectService;
import com.dite.znpt.service.UserService; import com.dite.znpt.service.UserService;
import com.dite.znpt.service.ProjectTaskService;
import com.dite.znpt.util.PageUtil; import com.dite.znpt.util.PageUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -44,9 +40,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, ProjectEntity
@Resource @Resource
private UserService userService; private UserService userService;
@Resource
private ProjectTaskService projectTaskService;
/** /**
* 功能描述查询项目信息列表 * 功能描述查询项目信息列表
* *
@ -135,11 +128,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, ProjectEntity
public void save(ProjectReq req) { public void save(ProjectReq req) {
ProjectEntity entity = Converts.INSTANCE.toProjectEntity(req); ProjectEntity entity = Converts.INSTANCE.toProjectEntity(req);
this.save(entity); this.save(entity);
for (ProjectInitTaskReq taskReq : req.getTasks()) {
ProjectTaskEntity taskEntity = BeanUtil.copyProperties(taskReq, ProjectTaskEntity.class);
taskEntity.setProjectId(entity.getProjectId());
projectTaskService.save(taskEntity);
}
} }
/** /**

View File

@ -45,7 +45,7 @@ public class ProjectMemberController {
@PutMapping("/team-member/{memberId}") @PutMapping("/team-member/{memberId}")
public Result<ProjectMemberResp> updateTeamMember( public Result<ProjectMemberResp> updateTeamMember(
@PathVariable String memberId, @PathVariable String memberId,
@RequestBody TeamMemberUpdateReq req) { @Valid @RequestBody TeamMemberReq req) {
return Result.ok(projectMemberService.updateTeamMember(memberId, req)); return Result.ok(projectMemberService.updateTeamMember(memberId, req));
} }