Fix bug: Refresh 'Global Progress' chart dinamically (no need to save project)
FEA: ItEr76S15OrganizingPerProjectDashboard
This commit is contained in:
parent
87d068a90b
commit
f80258f627
6 changed files with 36 additions and 54 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue