diff --git a/track-uniapp/src/pages/scan/components/TreeCanvas.vue b/track-uniapp/src/pages/scan/components/TreeCanvas.vue index 222ccde..e83b9bd 100644 --- a/track-uniapp/src/pages/scan/components/TreeCanvas.vue +++ b/track-uniapp/src/pages/scan/components/TreeCanvas.vue @@ -66,8 +66,12 @@ export default { const layout = (tasks, parentRowIdx, parentX) => { if (!tasks || !tasks.length) return; tasks.forEach(t => { - // 判定:parent COMPLETED → 串行 Y+1;parent WIP/PENDING → 并行同Y偏右 - const isSerial = !t.parent_task_id || (this.taskStatusMap[t.parent_task_id] === 'COMPLETED'); + // 时间戳判定:子任务创建于父任务完成之后 → 串行(下一行);否则 → 并行(同Y偏右) + const parentNode = this.taskDataMap[t.parent_task_id]; + const isSerial = !t.parent_task_id || ( + parentNode && parentNode.completed_at && + new Date(t.created_at) > new Date(parentNode.completed_at) + ); const rowIdx = isSerial ? (parentRowIdx >= 0 ? parentRowIdx + 1 : rows.length) : parentRowIdx; while (rows.length <= rowIdx) rows.push({ y: 0, tasks: [] }); @@ -100,9 +104,9 @@ export default { return nodes; }, - taskStatusMap() { + taskDataMap() { const map = {}; - const walk = (tasks) => { if (!tasks) return; tasks.forEach(t => { map[t.id] = t.status; walk(t.child_tasks); }); }; + const walk = (tasks) => { if (!tasks) return; tasks.forEach(t => { map[t.id] = t; walk(t.child_tasks); }); }; if (this.product) walk(this.product.task_tree); return map; },