Estoy creando un diagrama de Gantt con dhtmlx-gantt que contiene tareas principales y secundarias.
Si se agrega una dependencia a una tarea en Padre A a Padre C, esto moverá el turno de la fecha de inicio a todas las tareas en Padre C, así
Así es como se estructuran mis datos
const tasks = [ { id: 'parent-a', text: 'Parent A', duration: null }, { id: 'child-a-1', text: 'Child 1', parent: 'Parent A', duration: 5 }, { id: 'child-a-2', text: 'Child 2', parent: 'Parent A', duration: 5 }, // ... ] const dependencies = [ { id: 1, source: 'child-a-1', target: 'child-a-2' }, { id: 1, source: 'parent-b', target: 'parent-c' }, // ... ]Para calcular la fecha de inicio de cada tarea, recorra cada tarea y establezca la fecha dinámicamente en función de la duración de la tarea
let startDate = new Date() tasks.forEach((task, i, array) => { const correspondingDependency = dependencies.find(d => d.id === task.id) if (correspondingDependency) { array[i].start_date = new Date(startDate.setDate(startDate.getDate() + duration)) } }) El problema con este método es que no actualizará ninguna fecha de start_date para tareas anteriores si se encuentra una dependencia al final de la matriz de dependencies (es decir, child-c-1 depende de child-a-3)
Siento que es posible que necesite usar la recursividad aquí, pero no estoy muy seguro. Espero que todo esto tenga sentido - cualquier ayuda es apreciada
Según tengo entendido, está desarrollando una lógica de planificación automática, similar a la programación automática que está disponible en las versiones pagas de dhtmlx Gantt.
FUI, trabajo para DHTMLX, que vende este producto, por lo que no puedo profundizar en cómo desarrollar una alternativa gratuita :) Pero creo que puedo darle algunas consideraciones generales.
Una vez que pueda representar sus datos en forma de gráfico, todo lo demás es realmente simple:
La parte desafiante es convertir su estructura de datos de la jerarquía padre-hijo de Gantt a la estructura plana de Directed Graph. Básicamente, significa que desea deshacerse de los proyectos en su conjunto de datos y convertir las relaciones que involucran proyectos con relaciones entre sus subtareas.
Puede sonar complicado al principio, pero el código será fácil de entender y de depurar.
Si limita el alcance de lo que está haciendo, por ejemplo, no permite relaciones entre proyectos, puede salirse con la suya con un enfoque más simple e intuitivo. Pero para una solución de propósito general, creo que el enfoque que describí es la apuesta más segura.
PD: si está implementando una programación automática similar a la de dhtmlxGantt ( https://docs.dhtmlx.com/gantt/desktop__auto_scheduling.html ) y si planea usarla comercialmente, podría valer la pena obtener una versión paga de dhtmlxGantt donde la programación automática está disponible de forma inmediata. La implementación de un algoritmo de programación automática confiable puede requerir mucho tiempo y esfuerzo, por lo que obtener una solución lista puede ser menos costoso que desarrollarla desde cero.