feat: 为我的任务接口添加多维度筛选功能

- 后端:扩展 getMyPublishedTasks 支持 taskTypeId/brandId/categoryId/platformId/taskSubType/minScore/maxScore/timeRange/keyword 筛选
- 后端:扩展 getMyReceivedTasks 支持 taskTypeId/brandId/categoryId/platformId 筛选
- 后端:扩展 getMyDetailCompleterTasks 支持 taskTypeId/brandId/categoryId/platformId 筛选
- 后端:更新 Controller 接收所有筛选参数
- 前端:更新 MyTasksParams 接口添加筛选参数
- 前端:更新 loadPublishedTasks 传递完整筛选参数
This commit is contained in:
Your Name 2026-01-26 18:10:08 +08:00
parent 785248c5d7
commit 397f4b4040
4 changed files with 182 additions and 16 deletions

View File

@ -335,29 +335,42 @@ public class TaskController {
return Result.success(taskPage);
}
@Operation(summary = "我的任务", description = "获取当前用户的任务列表")
@Operation(summary = "我的任务", description = "获取当前用户的任务列表(支持多维度筛选)")
@GetMapping("/my")
public Result<IPage<Task>> 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<Task> 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);

View File

@ -1332,14 +1332,93 @@ public class TaskService {
}
/**
* 获取我发布的任务
* 获取我发布的任务(支持多维度筛选)
*/
public IPage<Task> getMyPublishedTasks(Integer page, Integer pageSize, Long userId, String status) {
public IPage<Task> 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<Task> pageParam = new Page<>(page, pageSize);
IPage<Task> taskPage = taskMapper.selectMyPublishedTasks(pageParam, userId, status);
// 填充子任务统计信息
// 构建查询条件
LambdaQueryWrapper<Task> 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<Task> taskPage = taskMapper.selectPage(pageParam, wrapper);
// 填充关联信息和子任务统计信息
for (Task task : taskPage.getRecords()) {
fillTaskRelatedInfo(task);
fillSubTaskStats(task);
}
@ -1347,14 +1426,51 @@ public class TaskService {
}
/**
* 获取我接收的任务
* 获取我接收的任务(支持多维度筛选)
*/
public IPage<Task> getMyReceivedTasks(Integer page, Integer pageSize, Long userId, String status) {
public IPage<Task> getMyReceivedTasks(Integer page, Integer pageSize, Long userId, String status,
Long taskTypeId, Long brandId, Long categoryId, Long platformId) {
Page<Task> pageParam = new Page<>(page, pageSize);
IPage<Task> taskPage = taskMapper.selectMyReceivedTasks(pageParam, userId, status);
// 填充子任务统计信息
// 构建查询条件
LambdaQueryWrapper<Task> 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<Task> taskPage = taskMapper.selectPage(pageParam, wrapper);
// 填充关联信息和子任务统计信息
for (Task task : taskPage.getRecords()) {
fillTaskRelatedInfo(task);
fillSubTaskStats(task);
}
@ -1362,10 +1478,11 @@ public class TaskService {
}
/**
* 获取我作为明细完善人的一级需求任务
* 获取我作为明细完善人的一级需求任务(支持多维度筛选)
* 需求部门成员完善任务明细后,可以在"进行中任务"看到这些任务
*/
public IPage<Task> getMyDetailCompleterTasks(Integer page, Integer pageSize, Long userId, String status) {
public IPage<Task> getMyDetailCompleterTasks(Integer page, Integer pageSize, Long userId, String status,
Long taskTypeId, Long brandId, Long categoryId, Long platformId) {
Page<Task> pageParam = new Page<>(page, pageSize);
LambdaQueryWrapper<Task> 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);

View File

@ -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
}
/**

View File

@ -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
})