From 54438a99108bc00a2835c52dd75cac94e63fa0c6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 13:00:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A1.=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=B8=88=E5=8F=91=E9=80=81=E9=92=89=E9=92=89?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E9=80=9A=E7=9F=A5=202.=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA=E5=8F=AF=E6=9F=A5=E7=9C=8B=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=86=85=E6=89=80=E6=9C=89=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TaskItemController.java | 61 +++++++++++++++++-- .../com/designhub/mapper/TaskItemMapper.java | 20 ++++-- .../service/TaskApprovalService.java | 51 ++++++++++++++-- .../designhub/service/TaskItemService.java | 26 ++++++-- 4 files changed, 138 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/com/designhub/controller/TaskItemController.java b/backend/src/main/java/com/designhub/controller/TaskItemController.java index 7d6ed26..59578d3 100644 --- a/backend/src/main/java/com/designhub/controller/TaskItemController.java +++ b/backend/src/main/java/com/designhub/controller/TaskItemController.java @@ -5,6 +5,7 @@ import com.designhub.common.Result; import com.designhub.entity.TaskItem; import com.designhub.service.TaskItemService; import com.designhub.mapper.UserMapper; +import com.designhub.mapper.DepartmentMapper; import com.designhub.util.JwtUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -26,6 +27,7 @@ public class TaskItemController { private final TaskItemService taskItemService; private final UserMapper userMapper; + private final DepartmentMapper departmentMapper; private final JwtUtil jwtUtil; /** @@ -45,6 +47,9 @@ public class TaskItemController { /** * 获取进行中的子任务列表 + * - 管理员:看到所有进行中的子任务 + * - 部门负责人:看到本部门所有成员的子任务 + * - 普通设计师:只看自己的子任务 */ @Operation(summary = "获取进行中的子任务列表") @GetMapping("/in-progress") @@ -56,17 +61,41 @@ public class TaskItemController { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); - // 检查是否是管理员 com.designhub.entity.User user = userMapper.selectById(userId); boolean isAdmin = user != null && Integer.valueOf(1).equals(user.getIsAdmin()); - // 管理员可以看到所有进行中的子任务 - IPage items = taskItemService.getInProgressItems(page, pageSize, isAdmin ? null : userId); + // 检查用户是否是部门负责人 + boolean isDeptLeader = false; + Long userDeptId = null; + if (user != null && user.getDeptId() != null) { + userDeptId = user.getDeptId(); + // 查询该部门,检查当前用户是否是负责人 + com.designhub.entity.Department dept = departmentMapper.selectById(userDeptId); + if (dept != null && userId.equals(dept.getLeaderId())) { + isDeptLeader = true; + } + } + + IPage items; + if (isAdmin) { + // 管理员:看到所有进行中的子任务 + items = taskItemService.getInProgressItems(page, pageSize, null, null); + } else if (isDeptLeader) { + // 部门负责人:看到本部门所有成员的子任务 + items = taskItemService.getInProgressItems(page, pageSize, null, userDeptId); + } else { + // 普通设计师:只看自己的子任务 + items = taskItemService.getInProgressItems(page, pageSize, userId, null); + } + return Result.success(items); } /** * 获取已完成的子任务列表 + * - 管理员:看到所有已完成的子任务 + * - 部门负责人:看到本部门所有成员的子任务 + * - 普通设计师:只看自己的子任务 */ @Operation(summary = "获取已完成的子任务列表") @GetMapping("/completed") @@ -78,12 +107,32 @@ public class TaskItemController { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); - // 检查是否是管理员 com.designhub.entity.User user = userMapper.selectById(userId); boolean isAdmin = user != null && Integer.valueOf(1).equals(user.getIsAdmin()); - // 管理员可以看到所有已完成的子任务 - IPage items = taskItemService.getCompletedItems(page, pageSize, isAdmin ? null : userId); + // 检查用户是否是部门负责人 + boolean isDeptLeader = false; + Long userDeptId = null; + if (user != null && user.getDeptId() != null) { + userDeptId = user.getDeptId(); + com.designhub.entity.Department dept = departmentMapper.selectById(userDeptId); + if (dept != null && userId.equals(dept.getLeaderId())) { + isDeptLeader = true; + } + } + + IPage items; + if (isAdmin) { + // 管理员:看到所有已完成的子任务 + items = taskItemService.getCompletedItems(page, pageSize, null, null); + } else if (isDeptLeader) { + // 部门负责人:看到本部门所有成员的子任务 + items = taskItemService.getCompletedItems(page, pageSize, null, userDeptId); + } else { + // 普通设计师:只看自己的子任务 + items = taskItemService.getCompletedItems(page, pageSize, userId, null); + } + return Result.success(items); } diff --git a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java index c7b834a..37693b4 100644 --- a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java +++ b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java @@ -59,7 +59,9 @@ public interface TaskItemMapper extends BaseMapper { @Param("keyword") String keyword); /** - * 查询进行中的子任务列表(按接单人,null表示查询所有-管理员) + * 查询进行中的子任务列表 + * @param receiverId 接单人ID,null表示不按接单人过滤 + * @param deptId 部门ID,用于部门负责人查看本部门所有任务 */ @Select("") IPage selectInProgressItems(Page page, - @Param("receiverId") Long receiverId); + @Param("receiverId") Long receiverId, + @Param("deptId") Long deptId); /** - * 查询已完成的子任务列表(按接单人,null表示查询所有-管理员) + * 查询已完成的子任务列表 + * @param receiverId 接单人ID,null表示不按接单人过滤 + * @param deptId 部门ID,用于部门负责人查看本部门所有任务 */ @Select("") IPage selectCompletedItems(Page page, - @Param("receiverId") Long receiverId); + @Param("receiverId") Long receiverId, + @Param("deptId") Long deptId); /** * 根据任务ID查询所有子任务 diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index 853bbc0..6331e72 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -298,15 +298,55 @@ public class TaskApprovalService { } logApproval(taskId, approverId, 2, "approve", logComment); - // 发送钉钉群通知 + // 发送钉钉通知 if (assignedReceiverId != null) { - // 指定了设计师,发送群通知并@该设计师 - log.info("任务【{}】已指定给设计师,准备发送钉钉群通知", task.getTitle()); + // 指定了设计师,发送个人通知和群通知 + log.info("任务【{}】已指定给设计师,准备发送钉钉通知", task.getTitle()); try { com.designhub.entity.User receiver = userMapper.selectById(assignedReceiverId); String receiverName = receiver != null ? receiver.getRealName() : "未知"; String receiverPhone = receiver != null ? receiver.getPhone() : null; + // 1. 发送个人钉钉通知给设计师 + StringBuilder personalContent = new StringBuilder(); + personalContent.append("**任务名称**:").append(task.getTitle()).append(" \n"); + personalContent.append("**任务编号**:").append(task.getTaskNo()).append(" \n"); + personalContent.append("**任务积分**:").append(task.getScore()).append(" 分 \n"); + + if (task.getEstimatedHours() != null) { + int hours = task.getEstimatedHours().intValue(); + int days = hours / 8; + int remainingHours = hours % 8; + String timeStr = days > 0 ? (days + "天" + (remainingHours > 0 ? remainingHours + "小时" : "")) : (hours + "小时"); + personalContent.append("**时效要求**:").append(timeStr).append(" \n"); + } + + if (task.getBrandName() != null && !task.getBrandName().isEmpty()) { + personalContent.append("**品牌**:").append(task.getBrandName()).append(" \n"); + } + if (task.getPlatformName() != null && !task.getPlatformName().isEmpty()) { + personalContent.append("**平台**:").append(task.getPlatformName()).append(" \n"); + } + if (task.getSpuInfo() != null && !task.getSpuInfo().isEmpty()) { + personalContent.append("**SPU**:").append(task.getSpuInfo()).append(" \n"); + } + + if (task.getPublisherName() != null && !task.getPublisherName().isEmpty()) { + personalContent.append(" \n**发起人**:").append(task.getPublisherName()).append(" \n"); + } + + Notification notification = new Notification(); + notification.setReceiverId(assignedReceiverId); + notification.setTitle("您有新任务指派"); + notification.setContent(personalContent.toString()); + notification.setNotificationType("TASK_ASSIGNED"); + notification.setRelatedType("task"); + notification.setRelatedId(task.getId()); + notification.setPushDingtalk(1); // 推送到钉钉 + notificationService.sendNotification(notification); + log.info("任务指派个人通知已发送给设计师: userId={}", assignedReceiverId); + + // 2. 发送群通知并@指定的设计师 String title = "任务已指派"; StringBuilder content = new StringBuilder(); content.append("-------------------------------- \n"); @@ -328,16 +368,15 @@ public class TaskApprovalService { content.append(" \n"); content.append("-------------------------------- \n"); - content.append("请尽快处理!qd.yydd.ai \n"); + content.append("请尽快处理! \n"); content.append("--------------------------------"); - // 发送群通知并@指定的设计师 java.util.List atMobiles = receiverPhone != null ? java.util.Arrays.asList(receiverPhone) : null; dingTalkService.sendRobotMessage(title, content.toString(), atMobiles); log.info("任务指派群通知已发送,@手机号: {}", receiverPhone); } catch (Exception e) { - log.error("发送任务指派群通知失败", e); + log.error("发送任务指派通知失败", e); } } else { log.info("任务【{}】已发布到任务大厅,准备发送钉钉群通知", task.getTitle()); diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 49ad315..b02f2b5 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -48,18 +48,36 @@ public class TaskItemService { /** * 获取进行中的子任务列表 + * @param receiverId 接单人ID,null表示不按接单人过滤 + * @param deptId 部门ID,用于部门负责人查看本部门所有任务 + */ + public IPage getInProgressItems(Integer page, Integer pageSize, Long receiverId, Long deptId) { + Page pageParam = new Page<>(page, pageSize); + return taskItemMapper.selectInProgressItems(pageParam, receiverId, deptId); + } + + /** + * 获取进行中的子任务列表(向后兼容) */ public IPage getInProgressItems(Integer page, Integer pageSize, Long receiverId) { - Page pageParam = new Page<>(page, pageSize); - return taskItemMapper.selectInProgressItems(pageParam, receiverId); + return getInProgressItems(page, pageSize, receiverId, null); } /** * 获取已完成的子任务列表 + * @param receiverId 接单人ID,null表示不按接单人过滤 + * @param deptId 部门ID,用于部门负责人查看本部门所有任务 + */ + public IPage getCompletedItems(Integer page, Integer pageSize, Long receiverId, Long deptId) { + Page pageParam = new Page<>(page, pageSize); + return taskItemMapper.selectCompletedItems(pageParam, receiverId, deptId); + } + + /** + * 获取已完成的子任务列表(向后兼容) */ public IPage getCompletedItems(Integer page, Integer pageSize, Long receiverId) { - Page pageParam = new Page<>(page, pageSize); - return taskItemMapper.selectCompletedItems(pageParam, receiverId); + return getCompletedItems(page, pageSize, receiverId, null); } /**