//-------------------------------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------------------------------- #region Constructor /// <summary> /// Basic constructor /// </summary> /// <param name="name">String identifier of control unit</param> /// <param name="parentControlUnit">Parent control, either a department control or another organizational control</param> /// <param name="parentDepartmentControl">Parent department control</param> /// <param name="parentSimulationModel">Parent simulation model</param> /// <param name="inputData">Parent department input</param> public ContorlUnitAssessmentTreatmentExample(string name, ControlUnit parentControlUnit, ControlUnitHealthCareDepartment parentDepartmentControl, SimulationModel parentSimulationModel, IInputHealthCareDepartment inputData) : base(name, parentControlUnit, parentDepartmentControl, parentSimulationModel, inputData) { } // end of
//-------------------------------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------------------------------- #region Constructor /// <summary> /// Basic constructor /// </summary> /// <param name="name">String identifier of control unit</param> /// <param name="parentControlUnit">Parent control, either a department control or another organizational control</param> /// <param name="parentDepartmentControl">Parent department control</param> /// <param name="parentSimulationModel">Parent simulation model</param> /// <param name="inputData">Parent department input</param> public ControlUnitEmergencyRegisterTriage(string name, ControlUnit parentControlUnit, ControlUnitHealthCareDepartment parentDepartmentControl, SimulationModel parentSimulationModel, IInputHealthCareDepartment inputData) : base(name, parentControlUnit, parentDepartmentControl, parentSimulationModel, inputData) { } // end of
/// <summary> /// Basic constructor /// </summary> /// <param name="parentControl">Control unit where the staff change will occur</param> /// <param name="staffLeaving">Staff members that leave upon change</param> /// <param name="staffArriving">Staff members that arrive upon change</param> /// <param name="staffHandler">Staff handler that created event</param> public EventStaffChange(ControlUnitHealthCareDepartment parentControl, ResourceAssignmentStaff[] staffLeaving, ResourceAssignmentStaff[] staffArriving, IStaffHandling staffHandler) : base(EventType.Standalone, parentControl) { _parentDepartmentControl = parentControl; _staffAriving = staffArriving; _staffLeaving = staffLeaving; _allStaff = new List <ResourceAssignmentStaff>(staffLeaving); _allStaff.AddRange(staffArriving); _staffHandler = staffHandler; } // end of EventStaffChange
} // end of DrawHoldingEntity #endregion #region AdditionalStaticVisualization /// <summary> /// Creates the static visualization, draws all treatment facilities, waiting rooms and multiple patient /// treatment facilities for each structural area /// </summary> /// <param name="initializationTime">Time at which static visualization is generated</param> /// <param name="simModel">Simulation model for which the visuslization is generated</param> /// <param name="parentControlUnit">Control unit that is visualized</param> public override void AdditionalStaticVisualization(DateTime initializationTime, SimulationModel simModel, ControlUnit parentControlUnit) { ControlUnitHealthCareDepartment healthDepartmentControl = (ControlUnitHealthCareDepartment)parentControlUnit; foreach (StructuralArea structArea in healthDepartmentControl.StructuralAreas) { foreach (EntityTreatmentFacility treatFac in structArea.TreatmentFacilities) { DrawingObjectPerEntity(treatFac); } // end foreach foreach (EntityTreatmentFacility treatFac in structArea.MultiplePatientTreatmentFacilities) { DrawingObjectPerEntity(treatFac); } // end foreach foreach (EntityWaitingArea waitArea in structArea.WaitingAreasPatients) { DrawingObjectPerEntity(waitArea); } // end foreach DrawingObjectPerEntity(structArea.StaffWaitingRoom); } // end foreach } // end of AdditionalStaticVisualization
} // end of GetStartingStaff #endregion #region GetNextStaffChangingEvent /// <summary> /// Gets an event that represents actions for the next point in time /// where staffing levels change /// </summary> /// <param name="parentControl">Control for which the staff hanlder is called</param> /// <param name="time">Time for which the next event (in the future with respect to this time) is requested</param> /// <param name="timeToOccur">Out parameter to represent the time the next change will occur</param> /// <returns>An event that triggers the staff change</returns> public Event GetNextStaffChangingEvent(ControlUnitHealthCareDepartment parentControl, DateTime time, out DateTime timeToOccur) { timeToOccur = time; // look for change later on the same day List <TimeSpan> changesOfCurrentDay = SortedChangeTimesPerDay[time.DayOfWeek]; StaffChangingPoint closestChangingPoint = null; StaffChangingPoint pointOnNextDayWithSameTime = null; if (changesOfCurrentDay.Count > 0 && changesOfCurrentDay.Last() > time.TimeOfDay) { for (int i = 0; i < changesOfCurrentDay.Count; i++) { if (changesOfCurrentDay[i] > time.TimeOfDay) { closestChangingPoint = StaffChangingPerDayAndTime[time.DayOfWeek][changesOfCurrentDay[i]]; timeToOccur = time.Date + closestChangingPoint.TimeOfDay; break; } // end if } // end for // check if changing point was at end of day if (closestChangingPoint.TimeOfDay.Days == 1) { DayOfWeek nextDay = (time.Date + TimeSpan.FromDays(1)).DayOfWeek; //checking if there is a changing point at the beginning of the next day if (StaffChangingPerDayAndTime[nextDay].ContainsKey(TimeSpan.FromHours(0))) { pointOnNextDayWithSameTime = StaffChangingPerDayAndTime[nextDay][TimeSpan.FromHours(0)]; } // end if } // end if } else { DateTime nextTime = time.Date; while (closestChangingPoint == null) { nextTime += TimeSpan.FromDays(1); List <TimeSpan> changesOfNextDay = SortedChangeTimesPerDay[nextTime.DayOfWeek]; if (changesOfNextDay.Count > 0) { closestChangingPoint = StaffChangingPerDayAndTime[nextTime.DayOfWeek][changesOfNextDay.First()]; timeToOccur = nextTime + closestChangingPoint.TimeOfDay; } // end if } // end while } // end if List <ResourceAssignmentStaff> allStaffLeaving = new List <ResourceAssignmentStaff>(); List <ResourceAssignmentStaff> allStaffArriving = new List <ResourceAssignmentStaff>(); foreach (StaffAvailabilityPeriod period in closestChangingPoint.PeriodsEnding) { allStaffLeaving.AddRange(StaffPerPeriod[closestChangingPoint.DayOfWeek][period]); } // end foreach foreach (StaffAvailabilityPeriod period in closestChangingPoint.PeriodsStarting) { allStaffArriving.AddRange(StaffPerPeriod[closestChangingPoint.DayOfWeek][period]); } // end foreach // staff change on the beginning of next day if (pointOnNextDayWithSameTime != null) { foreach (StaffAvailabilityPeriod period in pointOnNextDayWithSameTime.PeriodsEnding) { allStaffLeaving.AddRange(StaffPerPeriod[pointOnNextDayWithSameTime.DayOfWeek][period]); } // end foreach foreach (StaffAvailabilityPeriod period in pointOnNextDayWithSameTime.PeriodsStarting) { allStaffArriving.AddRange(StaffPerPeriod[pointOnNextDayWithSameTime.DayOfWeek][period]); } // end foreach } // end if List <EntityHealthCareStaff> arrivingStaff = allStaffArriving.Select(p => p.Resource).ToList(); List <EntityHealthCareStaff> leavingStaff = allStaffLeaving.Select(p => p.Resource).ToList(); List <EntityHealthCareStaff> jointStaff = arrivingStaff.Where(p => leavingStaff.Contains(p)).ToList(); return(new EventStaffChange(parentControl, allStaffLeaving.Where(p => !jointStaff.Contains(p.Resource)).ToArray(), allStaffArriving.Where(p => !jointStaff.Contains(p.Resource)).ToArray(), this)); } // end of GetNextStaffChangingEvent
} // end of ParentDepartmentControl #endregion #region SetParentDepartmentControl /// <summary> /// Sets the parent department control /// </summary> /// <param name="parentDepartment"></param> public void SetParentDepartmentControl(ControlUnitHealthCareDepartment parentDepartment) { _parentDepartmentControl = parentDepartment; } // end of SetParentDepartmentControl