diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java index 44fbf343d..f519a8cfb 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/GanttDiagramGraph.java @@ -2013,6 +2013,11 @@ public class GanttDiagramGraph> implements return adapter.getStartConstraintsFor(task); } + @Override + public List> getEndConstraintsFor(V task) { + return adapter.getEndConstraintsFor(task); + } + @Override public GanttDate getStartDate(V task) { return adapter.getStartDate(task); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java index e3d3e4414..119be6f08 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculator.java @@ -263,7 +263,7 @@ public class CriticalPathCalculator> { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( currentTask, task); - Constraint constraint = getDateConstraint(task); + Constraint constraint = getDateStartConstraint(task); switch (dependencyType) { case START_START: @@ -302,7 +302,7 @@ public class CriticalPathCalculator> { node.setEarliestStart(earliestStart); } - private Constraint getDateConstraint(T task) { + private Constraint getDateStartConstraint(T task) { if (task == null) { return null; } @@ -315,6 +315,19 @@ public class CriticalPathCalculator> { return Constraint.coalesce(constraints); } + private Constraint getDateEndConstraint(T task) { + if (task == null) { + return null; + } + + List> constraints = graph + .getEndConstraintsFor(task); + if (constraints == null) { + return null; + } + return Constraint.coalesce(constraints); + } + private void backward(Node currentNode, T nextTask) { T currentTask = currentNode.getTask(); int latestStart = currentNode.getLatestStart(); @@ -338,7 +351,7 @@ public class CriticalPathCalculator> { Node node = nodes.get(task); DependencyType dependencyType = getDependencyTypeEndStartByDefault( task, currentTask); - Constraint constraint = getDateConstraint(task); + Constraint constraint = getDateEndConstraint(task); switch (dependencyType) { case START_START: diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java index f465841ad..c0681a0f4 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/criticalpath/ICriticalPathCalculable.java @@ -59,6 +59,8 @@ public interface ICriticalPathCalculable { List> getStartConstraintsFor(T task); + List> getEndConstraintsFor(T task); + List getChildren(T task); } diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java index 829ba2ef8..8c3904e33 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/data/criticalpath/CriticalPathCalculatorTest.java @@ -2786,7 +2786,7 @@ public class CriticalPathCalculatorTest { @Test public void oneTaskWithTwoDependantTasksLastOneWithEqualConstraint2() { givenOneTaskWithTwoDependantTasksLastOneWithEqualConstraint(2, 5, 3, - START.plusDays(3)); + START.plusDays(4)); List criticalPath = buildCalculator() .calculateCriticalPath(diagramGraphExample);