package com.designhub.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.designhub.common.Result; import com.designhub.entity.TaskItem; import com.designhub.service.TaskItemService; import com.designhub.mapper.UserMapper; import com.designhub.util.JwtUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * 任务子项控制器(流水线任务) */ @Tag(name = "流水线任务管理", description = "流水线任务子项相关接口") @RestController @RequestMapping("/api/tasks/items") @RequiredArgsConstructor public class TaskItemController { private final TaskItemService taskItemService; private final UserMapper userMapper; private final JwtUtil jwtUtil; /** * 获取可接单的子任务列表 */ @Operation(summary = "获取可接单的子任务列表") @GetMapping("/available") public Result> getAvailableItems( @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "10") Integer pageSize, @Parameter(description = "任务类型ID") @RequestParam(required = false) Long taskTypeId, @Parameter(description = "搜索关键词") @RequestParam(required = false) String keyword) { IPage items = taskItemService.getAvailableItems(page, pageSize, taskTypeId, keyword); return Result.success(items); } /** * 获取进行中的子任务列表 */ @Operation(summary = "获取进行中的子任务列表") @GetMapping("/in-progress") public Result> getInProgressItems( @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "10") Integer pageSize, @RequestHeader("Authorization") String token) { 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); return Result.success(items); } /** * 获取已完成的子任务列表 */ @Operation(summary = "获取已完成的子任务列表") @GetMapping("/completed") public Result> getCompletedItems( @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "10") Integer pageSize, @RequestHeader("Authorization") String token) { 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); return Result.success(items); } /** * 根据主任务ID获取所有子任务 */ @Operation(summary = "根据主任务ID获取所有子任务") @GetMapping("/task/{taskId}") public Result> getItemsByTaskId( @Parameter(description = "主任务ID") @PathVariable Long taskId) { List items = taskItemService.getItemsByTaskId(taskId); return Result.success(items); } /** * 获取子任务详情 */ @Operation(summary = "获取子任务详情") @GetMapping("/{itemId}") public Result getItemById( @Parameter(description = "子任务ID") @PathVariable Long itemId) { TaskItem item = taskItemService.getItemById(itemId); return Result.success(item); } /** * 抢单子任务 */ @Operation(summary = "抢单子任务") @PostMapping("/{itemId}/grab") public Result grabItem( @Parameter(description = "子任务ID") @PathVariable Long itemId, @RequestHeader("Authorization") String token) { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); taskItemService.grabItem(itemId, userId); return Result.success("抢单成功"); } /** * 更新子任务进度 */ @Operation(summary = "更新子任务进度") @PostMapping("/{itemId}/progress") public Result updateProgress( @Parameter(description = "子任务ID") @PathVariable Long itemId, @Parameter(description = "进度(0-100)") @RequestParam Integer progress, @RequestHeader("Authorization") String token) { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); taskItemService.updateProgress(itemId, userId, progress); return Result.success("进度更新成功"); } /** * 完结子任务 */ @Operation(summary = "完结子任务") @PostMapping("/{itemId}/complete") public Result> completeItem( @Parameter(description = "子任务ID") @PathVariable Long itemId, @Parameter(description = "交付路径") @RequestBody Map request, @RequestHeader("Authorization") String token) { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); String deliveryPath = request.get("deliveryPath"); Map result = taskItemService.completeItem(itemId, userId, deliveryPath); return Result.success("子任务完成成功", result); } /** * 驳回子任务 */ @Operation(summary = "驳回子任务") @PostMapping("/{itemId}/reject") public Result rejectItem( @Parameter(description = "子任务ID") @PathVariable Long itemId, @Parameter(description = "驳回原因") @RequestBody Map request) { String reason = request.get("reason"); taskItemService.rejectItem(itemId, reason); return Result.success("子任务已驳回"); } /** * 获取主任务进度统计 */ @Operation(summary = "获取主任务进度统计") @GetMapping("/task/{taskId}/progress") public Result> getTaskProgress( @Parameter(description = "主任务ID") @PathVariable Long taskId) { Map progress = taskItemService.getTaskProgress(taskId); return Result.success(progress); } /** * 审核子任务组(接单部门负责人) */ @Operation(summary = "审核子任务组") @PostMapping("/groups/approve") public Result approveTaskItemGroup( @RequestBody Map request, @RequestHeader("Authorization") String token) { String actualToken = token.replace("Bearer ", ""); Long approverId = jwtUtil.getUserIdFromToken(actualToken); Long taskId = Long.valueOf(request.get("taskId").toString()); Integer groupNo = Integer.valueOf(request.get("groupNo").toString()); Long assignedReceiverId = request.get("assignedReceiverId") != null ? Long.valueOf(request.get("assignedReceiverId").toString()) : null; taskItemService.approveTaskItemGroup(taskId, groupNo, approverId, assignedReceiverId); return Result.success(assignedReceiverId != null ? "子任务组已指派" : "子任务组已发布到大厅"); } /** * 驳回子任务组 */ @Operation(summary = "驳回子任务组") @PostMapping("/groups/reject") public Result rejectTaskGroup( @RequestBody Map request, @RequestHeader("Authorization") String token) { String actualToken = token.replace("Bearer ", ""); Long rejectorId = jwtUtil.getUserIdFromToken(actualToken); Long taskId = Long.valueOf(request.get("taskId").toString()); Integer groupNo = Integer.valueOf(request.get("groupNo").toString()); String reason = (String) request.get("reason"); taskItemService.rejectTaskGroup(taskId, groupNo, rejectorId, reason); return Result.success("子任务组已驳回"); } /** * 获取待审核的子任务组列表 */ @Operation(summary = "获取待审核的子任务组列表") @GetMapping("/groups/pending-approval") public Result>> getPendingApprovalGroups( @Parameter(description = "部门ID") @RequestParam(required = false) Long deptId, @RequestHeader("Authorization") String token) { 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()); // 管理员可以看到所有待审核子任务组 if (isAdmin) { List> groups = taskItemService.getPendingApprovalGroups(null); return Result.success(groups); } // 如果没有提供部门ID,从用户信息中获取 if (deptId == null) { if (user == null || user.getDeptId() == null) { return Result.success(new java.util.ArrayList<>()); } deptId = user.getDeptId(); } List> groups = taskItemService.getPendingApprovalGroups(deptId); return Result.success(groups); } }