Fix bug: Refresh 'Global Progress' chart dinamically (no need to save project)

FEA: ItEr76S15OrganizingPerProjectDashboard
This commit is contained in:
Diego Pino 2012-05-27 21:24:04 +02:00
parent 87d068a90b
commit f80258f627
6 changed files with 36 additions and 54 deletions

View file

@ -29,6 +29,7 @@ import java.util.Set;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.planner.entities.TaskStatusEnum;
import org.libreplan.web.dashboard.DashboardModel.Interval;
import org.libreplan.web.planner.order.OrderPlanningController;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@ -72,8 +73,8 @@ public class DashboardController extends GenericForwardComposer {
super.doAfterCompose(comp);
}
public void setCurrentOrder(Order order) {
dashboardModel.setCurrentOrder(order);
public void setCurrentOrder(Order order, OrderPlanningController orderPlanningController) {
dashboardModel.setCurrentOrder(order, orderPlanningController);
if (dashboardModel.tasksAvailable()) {
if (self != null) {
renderGlobalProgress();

View file

@ -48,6 +48,7 @@ import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksEs
import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksLagInCompletionVisitor;
import org.libreplan.business.planner.entities.visitors.ResetTasksStatusVisitor;
import org.libreplan.business.workingday.EffortDuration;
import org.libreplan.web.planner.order.OrderPlanningController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
@ -80,6 +81,7 @@ public class DashboardModel implements IDashboardModel {
public static double LTC_STRETCHES_MAX_VALUE = 0;
private Order currentOrder;
private OrderPlanningController orderPlanningController;
private Integer taskCount = null;
private final Map<TaskStatusEnum, BigDecimal> taskStatusStats;
@ -95,10 +97,12 @@ public class DashboardModel implements IDashboardModel {
}
@Override
public void setCurrentOrder(Order order) {
public void setCurrentOrder(Order order, OrderPlanningController orderPlanningController) {
this.currentOrder = order;
this.orderPlanningController = orderPlanningController;
this.taskCount = null;
if (tasksAvailable()) {
this.calculateGlobalProgress();
this.calculateTaskStatusStatistics();
this.calculateTaskViolationStatusStatistics();
this.calculateAbsoluteMarginWithDeadLine();
@ -147,13 +151,18 @@ public class DashboardModel implements IDashboardModel {
}
/* Progress KPI: "Global Progress of the Project" */
@Override
public BigDecimal getAdvancePercentageByHours() {
TaskGroup rootTask = (TaskGroup) getRootTask();
private void calculateGlobalProgress() {
TaskGroup rootTask = getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask.getProgressAllByNumHours());
rootTask.updateCriticalPathProgress(orderPlanningController
.getCriticalPath());
}
@Override
public BigDecimal getAdvancePercentageByHours() {
return asPercentage(getRootTask().getProgressAllByNumHours());
}
private BigDecimal asPercentage(BigDecimal value) {
@ -163,49 +172,29 @@ public class DashboardModel implements IDashboardModel {
@Override
public BigDecimal getExpectedAdvancePercentageByHours() {
TaskGroup rootTask = (TaskGroup) getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask
return asPercentage(getRootTask()
.getTheoreticalProgressByNumHoursForAllTasksUntilNow());
}
@Override
public BigDecimal getCriticalPathProgressByNumHours() {
TaskGroup rootTask = (TaskGroup) getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask.getCriticalPathProgressByNumHours());
return asPercentage(getRootTask().getCriticalPathProgressByNumHours());
}
@Override
public BigDecimal getExpectedCriticalPathProgressByNumHours() {
TaskGroup rootTask = (TaskGroup) getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask
return asPercentage(getRootTask()
.getTheoreticalProgressByNumHoursForCriticalPathUntilNow());
}
@Override
public BigDecimal getCriticalPathProgressByDuration() {
TaskGroup rootTask = (TaskGroup) getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask.getCriticalPathProgressByDuration());
return asPercentage(getRootTask().getCriticalPathProgressByDuration());
}
@Override
public BigDecimal getExpectedCriticalPathProgressByDuration() {
TaskGroup rootTask = (TaskGroup) getRootTask();
if (rootTask == null) {
throw new RuntimeException("Root task is null");
}
return asPercentage(rootTask
return asPercentage(getRootTask()
.getTheoreticalProgressByDurationForCriticalPathUntilNow());
}
@ -223,7 +212,7 @@ public class DashboardModel implements IDashboardModel {
this.marginWithDeadLine = null;
return;
}
TaskElement rootTask = getRootTask();
TaskGroup rootTask = getRootTask();
Days orderDuration = Days.daysBetween(rootTask.getStartAsLocalDate(),
rootTask.getEndAsLocalDate());
@ -490,7 +479,7 @@ public class DashboardModel implements IDashboardModel {
}
}
private TaskElement getRootTask() {
private TaskGroup getRootTask() {
return currentOrder.getAssociatedTaskElement();
}

View file

@ -25,10 +25,11 @@ import java.util.Map;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.planner.entities.TaskStatusEnum;
import org.libreplan.web.dashboard.DashboardModel.Interval;
import org.libreplan.web.planner.order.OrderPlanningController;
interface IDashboardModel {
void setCurrentOrder(Order order);
void setCurrentOrder(Order order, OrderPlanningController orderPlanningController);
boolean tasksAvailable();

View file

@ -58,7 +58,6 @@ import org.libreplan.business.planner.entities.ICostCalculator;
import org.libreplan.business.planner.entities.IOrderEarnedValueCalculator;
import org.libreplan.business.planner.entities.IOrderResourceLoadCalculator;
import org.libreplan.business.planner.entities.TaskElement;
import org.libreplan.business.planner.entities.TaskGroup;
import org.libreplan.business.resources.entities.CriterionSatisfaction;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.business.scenarios.IScenarioManager;
@ -398,25 +397,11 @@ public class OrderPlanningModel implements IOrderPlanningModel {
// Calculate critical path progress, needed for 'Project global progress' chart in Dashboard view
planner.addGraphChangeListenersFromConfiguration(configuration);
updateCriticalPathProgress();
long overalProgressContentTime = System.currentTimeMillis();
PROFILING_LOG.info("overalProgressContent took: "
+ (System.currentTimeMillis() - overalProgressContentTime));
}
/**
* First time a project is loaded, it's needed to calculate the theoretical
* critical path progress and real critical path progress. These values are
* later updated whenever the project is saved
*/
private void updateCriticalPathProgress() {
if (planningState.isEmpty() || planner == null) {
return;
}
TaskGroup rootTask = planningState.getRootTask();
rootTask.updateCriticalPathProgress(planner.getCriticalPath());
}
private OrderEarnedValueChartFiller earnedValueChartFiller;
private void setupAdvanceAssignmentPlanningController(final Planner planner,

View file

@ -30,8 +30,8 @@ import org.libreplan.business.common.IOnTransaction;
import org.libreplan.business.common.Registry;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.web.dashboard.DashboardController;
import org.libreplan.web.planner.order.OrderPlanningController;
import org.libreplan.web.planner.order.PlanningStateCreator;
import org.libreplan.web.planner.order.PlanningStateCreator.IActionsOnRetrieval;
import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState;
import org.libreplan.web.planner.tabs.CreatedOnDemandTab.IComponentCreator;
import org.zkoss.ganttz.extensions.ITab;
@ -52,23 +52,27 @@ public class DashboardTabCreator {
public static ITab create(Mode mode,
PlanningStateCreator planningStateCreator,
DashboardController dashboardController,
OrderPlanningController orderPlanningController,
Component breadcrumbs) {
return new DashboardTabCreator(mode, planningStateCreator,
dashboardController, breadcrumbs).build();
dashboardController, orderPlanningController, breadcrumbs).build();
}
private final PlanningStateCreator planningStateCreator;
private final Mode mode;
private final DashboardController dashboardController;
private final OrderPlanningController orderPlanningController;
private final Component breadcrumbs;
private DashboardTabCreator(Mode mode,
PlanningStateCreator planningStateCreator,
DashboardController dashboardController,
OrderPlanningController orderPlanningController,
Component breadcrumbs) {
this.mode = mode;
this.planningStateCreator = planningStateCreator;
this.dashboardController = dashboardController;
this.orderPlanningController = orderPlanningController;
this.breadcrumbs = breadcrumbs;
}
@ -100,7 +104,8 @@ public class DashboardTabCreator {
protected void afterShowAction() {
PlanningState planningState = getPlanningState(mode.getOrder(), getDesktop());
Order currentOrder = planningState.getOrder();
dashboardController.setCurrentOrder(currentOrder);
dashboardController.setCurrentOrder(currentOrder,
orderPlanningController);
breadcrumbs.getChildren().clear();
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
breadcrumbs.appendChild(new Label(getSchedulingLabel()));
@ -117,6 +122,7 @@ public class DashboardTabCreator {
.getTransactionService();
return transactionService
.runOnTransaction(new IOnTransaction<PlanningState>() {
@Override
public PlanningState execute() {
return planningStateCreator.retrieveOrCreate(desktop,
order);

View file

@ -271,7 +271,7 @@ public class MultipleTabsPlannerController implements Composer,
}, parameters);
dashboardTab = DashboardTabCreator.create(mode, planningStateCreator,
dashboardController, breadcrumbs);
dashboardController, orderPlanningController, breadcrumbs);
final boolean isMontecarloVisible = isMonteCarloVisible();
if (isMontecarloVisible) {