/// <summary> /// Method call to schedule manager about routed days in current range and adds received dates to dictionary /// </summary> /// <param name="startDate"></param> /// <param name="endDate"></param> private void _CreateNewDayStatuses(DateTime startDate, DateTime endDate) { List <DateTime> datesRange = _GetDaysFromRange(startDate, endDate); IList <DateTime> newRoutedDays = App.Current.Project.Schedules.SearchDaysWithBuiltRoutes(startDate, endDate); IList <DateTime> newDaysWithUnassignedOrders = App.Current.Project.Orders.SearchDaysWithOrders(startDate, endDate); List <KeyValuePair <DateTime, DayStatus> > listOfDayStatuses = _dayStatuses.ToList <KeyValuePair <DateTime, DayStatus> >(); listOfDayStatuses.Sort(new DayStatusesComparer()); foreach (DateTime date in datesRange) { if (newRoutedDays.Contains(date)) { _dayStatuses[date] = new DayStatus(BuildStatus.RoutesBuilt, null); } else if (newDaysWithUnassignedOrders.Contains(date)) { _dayStatuses[date] = new DayStatus(BuildStatus.HasUnassignedOrders, null); } else { _dayStatuses[date] = new DayStatus(BuildStatus.Empty, null); } } }
/// <summary> /// Method upfates day status. /// </summary> private void _UpdateDayStatus() { WorkingStatusHelper.SetBusy(null); if (_pendingDatesToUpdate.Count == 0) { return; } DateTime scheduleDate = _pendingDatesToUpdate[0]; _pendingDatesToUpdate.RemoveAt(0); BuildStatus status = new BuildStatus(); // If any solve operation is running on current date - define status as "Building". if (App.Current.Solver.GetAsyncOperations(scheduleDate).Count != 0) { status = BuildStatus.BuildingRoutes; } // If no solve operations running - define completed status by orders and routes collections of each schedule. else { status = _DefineCompletedStatus(scheduleDate); } DayStatus dayStatus = new DayStatus(status, null); _dayStatuses[scheduleDate] = dayStatus; // Raise event about status changed. if (DayStatusesChanged != null) { DayStatusesChanged(null, EventArgs.Empty); } WorkingStatusHelper.SetReleased(); }
/// <summary> /// Occurs when any solve operation started /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnAsyncSolveStarted(object sender, AsyncSolveStartedEventArgs e) { DateTime plannedDate = new DateTime(); AsyncOperationInfo info = null; Schedule schedule = null; if (App.Current.Solver.GetAsyncOperationInfo(e.OperationId, out info)) { schedule = info.Schedule; } if (schedule != null) { plannedDate = (DateTime)schedule.PlannedDate; } _dayStatuses[plannedDate] = new DayStatus(BuildStatus.BuildingRoutes, null); if (DayStatusesChanged != null) { DayStatusesChanged(null, EventArgs.Empty); } }
/// <summary> /// Method sets day's status to HasUnassignedOrders or Empty if no BuiltRoutes and Routing operations on this day /// </summary> /// <param name="date"></param> public void UpdateDayStatus(DateTime date) { if (_dayStatuses[date].Status == BuildStatus.RoutesBuilt || _dayStatuses[date].Status == BuildStatus.BuildingRoutes) { return; } else if (_dayStatuses[date].Status == BuildStatus.HasUnassignedOrders || _dayStatuses[date].Status == BuildStatus.Empty) { if (App.Current.Project.Orders.GetCount(date) > 0) { _dayStatuses[date] = new DayStatus(BuildStatus.HasUnassignedOrders, null); } else { _dayStatuses[date] = new DayStatus(BuildStatus.Empty, null); } } // raise event if (DayStatusesChanged != null) { DayStatusesChanged(null, EventArgs.Empty); } }
/// <summary> /// Occurs when saves completed /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Project_SavingChanges(object sender, ESRI.ArcLogistics.Data.SavingChangesEventArgs e) { IList <Order> orders; bool statusesChanged = false; // if orders was added if (e.AddedItems != null && e.AddedItems.Count > 0) { orders = _GetOrdersFromObjectsCollection(e.AddedItems); if (orders.Count > 0) { foreach (Order order in orders) { DateTime date = (DateTime)order.PlannedDate; if (_dayStatuses.ContainsKey(date)) { if (_dayStatuses[date].Status != BuildStatus.RoutesBuilt) { _dayStatuses[date] = new DayStatus(BuildStatus.HasUnassignedOrders, null); statusesChanged = true; } } else { _dayStatuses[date] = new DayStatus(BuildStatus.HasUnassignedOrders, null); statusesChanged = true; } } } } // if orders was removed else if (e.DeletedItems != null && e.DeletedItems.Count > 0) { orders = _GetOrdersFromObjectsCollection(e.DeletedItems); if (orders.Count > 0) { Dictionary <DateTime, IList <Order> > deletedOrders = _GetDatesWithDeletedOrders(orders); foreach (KeyValuePair <DateTime, IList <Order> > val in deletedOrders) { DateTime date = (DateTime)val.Key; Debug.Assert(_dayStatuses.ContainsKey(date)); if (_dayStatuses[date].Status == BuildStatus.HasUnassignedOrders) { int unassignedOrdersCount = App.Current.Project.Orders.GetCount(date); if (unassignedOrdersCount == ((IList <Order>)val.Value).Count) { _dayStatuses[date] = new DayStatus(BuildStatus.Empty, null); statusesChanged = true; } } } } } if (statusesChanged && DayStatusesChanged != null) { DayStatusesChanged(null, EventArgs.Empty); } }