From 417281083f218ffbe40c4a55f1bbaa84c789d0ad Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 16 Jan 2026 13:26:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AD=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=8B=96=E6=8B=BD=E6=8E=92=E5=BA=8F=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=B8=BA=E6=AF=8F?= =?UTF-8?q?=E4=B8=AA=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E9=A1=B9=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=94=AF=E4=B8=80ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/CreateTask.vue | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index cab59c0..ea8eb4b 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -68,7 +68,7 @@
>({}) const dragIndex = ref(null) const dragOverIndex = ref(null) +// 生成唯一ID +const generateTaskTypeId = () => { + return `task-type-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` +} + // 表单数据 const formData = reactive({ title: '', isPipeline: true, // 固定为流水线任务 pipelineMode: 'sequential' as 'sequential' | 'parallel', // 固定为顺序流水线 - taskTypes: [{ taskTypeId: undefined, taskTypePath: undefined, quantity: 1, receiverId: undefined, selectedDeptId: undefined }] as TaskTypeItem[], // 任务类型数组 + taskTypes: [{ id: generateTaskTypeId(), taskTypeId: undefined, taskTypePath: undefined, quantity: 1, receiverId: undefined, selectedDeptId: undefined }] as TaskTypeItem[], // 任务类型数组 taskSubType: '', // 动态加载,初始为空 brandId: undefined, platformId: undefined, @@ -928,6 +934,7 @@ const getDesignersForItem = (item: TaskTypeItem) => { // 添加任务类型 const addTaskType = () => { formData.taskTypes.push({ + id: generateTaskTypeId(), taskTypeId: undefined, taskTypePath: undefined, quantity: 1, @@ -1012,8 +1019,12 @@ const handleDrop = (e: DragEvent, targetIndex: number) => { console.log('拖拽排序:', sourceIndex, '->', targetIndex) // 交换位置 - 使用 splice 原地修改数组以确保响应式更新 - const [removed] = formData.taskTypes.splice(sourceIndex, 1) - formData.taskTypes.splice(targetIndex, 0, removed) + const newTaskTypes = [...formData.taskTypes] + const [removed] = newTaskTypes.splice(sourceIndex, 1) + newTaskTypes.splice(targetIndex, 0, removed) + + // 直接替换整个数组以触发 Vue 的响应式更新 + formData.taskTypes = newTaskTypes // 重新计算积分(pipelineGroups 是 computed,会自动更新) calculateScore() @@ -1896,6 +1907,7 @@ const loadTaskForEdit = async (taskId: number) => { for (const detail of details) { taskTypeItems.push({ + id: generateTaskTypeId(), taskTypeId: detail.typeId, quantity: detail.quantity || 1, receiverId: detail.receiverId || subTask.receiverId, @@ -1906,6 +1918,7 @@ const loadTaskForEdit = async (taskId: number) => { console.warn('解析typeDetails失败:', e) // 解析失败时使用子任务的基本信息 taskTypeItems.push({ + id: generateTaskTypeId(), taskTypeId: subTask.taskTypeId, quantity: subTask.quantity || 1, receiverId: subTask.receiverId, @@ -1915,6 +1928,7 @@ const loadTaskForEdit = async (taskId: number) => { } else { // 没有typeDetails时使用子任务的基本信息 taskTypeItems.push({ + id: generateTaskTypeId(), taskTypeId: subTask.taskTypeId, quantity: subTask.quantity || 1, receiverId: subTask.receiverId,