From 2f0ec3d6227436f29d9873b0f8d0ba12b738b64b Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 12 Jan 2026 16:09:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A2=AB=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E=E4=BB=BB=E5=8A=A1=E6=97=A0=E6=B3=95=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/controller/TaskController.java | 6 ++- .../java/com/designhub/mapper/TaskMapper.java | 4 +- .../com/designhub/service/TaskService.java | 26 ++++++++++- frontend/src/views/TaskHall.vue | 44 ++++++++++++++++--- 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/com/designhub/controller/TaskController.java b/backend/src/main/java/com/designhub/controller/TaskController.java index e5b9fb6..a264033 100644 --- a/backend/src/main/java/com/designhub/controller/TaskController.java +++ b/backend/src/main/java/com/designhub/controller/TaskController.java @@ -97,9 +97,11 @@ public class TaskController { @Operation(summary = "更新任务", description = "更新任务信息") @PutMapping("/{id}") - public Result updateTask(@PathVariable Long id, @RequestBody Task task) { + public Result updateTask(@PathVariable Long id, @RequestBody Task task, @RequestHeader("Authorization") String authHeader) { log.info("更新任务: {}", id); - taskService.updateTask(id, task); + String token = jwtUtil.extractTokenFromHeader(authHeader); + Long userId = jwtUtil.getUserIdFromToken(token); + taskService.updateTask(id, task, userId); return Result.success("更新成功"); } diff --git a/backend/src/main/java/com/designhub/mapper/TaskMapper.java b/backend/src/main/java/com/designhub/mapper/TaskMapper.java index c2e4864..60cc784 100644 --- a/backend/src/main/java/com/designhub/mapper/TaskMapper.java +++ b/backend/src/main/java/com/designhub/mapper/TaskMapper.java @@ -36,7 +36,7 @@ public interface TaskMapper extends BaseMapper { "LEFT JOIN category c ON t.category_id = c.id " + "LEFT JOIN platform p ON t.platform_id = p.id " + "LEFT JOIN sys_user approver ON t.current_approver_id = approver.id " + - "WHERE t.status = 'pending' AND t.release_type = 'recruitment' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" + + "WHERE t.status = 'pending' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" + " AND t.task_type_id = #{taskTypeId}" + " AND t.demand_type_id = #{demandTypeId}" + " AND t.brand_id = #{brandId}" + @@ -94,7 +94,7 @@ public interface TaskMapper extends BaseMapper { "LEFT JOIN category c ON t.category_id = c.id " + "LEFT JOIN platform p ON t.platform_id = p.id " + "LEFT JOIN sys_user approver ON t.current_approver_id = approver.id " + - "WHERE t.status = 'pending' AND t.release_type = 'recruitment' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" + + "WHERE t.status = 'pending' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" + "" + " AND t.task_type_id IN " + " " + diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index a7b90f0..aaa0f22 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1101,11 +1101,33 @@ public class TaskService { * 更新任务 */ @Transactional(rollbackFor = Exception.class) - public void updateTask(Long id, Task task) { + public void updateTask(Long id, Task task, Long userId) { Task existTask = getTaskById(id); - // TODO: 验证权限 + + // 验证权限:只有任务发布人才能更新任务 + boolean isAdmin = isAdminUser(userId); + if (!isAdmin && !userId.equals(existTask.getPublisherId())) { + throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人可以更新任务"); + } + + // 允许更新被驳回的任务(approvalStatus包含rejected或status为draft) + boolean isRejected = (existTask.getApprovalStatus() != null && + (existTask.getApprovalStatus().contains("rejected") || + "draft".equals(existTask.getApprovalStatus()))) || + "draft".equals(existTask.getStatus()); + task.setId(id); + + // 如果是被驳回的任务,更新后重置审核状态为draft,以便重新提交审核 + if (isRejected) { + task.setApprovalStatus("draft"); + task.setStatus("draft"); + task.setRejectReason(null); // 清空驳回原因 + } + taskMapper.updateById(task); + + log.info("任务更新成功: taskId={}, userId={}, isRejected={}", id, userId, isRejected); } /** diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index a26f490..a4451b6 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2984,10 +2984,35 @@ const loadTasks = async () => { return } - // 只加载子任务(可接单的任务都是子任务) - const itemResponse = await taskApi.getAvailableTaskItems(params) + // 同时加载普通任务和子任务(流水线任务) + const [taskResponse, itemResponse] = await Promise.all([ + taskApi.getTaskHall(params), + taskApi.getAvailableTaskItems(params) + ]) - if (itemResponse.code === 200) { + // 处理普通任务(非流水线任务) + if (taskResponse.code === 200 && taskResponse.data && taskResponse.data.records) { + const tasks = taskResponse.data.records.map((task: any) => ({ + ...task, + id: task.id, + taskNo: task.taskNo, + title: task.title, + isSubTask: false, // 普通任务标记为非子任务 + taskId: task.id, + taskTypeId: task.taskTypeId, + taskTypeName: task.taskTypeName, + taskSubType: task.taskSubType, + score: task.score, + estimatedHours: task.estimatedHours, + quantity: task.quantity || 1, + previewImage: task.previewImage, + description: task.remark || task.description + })) + allTasks = [...allTasks, ...tasks] + } + + // 处理子任务(流水线任务) + if (itemResponse.code === 200 && itemResponse.data && itemResponse.data.records) { const items = (itemResponse.data.records || []).map((item: any) => ({ ...item, id: item.id, @@ -2995,7 +3020,7 @@ const loadTasks = async () => { itemNo: item.itemNo, title: item.mainTaskTitle || item.taskTitle || item.title, subTaskNo: item.itemNo, - isSubTask: true, + isSubTask: true, // 子任务标记 taskId: item.taskId, groupNo: item.groupNo, taskTypeId: item.taskTypeId, @@ -3008,10 +3033,12 @@ const loadTasks = async () => { prevDownloadUrl: item.prevDownloadUrl, description: item.description || item.taskDescription })) - allTasks = items - totalCount = itemResponse.data.total || 0 + allTasks = [...allTasks, ...items] } + // 计算总数(普通任务 + 子任务) + totalCount = (taskResponse.data?.total || 0) + (itemResponse.data?.total || 0) + // 按创建时间排序 allTasks.sort((a, b) => { const timeA = new Date(a.createTime || 0).getTime() @@ -3019,7 +3046,10 @@ const loadTasks = async () => { return timeB - timeA // 降序 }) - taskList.value = allTasks + // 前端分页(因为合并了两个接口的结果,需要在前端分页) + const start = (pagination.page - 1) * pagination.pageSize + const end = start + pagination.pageSize + taskList.value = allTasks.slice(start, end) total.value = totalCount } catch (error) {