From b4f2ea2df23d06a8fce56a2d928ad04cc6a176d0 Mon Sep 17 00:00:00 2001 From: JiaoTianBo Date: Tue, 31 Mar 2026 17:14:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E6=94=AF=E6=8C=81=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=A7=93=E5=90=8D=E6=9B=B4=E6=96=B0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 TaskUpdateRequest DTO 用于任务更新请求 - 修改 update 接口,支持通过执行人姓名自动匹配用户ID - 增加对任务执行人姓名匹配失败的日志警告 - 保护敏感字段 createTime 和 deleted 不被更新 - 引入 SysUserMapper 用于根据姓名查询用户信息 --- .../controller/project/TaskController.java | 26 ++++- .../domain/dto/TaskUpdateRequest.java | 109 ++++++++++++++++++ 2 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cn/yinlihupo/domain/dto/TaskUpdateRequest.java diff --git a/src/main/java/cn/yinlihupo/controller/project/TaskController.java b/src/main/java/cn/yinlihupo/controller/project/TaskController.java index 0f13f27..c7c0836 100644 --- a/src/main/java/cn/yinlihupo/controller/project/TaskController.java +++ b/src/main/java/cn/yinlihupo/controller/project/TaskController.java @@ -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 update(@RequestBody Task task) { - if (task.getId() == null) { + public BaseResponse 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); diff --git a/src/main/java/cn/yinlihupo/domain/dto/TaskUpdateRequest.java b/src/main/java/cn/yinlihupo/domain/dto/TaskUpdateRequest.java new file mode 100644 index 0000000..e0dd61a --- /dev/null +++ b/src/main/java/cn/yinlihupo/domain/dto/TaskUpdateRequest.java @@ -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 tags; + + /** + * 附件列表 + */ + private List attachments; + + /** + * 扩展数据 + */ + private Object extraData; +}