diff --git a/backend/src/main/java/com/designhub/controller/TaskController.java b/backend/src/main/java/com/designhub/controller/TaskController.java index 38a466a..dd7f43c 100644 --- a/backend/src/main/java/com/designhub/controller/TaskController.java +++ b/backend/src/main/java/com/designhub/controller/TaskController.java @@ -335,29 +335,42 @@ public class TaskController { return Result.success(taskPage); } - @Operation(summary = "我的任务", description = "获取当前用户的任务列表") + @Operation(summary = "我的任务", description = "获取当前用户的任务列表(支持多维度筛选)") @GetMapping("/my") public Result> getMyTasks( @RequestParam(required = false) String role, // publisher、receiver 或 detail_completer @RequestParam(required = false) String status, + @RequestParam(required = false) Long taskTypeId, + @RequestParam(required = false) Long brandId, + @RequestParam(required = false) Long categoryId, + @RequestParam(required = false) Long platformId, + @RequestParam(required = false) String taskSubType, + @RequestParam(required = false) Integer minScore, + @RequestParam(required = false) Integer maxScore, + @RequestParam(required = false) String timeRange, + @RequestParam(required = false) String keyword, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer pageSize, @RequestHeader("Authorization") String authHeader) { - log.info("查询我的任务: role={}, status={}, page={}, pageSize={}", - role, status, page, pageSize); + log.info("查询我的任务: role={}, status={}, taskTypeId={}, brandId={}, categoryId={}, platformId={}, keyword={}, page={}, pageSize={}", + role, status, taskTypeId, brandId, categoryId, platformId, keyword, page, pageSize); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); IPage taskPage; if ("publisher".equals(role)) { - taskPage = taskService.getMyPublishedTasks(page, pageSize, userId, status); + taskPage = taskService.getMyPublishedTasks(page, pageSize, userId, status, + taskTypeId, brandId, categoryId, platformId, taskSubType, + minScore, maxScore, timeRange, keyword); } else if ("detail_completer".equals(role)) { // 查询用户作为明细完善人的一级需求任务 - taskPage = taskService.getMyDetailCompleterTasks(page, pageSize, userId, status); + taskPage = taskService.getMyDetailCompleterTasks(page, pageSize, userId, status, + taskTypeId, brandId, categoryId, platformId); } else { - taskPage = taskService.getMyReceivedTasks(page, pageSize, userId, status); + taskPage = taskService.getMyReceivedTasks(page, pageSize, userId, status, + taskTypeId, brandId, categoryId, platformId); } return Result.success(taskPage); diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index bbc87c1..33f305a 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1332,14 +1332,93 @@ public class TaskService { } /** - * 获取我发布的任务 + * 获取我发布的任务(支持多维度筛选) */ - public IPage getMyPublishedTasks(Integer page, Integer pageSize, Long userId, String status) { + public IPage getMyPublishedTasks(Integer page, Integer pageSize, Long userId, String status, + Long taskTypeId, Long brandId, Long categoryId, Long platformId, String taskSubType, + Integer minScore, Integer maxScore, String timeRange, String keyword) { Page pageParam = new Page<>(page, pageSize); - IPage taskPage = taskMapper.selectMyPublishedTasks(pageParam, userId, status); - // 填充子任务统计信息 + // 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.and(w -> w.eq(Task::getPublisherId, userId).or().eq(Task::getDetailCompleterId, userId)); + wrapper.eq(Task::getDeleted, 0); + + // 状态筛选 + if (StringUtils.hasText(status)) { + wrapper.eq(Task::getStatus, status); + } else { + wrapper.ne(Task::getStatus, "draft"); // 排除草稿 + } + + // 任务类型筛选 + if (taskTypeId != null) { + wrapper.eq(Task::getTaskTypeId, taskTypeId); + } + + // 品牌筛选 + if (brandId != null) { + wrapper.eq(Task::getBrandId, brandId); + } + + // 类目筛选 + if (categoryId != null) { + wrapper.eq(Task::getCategoryId, categoryId); + } + + // 平台筛选 + if (platformId != null) { + wrapper.eq(Task::getPlatformId, platformId); + } + + // 需求类型筛选 + if (StringUtils.hasText(taskSubType)) { + wrapper.eq(Task::getTaskSubType, taskSubType); + } + + // 积分范围筛选 + if (minScore != null) { + wrapper.ge(Task::getScore, minScore); + } + if (maxScore != null) { + wrapper.le(Task::getScore, maxScore); + } + + // 时间范围筛选 + if (StringUtils.hasText(timeRange)) { + LocalDateTime startTime = LocalDateTime.now(); + switch (timeRange) { + case "today": + startTime = LocalDateTime.now().toLocalDate().atStartOfDay(); + break; + case "week": + startTime = LocalDateTime.now().minusWeeks(1); + break; + case "month": + startTime = LocalDateTime.now().minusMonths(1); + break; + } + wrapper.ge(Task::getCreateTime, startTime); + } + + // 关键词筛选 + if (StringUtils.hasText(keyword)) { + wrapper.and(w -> w + .like(Task::getTitle, keyword) + .or() + .like(Task::getTaskNo, keyword) + .or() + .like(Task::getSpuInfo, keyword) + ); + } + + wrapper.orderByDesc(Task::getUpdateTime); + + IPage taskPage = taskMapper.selectPage(pageParam, wrapper); + + // 填充关联信息和子任务统计信息 for (Task task : taskPage.getRecords()) { + fillTaskRelatedInfo(task); fillSubTaskStats(task); } @@ -1347,14 +1426,51 @@ public class TaskService { } /** - * 获取我接收的任务 + * 获取我接收的任务(支持多维度筛选) */ - public IPage getMyReceivedTasks(Integer page, Integer pageSize, Long userId, String status) { + public IPage getMyReceivedTasks(Integer page, Integer pageSize, Long userId, String status, + Long taskTypeId, Long brandId, Long categoryId, Long platformId) { Page pageParam = new Page<>(page, pageSize); - IPage taskPage = taskMapper.selectMyReceivedTasks(pageParam, userId, status); - // 填充子任务统计信息 + // 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.and(w -> w.eq(Task::getReceiverId, userId).or().eq(Task::getDetailCompleterId, userId)); + wrapper.eq(Task::getDeleted, 0); + + // 状态筛选 + if (StringUtils.hasText(status)) { + wrapper.eq(Task::getStatus, status); + } else { + wrapper.ne(Task::getStatus, "draft"); // 排除草稿 + } + + // 任务类型筛选 + if (taskTypeId != null) { + wrapper.eq(Task::getTaskTypeId, taskTypeId); + } + + // 品牌筛选 + if (brandId != null) { + wrapper.eq(Task::getBrandId, brandId); + } + + // 类目筛选 + if (categoryId != null) { + wrapper.eq(Task::getCategoryId, categoryId); + } + + // 平台筛选 + if (platformId != null) { + wrapper.eq(Task::getPlatformId, platformId); + } + + wrapper.orderByDesc(Task::getCreateTime); + + IPage taskPage = taskMapper.selectPage(pageParam, wrapper); + + // 填充关联信息和子任务统计信息 for (Task task : taskPage.getRecords()) { + fillTaskRelatedInfo(task); fillSubTaskStats(task); } @@ -1362,10 +1478,11 @@ public class TaskService { } /** - * 获取我作为明细完善人的一级需求任务 + * 获取我作为明细完善人的一级需求任务(支持多维度筛选) * 需求部门成员完善任务明细后,可以在"进行中任务"看到这些任务 */ - public IPage getMyDetailCompleterTasks(Integer page, Integer pageSize, Long userId, String status) { + public IPage getMyDetailCompleterTasks(Integer page, Integer pageSize, Long userId, String status, + Long taskTypeId, Long brandId, Long categoryId, Long platformId) { Page pageParam = new Page<>(page, pageSize); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -1379,6 +1496,26 @@ public class TaskService { wrapper.eq(Task::getStatus, status); } + // 任务类型筛选 + if (taskTypeId != null) { + wrapper.eq(Task::getTaskTypeId, taskTypeId); + } + + // 品牌筛选 + if (brandId != null) { + wrapper.eq(Task::getBrandId, brandId); + } + + // 类目筛选 + if (categoryId != null) { + wrapper.eq(Task::getCategoryId, categoryId); + } + + // 平台筛选 + if (platformId != null) { + wrapper.eq(Task::getPlatformId, platformId); + } + // 按更新时间倒序 wrapper.orderByDesc(Task::getUpdateTime); diff --git a/frontend/src/api/task.ts b/frontend/src/api/task.ts index 6ee247e..41b8a54 100644 --- a/frontend/src/api/task.ts +++ b/frontend/src/api/task.ts @@ -181,6 +181,15 @@ export interface MyTasksParams { page?: number pageSize?: number keyword?: string + taskTypeId?: number + brandId?: number + categoryId?: number + platformId?: number + taskSubType?: string + minScore?: number + maxScore?: number + timeRange?: string + sortBy?: string } /** diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index aeffac2..077d407 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -4375,6 +4375,13 @@ const loadPublishedTasks = async (newFilters?: any) => { role: 'publisher', status: publishedFilters.status || undefined, keyword: publishedFilters.keyword || undefined, + taskTypeId: publishedFilters.taskTypeId || undefined, + brandId: publishedFilters.brandId || undefined, + categoryId: publishedFilters.categoryId || undefined, + platformId: publishedFilters.platformId || undefined, + timeRange: publishedFilters.timeRange || undefined, + minScore: publishedFilters.minScore || undefined, + maxScore: publishedFilters.maxScore || undefined, page: publishedPagination.page, pageSize: publishedPagination.pageSize })