package com.designhub.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.designhub.common.Result; import com.designhub.dto.TaskAssignRequest; import com.designhub.dto.TaskAuditRequest; import com.designhub.entity.Task; import com.designhub.service.TaskService; import com.designhub.util.JwtUtil; import com.designhub.vo.DashboardStatsVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; /** * 任务管理控制器 */ @Slf4j @Tag(name = "任务管理", description = "任务的增删改查、抢单、审核等接口") @RestController @RequestMapping("/api/tasks") @RequiredArgsConstructor public class TaskController { private final TaskService taskService; private final JwtUtil jwtUtil; @Operation(summary = "创建任务", description = "发起新的设计任务") @PostMapping public Result createTask(@RequestBody Task task, @RequestHeader("Authorization") String authHeader) { log.info("创建任务: {}", task.getTitle()); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); task.setPublisherId(userId); Long taskId = taskService.createTask(task); return Result.success(taskId); } @Operation(summary = "创建流水线任务", description = "创建包含多个子任务的流水线任务") @PostMapping("/pipeline") public Result createPipelineTask( @RequestBody com.designhub.dto.PipelineTaskDTO dto, @RequestHeader("Authorization") String authHeader) { log.info("创建流水线任务: {}", dto.getTitle()); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); Long taskId = taskService.createPipelineTask(dto, userId); return Result.success("流水线任务创建成功", taskId); } @Operation(summary = "获取任务列表", description = "分页查询任务列表,支持多种筛选条件") @GetMapping public Result> getTaskList( @Parameter(description = "任务状态") @RequestParam(required = false) String status, @Parameter(description = "任务类型ID") @RequestParam(required = false) Long taskTypeId, @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { log.info("查询任务列表: status={}, taskTypeId={}, page={}, pageSize={}", status, taskTypeId, page, pageSize); IPage taskPage = taskService.getTaskList(page, pageSize, status, taskTypeId); return Result.success(taskPage); } @Operation(summary = "获取所有待审核任务", description = "获取所有处于审批流程中的任务(包括需求部门审核和接单部门审核)") @GetMapping("/pending-approval-all") public Result> getAllPendingApprovalTasks( @Parameter(description = "任务类型ID") @RequestParam(required = false) Long taskTypeId, @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { log.info("查询所有待审核任务: taskTypeId={}, page={}, pageSize={}", taskTypeId, page, pageSize); IPage taskPage = taskService.getAllPendingApprovalTasks(page, pageSize, taskTypeId); return Result.success(taskPage); } @Operation(summary = "获取任务详情", description = "根据任务ID获取详细信息") @GetMapping("/{id}") public Result getTaskById(@PathVariable Long id) { log.info("查询任务详情: {}", id); Task task = taskService.getTaskById(id); return Result.success(task); } @Operation(summary = "更新任务", description = "更新任务信息") @PutMapping("/{id}") public Result updateTask(@PathVariable Long id, @RequestBody Task task) { log.info("更新任务: {}", id); taskService.updateTask(id, task); return Result.success("更新成功"); } @Operation(summary = "抢单", description = "设计师抢单") @PostMapping("/{id}/grab") public Result grabTask(@PathVariable Long id, @RequestHeader("Authorization") String authHeader) { log.info("抢单: {}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); taskService.grabTask(id, userId); return Result.success("抢单成功"); } @Operation(summary = "提交任务", description = "设计师提交完成的任务") @PostMapping("/{id}/submit") public Result submitTask( @PathVariable Long id, @RequestParam String deliveryPath, @RequestHeader("Authorization") String authHeader) { log.info("提交任务: {}, 交付路径: {}", id, deliveryPath); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); taskService.submitTask(id, userId, deliveryPath); return Result.success("提交成功"); } @Operation(summary = "审核任务", description = "需求方审核任务") @PostMapping("/{id}/review") public Result reviewTask( @PathVariable Long id, @RequestParam Boolean approved, @RequestParam(required = false) String comment, @RequestParam(required = false) Integer rating, @RequestHeader("Authorization") String authHeader) { log.info("审核任务: {}, 通过: {}, 评分: {}", id, approved, rating); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); taskService.reviewTask(id, userId, approved, comment, rating); return Result.success(approved ? "审核通过" : "已驳回"); } @Operation(summary = "取消任务", description = "发布人取消任务") @PostMapping("/{id}/cancel") public Result cancelTask( @PathVariable Long id, @RequestParam String reason, @RequestHeader("Authorization") String authHeader) { log.info("取消任务: {}, 原因: {}", id, reason); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); taskService.cancelTask(id, userId, reason); return Result.success("取消成功"); } @Operation(summary = "获取已完成任务列表", description = "根据用户角色返回不同范围的已完成任务") @GetMapping("/completed") public Result> getCompletedTasks( @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "12") Integer pageSize, @Parameter(description = "关键词") @RequestParam(required = false) String keyword, @Parameter(description = "排序方式") @RequestParam(required = false) String sortBy, @RequestHeader("Authorization") String authHeader) { log.info("查询已完成任务: page={}, pageSize={}, keyword={}, sortBy={}", page, pageSize, keyword, sortBy); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); IPage taskPage = taskService.getCompletedTasks(page, pageSize, userId, keyword, sortBy); return Result.success(taskPage); } @Operation(summary = "任务大厅", description = "获取可接单的任务列表,支持多种筛选、搜索和排序") @GetMapping("/hall") public Result> getTaskHall( @Parameter(description = "任务类型ID") @RequestParam(required = false) Long taskTypeId, @Parameter(description = "需求类型ID") @RequestParam(required = false) Long demandTypeId, @Parameter(description = "品牌ID") @RequestParam(required = false) Long brandId, @Parameter(description = "类目ID") @RequestParam(required = false) Long categoryId, @Parameter(description = "平台ID") @RequestParam(required = false) Long platformId, @Parameter(description = "任务子类型") @RequestParam(required = false) String taskSubType, @Parameter(description = "最小积分") @RequestParam(required = false) Integer minScore, @Parameter(description = "最大积分") @RequestParam(required = false) Integer maxScore, @Parameter(description = "关键词搜索") @RequestParam(required = false) String keyword, @Parameter(description = "发布人姓名") @RequestParam(required = false) String publisherName, @Parameter(description = "发布时间范围:today/week/month") @RequestParam(required = false) String timeRange, @Parameter(description = "排序方式:latest/score/deadline/hot") @RequestParam(required = false) String sortBy, @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { log.info("查询任务大厅: taskTypeId={}, demandTypeId={}, brandId={}, categoryId={}, platformId={}, " + "taskSubType={}, minScore={}, maxScore={}, keyword={}, publisherName={}, timeRange={}, " + "sortBy={}, page={}, pageSize={}", taskTypeId, demandTypeId, brandId, categoryId, platformId, taskSubType, minScore, maxScore, keyword, publisherName, timeRange, sortBy, page, pageSize); IPage taskPage = taskService.getTaskHall(page, pageSize, taskTypeId, demandTypeId, brandId, categoryId, platformId, taskSubType, minScore, maxScore, keyword, publisherName, timeRange, sortBy); return Result.success(taskPage); } @Operation(summary = "我的任务", description = "获取当前用户的任务列表") @GetMapping("/my") public Result> getMyTasks( @RequestParam(required = false) String role, // publisher 或 receiver @RequestParam(required = false) String status, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer pageSize, @RequestHeader("Authorization") String authHeader) { log.info("查询我的任务: role={}, status={}, page={}, pageSize={}", role, status, 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); } else { taskPage = taskService.getMyReceivedTasks(page, pageSize, userId, status); } return Result.success(taskPage); } @Operation(summary = "提交任务审核", description = "任务发起人提交任务给部门负责人审核") @PostMapping("/{id}/submit-audit") public Result submitTaskForAudit( @PathVariable Long id, @RequestHeader("Authorization") String authHeader) { log.info("提交任务审核: taskId={}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.submitTaskForAudit(id, userId)); } @Operation(summary = "审核任务", description = "部门负责人审核任务(通过或驳回)") @PostMapping("/audit") public Result auditTask( @Valid @RequestBody TaskAuditRequest request, @RequestHeader("Authorization") String authHeader) { log.info("审核任务: request={}", request); String token = jwtUtil.extractTokenFromHeader(authHeader); Long auditorId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.auditTask(request, auditorId)); } @Operation(summary = "强制指派任务", description = "部门负责人强制指派任务给部门成员") @PostMapping("/assign") public Result assignTask( @Valid @RequestBody TaskAssignRequest request, @RequestHeader("Authorization") String authHeader) { log.info("强制指派任务: request={}", request); String token = jwtUtil.extractTokenFromHeader(authHeader); Long assignerId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.assignTask(request, assignerId)); } @Operation(summary = "负责人任务列表", description = "需求部门负责人查看部门内所有任务") @GetMapping("/leader/demand") public Result> getLeaderTaskList( @RequestParam(required = false) String auditStatus, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer pageSize, @RequestHeader("Authorization") String authHeader) { log.info("查询负责人任务列表: auditStatus={}, page={}, pageSize={}", auditStatus, page, pageSize); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.getLeaderTaskList(userId, page, pageSize, auditStatus)); } @Operation(summary = "接单部门负责人视图", description = "接单部门负责人查看部门成员接单明细") @GetMapping("/leader/receiving") public Result> getLeaderReceivingTaskList( @RequestParam(required = false) String status, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer pageSize, @RequestHeader("Authorization") String authHeader) { log.info("查询接单部门负责人视图: status={}, page={}, pageSize={}", status, page, pageSize); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.getLeaderReceivingTaskList(userId, page, pageSize, status)); } @Operation(summary = "获取工作台统计数据") @GetMapping("/dashboard/stats") public Result getDashboardStats( @Parameter(description = "月份,格式:YYYY-MM,不传则查询当月") @RequestParam(required = false) String month, @RequestHeader("Authorization") String authHeader) { String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); log.info("获取工作台统计数据: userId={}, month={}", userId, month); return Result.success(taskService.getDashboardStats(userId, month)); } @Operation(summary = "获取我的进行中任务") @GetMapping("/my-in-progress") public Result> getMyInProgressTasks(@RequestHeader("Authorization") String authHeader) { String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); return Result.success(taskService.getMyInProgressTasks(userId)); } @Operation(summary = "批量更新任务进度") @PostMapping("/batch-update-progress") public Result batchUpdateProgress( @RequestBody java.util.Map payload, @RequestHeader("Authorization") String authHeader) { String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); @SuppressWarnings("unchecked") java.util.List> updates = (java.util.List>) payload.get("updates"); taskService.batchUpdateProgress(userId, updates); return Result.success("进度更新成功"); } @Operation(summary = "更新任务进度", description = "接单人更新任务进度") @PostMapping("/{id}/progress") public Result updateTaskProgress( @PathVariable Long id, @RequestBody java.util.Map payload, @RequestHeader("Authorization") String authHeader) { log.info("更新任务进度: taskId={}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); Integer progress = (Integer) payload.get("progress"); if (progress == null) { return Result.error("进度值不能为空"); } taskService.updateTaskProgress(id, userId, progress); return Result.success("进度更新成功"); } @Operation(summary = "完结任务", description = "接单人完结任务并提交交付路径") @PostMapping("/{id}/complete") public Result completeTask( @PathVariable Long id, @RequestBody java.util.Map payload, @RequestHeader("Authorization") String authHeader) { log.info("完结任务: taskId={}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); String deliveryPath = payload.get("deliveryPath"); if (deliveryPath == null || deliveryPath.trim().isEmpty()) { return Result.error("交付路径不能为空"); } taskService.completeTask(id, userId, deliveryPath); return Result.success("任务已提交审核"); } @Operation(summary = "审核通过任务", description = "发起人或部门负责人审核通过任务") @PostMapping("/{id}/approve") public Result approveTask( @PathVariable Long id, @RequestHeader("Authorization") String authHeader) { log.info("审核通过任务: taskId={}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); taskService.approveTask(id, userId); return Result.success("审核通过"); } @Operation(summary = "驳回任务", description = "发起人或部门负责人驳回任务") @PostMapping("/{id}/reject") public Result rejectTask( @PathVariable Long id, @RequestBody java.util.Map payload, @RequestHeader("Authorization") String authHeader) { log.info("驳回任务: taskId={}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); String reason = payload.get("reason"); if (reason == null || reason.trim().isEmpty()) { return Result.error("驳回原因不能为空"); } taskService.rejectTask(id, userId, reason); return Result.success("任务已驳回"); } }