//--------------------------------------------------------------------------------------------------
        // 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
예제 #3
0
        /// <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
예제 #5
0
        } // 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
예제 #6
0
        } // 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