feat(task): 支持通过姓名更新任务执行人

- 新增 TaskUpdateRequest DTO 用于任务更新请求
- 修改 update 接口,支持通过执行人姓名自动匹配用户ID
- 增加对任务执行人姓名匹配失败的日志警告
- 保护敏感字段 createTime 和 deleted 不被更新
- 引入 SysUserMapper 用于根据姓名查询用户信息
This commit is contained in:
2026-03-31 17:14:07 +08:00
parent 92f5f9d256
commit b4f2ea2df2
2 changed files with 132 additions and 3 deletions

View File

@@ -3,12 +3,16 @@ package cn.yinlihupo.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.yinlihupo.common.core.BaseResponse;
import cn.yinlihupo.common.util.ResultUtils;
import cn.yinlihupo.domain.dto.TaskUpdateRequest;
import cn.yinlihupo.domain.entity.SysUser;
import cn.yinlihupo.domain.entity.Task;
import cn.yinlihupo.mapper.SysUserMapper;
import cn.yinlihupo.mapper.TaskMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
@@ -25,6 +29,7 @@ import java.util.Map;
public class TaskController {
private final TaskMapper taskMapper;
private final SysUserMapper sysUserMapper;
/**
* 分页查询任务列表
@@ -95,16 +100,31 @@ public class TaskController {
*/
@SaCheckPermission("project:task:update")
@PutMapping
public BaseResponse<Void> update(@RequestBody Task task) {
if (task.getId() == null) {
public BaseResponse<Void> update(@RequestBody TaskUpdateRequest request) {
if (request.getId() == null) {
return ResultUtils.error("任务ID不能为空");
}
Task exist = taskMapper.selectById(task.getId());
Task exist = taskMapper.selectById(request.getId());
if (exist == null || exist.getDeleted() == 1) {
return ResultUtils.error("任务不存在");
}
// 将DTO转换为实体
Task task = new Task();
BeanUtils.copyProperties(request, task);
// 如果传递了assigneeName根据姓名查询用户ID
if (StringUtils.hasText(request.getAssigneeName())) {
SysUser user = sysUserMapper.selectByRealName(request.getAssigneeName());
if (user != null) {
task.setAssigneeId(user.getId());
log.debug("任务执行人 '{}' 匹配到用户 ID: {}", request.getAssigneeName(), user.getId());
} else {
log.warn("任务执行人 '{}' 未在系统中找到匹配的用户", request.getAssigneeName());
}
}
// 不更新敏感字段
task.setCreateTime(null);
task.setDeleted(null);

View File

@@ -0,0 +1,109 @@
package cn.yinlihupo.domain.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 任务更新请求DTO
*/
@Data
public class TaskUpdateRequest {
/**
* 任务ID必填
*/
private Long id;
/**
* 所属里程碑ID
*/
private Long milestoneId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务描述
*/
private String description;
/**
* 任务类型
*/
private String taskType;
/**
* 执行人ID直接传递ID时使用
*/
private Long assigneeId;
/**
* 执行人姓名根据姓名自动匹配用户ID
*/
private String assigneeName;
/**
* 计划开始日期
*/
private LocalDate planStartDate;
/**
* 计划结束日期
*/
private LocalDate planEndDate;
/**
* 实际开始日期
*/
private LocalDate actualStartDate;
/**
* 实际结束日期
*/
private LocalDate actualEndDate;
/**
* 计划工时(小时)
*/
private BigDecimal planHours;
/**
* 实际工时(小时)
*/
private BigDecimal actualHours;
/**
* 进度百分比
*/
private Integer progress;
/**
* 优先级: critical-关键, high-高, medium-中, low-低
*/
private String priority;
/**
* 状态: pending-待开始, in_progress-进行中, completed-已完成, cancelled-已取消
*/
private String status;
/**
* 标签
*/
private List<String> tags;
/**
* 附件列表
*/
private List<Object> attachments;
/**
* 扩展数据
*/
private Object extraData;
}