From e7822faaca9e4b55a4be7306f703d762c4ce59d1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 15 Jan 2026 18:12:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AE=A1=E7=90=86=E5=91=98=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BC=96=E5=8F=B7=E5=88=A0=E9=99=A4=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/controller/TaskController.java | 24 ++++ .../com/designhub/service/TaskService.java | 39 +++++++ frontend/src/views/Settings.vue | 107 ++++++++++++++++++ 3 files changed, 170 insertions(+) diff --git a/backend/src/main/java/com/designhub/controller/TaskController.java b/backend/src/main/java/com/designhub/controller/TaskController.java index 683fa3c..a9e5850 100644 --- a/backend/src/main/java/com/designhub/controller/TaskController.java +++ b/backend/src/main/java/com/designhub/controller/TaskController.java @@ -464,5 +464,29 @@ public class TaskController { taskService.rejectTask(id, userId, reason); return Result.success("任务已驳回"); } + + @Operation(summary = "根据任务编号删除任务", description = "管理员根据任务编号删除任务及其所有子任务(仅管理员可用)") + @DeleteMapping("/by-task-no/{taskNo}") + public Result deleteTaskByTaskNo( + @PathVariable String taskNo, + @RequestHeader("Authorization") String authHeader) { + + log.info("根据任务编号删除任务: taskNo={}", taskNo); + String token = jwtUtil.extractTokenFromHeader(authHeader); + Long userId = jwtUtil.getUserIdFromToken(token); + + // 验证是否为管理员 + com.designhub.entity.User user = taskService.getUserById(userId); + if (user == null || user.getIsAdmin() != 1) { + return Result.error("权限不足,仅管理员可以删除任务"); + } + + try { + taskService.deleteTaskByTaskNo(taskNo); + return Result.success("任务删除成功"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 3418bf3..9576843 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -3335,5 +3335,44 @@ public class TaskService { collectChildDeptIds(child.getId(), result); } } + + /** + * 根据任务编号删除任务及其所有子任务 + * @param taskNo 任务编号 + */ + @Transactional + public void deleteTaskByTaskNo(String taskNo) { + log.info("根据任务编号删除任务: taskNo={}", taskNo); + + // 查找任务 + Task task = taskMapper.selectOne( + new LambdaQueryWrapper() + .eq(Task::getTaskNo, taskNo) + ); + + if (task == null) { + throw new RuntimeException("任务不存在,请检查任务编号是否正确"); + } + + Long taskId = task.getId(); + + // 1. 删除所有子任务 + int deletedItems = taskItemMapper.delete( + new LambdaQueryWrapper() + .eq(TaskItem::getTaskId, taskId) + ); + log.info("已删除 {} 个子任务", deletedItems); + + // 2. 删除主任务 + taskMapper.deleteById(taskId); + log.info("已删除主任务: taskNo={}, taskId={}", taskNo, taskId); + } + + /** + * 获取用户信息(供Controller调用) + */ + public User getUserById(Long userId) { + return userService.getUserById(userId); + } } diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue index 7d74788..7f9575f 100644 --- a/frontend/src/views/Settings.vue +++ b/frontend/src/views/Settings.vue @@ -1532,6 +1532,61 @@ + + +
+
+

任务数据管理

+
+ + + + + + + +
+ + 任务编号可以在任务卡片或任务详情中找到 +
+
+ + + + + 删除任务 + + + +
+
+
+
+
@@ -2433,6 +2488,7 @@ import { testConnection as testThirdPartyDbConnection, type ThirdPartyDbConfig } from '@/api/thirdPartyDb' +import { deleteTaskByTaskNo } from '@/api/task' import request from '@/utils/request' type LimitPeriod = 'DAILY' | 'WEEKLY' | 'MONTHLY' @@ -2565,6 +2621,35 @@ const s3ConfigColumns = [ { title: '操作', key: 'actions', width: 200 } ] +// 任务数据管理相关 +const taskDeleteForm = reactive({ + taskNo: '' +}) +const deletingTask = ref(false) + +// 删除任务 +const handleDeleteTask = async () => { + if (!taskDeleteForm.taskNo) { + message.warning('请输入任务编号') + return + } + + deletingTask.value = true + try { + const response = await deleteTaskByTaskNo(taskDeleteForm.taskNo.trim()) + if (response.code === 200) { + message.success('任务删除成功') + taskDeleteForm.taskNo = '' + } else { + message.error(response.message || '删除失败') + } + } catch (error: any) { + message.error(error.response?.data?.message || error.message || '删除失败') + } finally { + deletingTask.value = false + } +} + // 第三方数据库配置相关 const thirdPartyDbConfigs = ref([]) const loadingThirdPartyDb = ref(false) @@ -6525,6 +6610,28 @@ watch(activeTab, (value) => { } } } + +// 任务删除卡片样式 +.task-delete-card { + max-width: 600px; + background: rgba(0, 0, 0, 0.2) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + border-radius: 8px; + + :deep(.ant-card-head) { + background: transparent !important; + border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important; + + .ant-card-head-title { + color: rgba(255, 255, 255, 0.85); + font-weight: 500; + } + } + + :deep(.ant-card-body) { + background: transparent !important; + } +}