public SeatArrangement GetPlannedSeatArrangement(ISeat seat, DateTime watchPoint) { var result = default(SeatArrangement); var seatId = seat.Id.ToString(); //const int maxLayerCount = 1; var terms = Session.CreateQuery("from Term t where t.Seat =:seatId and t.Start <=:watchPoint order by t.End desc, t.Level desc") .SetString("seatId", seatId) .SetMaxResults(1) .SetDateTime("watchPoint", watchPoint) .List <Term>(); if (terms.Count > 0) { var term = terms[0]; var employeeId = term.GetSnapshotValue <Guid>("EmployeeId"); var source = default(Term); var startTime = default(DateTime); var watchPointIsInTheTerm = watchPoint.IsInTheRange(term); if (term is AssignmentBase) { if (!watchPointIsInTheTerm) { return(null); } //find upper term var upperLevelTerm = Session.CreateQuery("from Term t where t.Bottom is not null and t.Start <=:watchPoint and t.Start >=:parentStart and t.End <=:parentEnd and t.Seat is not null order by t.End desc, t.Level desc") .SetDateTime("parentStart", term.Start) .SetDateTime("parentEnd", term.End) .SetDateTime("watchPoint", watchPoint) .SetMaxResults(1) .UniqueResult <Term>(); if (upperLevelTerm == null || (upperLevelTerm.SeatIsEmpty() && upperLevelTerm.IsNeedSeat)) { source = term; startTime = term.Start; } else if (!upperLevelTerm.SeatIsEmpty() && upperLevelTerm.Seat != seatId) { return(null); } else if (upperLevelTerm.Seat == term.Seat && !upperLevelTerm.IsNeedSeat) { source = upperLevelTerm; startTime = upperLevelTerm.End; } } else { //subevnet if (term.IsNeedSeat) { if (watchPointIsInTheTerm) { source = term; startTime = term.Start; } else { return(null); } } else { if (watchPointIsInTheTerm) { return(null); } else { if (!watchPoint.IsInTheRange(term.Bottom)) { return(null); } else { source = term; startTime = term.End; } } } } if (source == null || startTime == default(DateTime)) { return(null); } result = new SeatArrangement(Session.Get <Employee>(employeeId), startTime, watchPoint, source, seat); } return(result); }
public List <SeatArrangementData> get_seat_arrangement(string pax_id, string trip_id) { var seatArrangement = new SeatArrangement(); return(seatArrangement.GetSeatArrangement(pax_id, trip_id)); }
public IEnumerable <TimeBox> ArrangeSeat(Entity site, int bufferLength, bool isMatchingRank, IgnoreAgentPriority agentPriorityMethodology, DateTime start, DateTime end, SeatingEngineStatus engineStatus) { _status = engineStatus; _isMatchingRank = isMatchingRank; _bufferLength = bufferLength; _employeeSeatOccupationRegister = new Dictionary <ISimpleEmployee, List <List <SeatArrangement> > >(); _employeeAssignmentRegister = new Dictionary <TimeBox, List <Fork> >(); _termOccupationRegister = new Dictionary <ISeatingTerm, List <List <SeatArrangement> > >(); IEnumerable <List <SeatArrangement> > occupationList; IEnumerable <ISeat> seatList; #region StatusMessage int temp1 = 0; int[] occupationData; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineGeatherInfo", DateTime.Now); #endregion #region // Prepare Data // var getSeat = new Func <string, Seat>(seat => _seatBoxSet.ContainsKey(seat) ? _seatBoxSet[seat].Seat : default(Seat)); var addSeatArrangement = new Func <string, SeatArrangement, bool>( (seat, seatArrangement) => _seatBoxSet[seat].AddOccupation(seatArrangement)); foreach (var timeBox in _agentsOnSeat) { timeBox.GetAllTerm <Term>(start, end).GenSeatArrangements(timeBox.Agent, getSeat, addSeatArrangement); } foreach (var timeBox in _participaters) { var filteredTerms = timeBox.GetAllTermWithoutOffWork <Term>(start, end, o => { return(o.GetLowestTerm().If <ISeatingTerm>(x => x.ArrangeSeatYet() && x.StartIsCoverd(start, end))); }).ToArray(); timeBox.GetAllTerm <Term>(start, end).GenSeatArrangements(timeBox.Agent, getSeat, addSeatArrangement); var prv = default(Term); var seatArrangementGroup = new List <SeatArrangement>(); var occupationGroup = new List <List <SeatArrangement> >(); Action finalStep = () => { }; var agent = timeBox.Agent; filteredTerms.SliceOccupied((dateRange, term) => { if (term == null || !term.IsNeedSeat) { prv = term; return(default(SeatArrangement)); } if (prv != null && !ReferenceEquals(prv, term) && prv.Level == 0 && term.Level == 0) { prv = null; } var source = default(Term); TermExt.X(prv, term, ref source); var instance = default(SeatArrangement); if (source.If(o => o.SeatIsEmpty()) == true) { instance = new SeatArrangement(source, agent, dateRange.Start, dateRange.End) { Remark = "ByEngine" }; var isOccupiedUnlaoredSubevent = new Func <Term, bool>(o => o.GetIsNeedSeatField() && o is UnlaboredSubEvent); if (isOccupiedUnlaoredSubevent(source) || (source.Level > 1 && source.SeatIsEmpty() && isOccupiedUnlaoredSubevent(source.Bottom))) { seatArrangementGroup.Add(instance); } else { var key = (Term)term.GetLowestTerm(); if (!_termOccupationRegister.ContainsKey(key)) { _termOccupationRegister[key] = new List <List <SeatArrangement> >(); } _termOccupationRegister[key].Add(seatArrangementGroup); if (seatArrangementGroup.Count > 0) { occupationGroup.Add(seatArrangementGroup); } if (term is IAssignment) { _status.AssignmentAmount += 1; } seatArrangementGroup = new List <SeatArrangement>(new[] { instance }); finalStep = () => { _termOccupationRegister[key].Add(seatArrangementGroup); occupationGroup.Add(seatArrangementGroup); }; } } prv = term; return(instance); }, t => t.IsNeedSeat); finalStep(); _employeeSeatOccupationRegister.Add(timeBox.Agent, occupationGroup); _employeeAssignmentRegister.Add(timeBox, filteredTerms.GetFork()); } //TODO: load exist occupations _seatOccupationRegister = _seatBoxSet.Values .ToDictionary(o => o.Seat as ISeatingSeat, o => o.Occupations.ToList()); #region StatusMessage _status.EmployeeAmount = _employeeAssignmentRegister.Count; //foreach (List<Fork> fkList in _employeeAssignmentRegister.Values) // temp1 += fkList.Count; //_status.AssignmentAmount = 0; temp1 = 0; foreach (List <List <SeatArrangement> > soList in _employeeSeatOccupationRegister.Values) { foreach (List <SeatArrangement> sooList in soList) { temp1 += sooList.Count; } } _status.SeatArrangementAmount = temp1; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineStartSeating", DateTime.Now); #endregion #endregion #region // Consolidation Rule Active // foreach (var consolidationRule in _seatConsolidationRepository.GetByStie(site)) { if (!_seatsMap.Keys.Contains(consolidationRule.TargetSeat.Area)) { continue; } seatList = GetSeatByRule(consolidationRule, _seatsMap[consolidationRule.TargetSeat.Area], true); occupationList = GetOccupationByConsolidationRule(consolidationRule); foreach (var seat in seatList) { foreach (var seatArrangement in occupationList) { SetOccupationSeat(seatArrangement, seat); } } } // debug //Console.WriteLine("============================="); // debug #region StatusMessage _status.Process = 0.25; occupationData = getState(); _status.Stage1ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage1ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage1ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += String.Format("{0} : EngineConsolidationFinish", DateTime.Now); #endregion #endregion #region // Seat Priority Employee Active // int priorityEmployeeIndexMax = Math.Min(4 - (int)agentPriorityMethodology, 3); for (int priorityEmployeeIndex = 0; priorityEmployeeIndex < priorityEmployeeIndexMax; priorityEmployeeIndex++) { foreach (var item in _priorityEmployeeSet) { var priorityEmployeeConut = item.Value.Count; if (priorityEmployeeIndex >= priorityEmployeeConut) { continue; } occupationList = GetOccupationByEmployee(item.Value[priorityEmployeeIndex].Object); foreach (List <SeatArrangement> iso in occupationList) { SetOccupationSeat(iso, item.Key); } } #region StatusMessage _status.Process = 0.25 + 0.25 * priorityEmployeeIndex / 3; occupationData = getState(); _status.Stage2ArrangedAmount[priorityEmployeeIndex] = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage2ArrangedPercentage[priorityEmployeeIndex] = 100 * (double)_status.Stage2ArrangedAmount[priorityEmployeeIndex] / (double)_status.SeatArrangementAmount; //_status.Stage2ArrangedAmount = _status.Stage2ArrangedAmount; //_status.Stage2ArrangedPercentage = _status.Stage2ArrangedPercentage; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EnginePriorityEmployee {1} Finish", DateTime.Now, priorityEmployeeIndex); #endregion } #endregion #region // Seat Priority Organization Active // foreach (var area in _seatsMap) { foreach (var seat in area.Value) { if (seat.PriorityOrganization == null) { continue; } //var seatRank = seat.Rank; occupationList = GetOccupationByOrganization(seat.PriorityOrganization, rank => true, skills => true, o => true); foreach (List <SeatArrangement> occupation in occupationList) { SetOccupationSeat(occupation, seat); } } } #region StatusMessage _status.Process = 0.75; occupationData = getState(); _status.Stage3ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage3ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage3ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EnginePriorityOrgFinish", DateTime.Now); #endregion #endregion #region // Area Priority Organization Active // OrganizationSeatingArea organizationSeatingRule; int priorityOrganizationIndexMax = _organizationSeatingAreaSet.Values.Max(o => o.Length); for (int index = 0; index < priorityOrganizationIndexMax; index++) { foreach (var item in _organizationSeatingAreaSet.OrderBy(o => o.Key.SaftyGetProperty <int, IIndexable>(i => i.Index))) { if (index >= item.Value.Length) { continue; } organizationSeatingRule = item.Value[index]; seatList = GetSeatByRule(organizationSeatingRule, _seatsMap[item.Key], false); occupationList = GetOccupationByOrganization(organizationSeatingRule.Object, rank => true, skill => true, o => true); foreach (var seat in seatList) { //var seatRank = seat.Rank; foreach (List <SeatArrangement> iso in occupationList) { SetOccupationSeat(iso, seat); } } } } #endregion #region // Clear Partial Assignment and ReAssign AssignmentWise // //foreach (var kvp in _termOccupationRegister) //{ // if (CheckAssignmentState(kvp.Key) == AssignmentSeatingState.Partial) // { // foreach (var iso in kvp.Value) // { // if (iso.Seat != default(ISeat)) // { // _seatOccupationRegister[iso.Seat].Remove(iso); // iso.Seat = default(ISeat); // } // } // } //} //for (int index = 0; index < priorityOrganizationIndexMax; index++) //{ // foreach (var item in _seatsMap) // { // var area = item.Key; // if (index >= _organizationSeatingAreaSet[area].Length) // continue; // var orderedServiceOrganizations = _organizationSeatingAreaSet[area]; // organizationSeatingRule = orderedServiceOrganizations[index]; // // try arrange Assignment-wise // foreach (ISeatingTerm isa in GetAssignmentByOrganization(organizationSeatingRule.Object, rank => true)) // { // var seatArrangementList = _termOccupationRegister.ContainsKey(isa) ? _termOccupationRegister[isa] : null; // if (seatArrangementList == null) // continue; // bool isAssignmentSuccess = true; // foreach (var iso in seatArrangementList) // { // bool isOccupationSuccess = false; // seatList = GetSeatByRule(organizationSeatingRule, item.Value, false); // foreach (var iss in seatList.Where(st => _isMatchingRank ? st.Rank <= iso.Agent.Rank : true)) // { // if (SetOccupationSeat(iso, iss)) // { // isOccupationSuccess = true; // break; // } // } // if (!isOccupationSuccess) // { // isAssignmentSuccess = false; // break; // } // } // // fail to Arrange Whole Assignment cancel Assignment // if (!isAssignmentSuccess) // { // foreach (SeatArrangement iso in seatArrangementList) // { // if (iso.Seat != default(ISeat)) // { // _seatOccupationRegister[iso.Seat].Remove(iso); // iso.Seat = default(ISeat); // } // } // } // } // } //} #endregion #region StatusMessage _status.Process = 1; occupationData = getState(); _status.Stage4ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage4ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage4ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.SeatUsageRate = GetSeatUsageRate((end - start).TotalMinutes); _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineAreaOrgFinsish", DateTime.Now); #endregion foreach (var kvp in _termOccupationRegister) { foreach (var arrangementList in kvp.Value) { foreach (var arrangement in arrangementList.Where(o => o.Seat != null)) { _seatBoxSet[arrangement.Seat.Id.ToString()].AddOccupation(arrangement); } } } //foreach (var kvp in _termOccupationRegister) //{ // var assignment = ((AssignmentBase)kvp.Key); // AssignmentSeatingState checkState = CheckAssignmentState(assignment); // if (checkState == AssignmentSeatingState.Empty) // { // assignment.OccupyStatus = "W"; // } // else if (checkState == AssignmentSeatingState.Full) // { // assignment.OccupyStatus = "C"; // } // else if (checkState == AssignmentSeatingState.FullButSeprate) // { // assignment.OccupyStatus = "S"; // } // else // { // //throw new Exception("SeatingEngine inner exception: There is partial assignment in result."); // } //} //_timeBoxRepository.Clear(); return(_employeeAssignmentRegister.Keys); }
public IEnumerable<TimeBox> ArrangeSeat(Entity site, int bufferLength, bool isMatchingRank, IgnoreAgentPriority agentPriorityMethodology, DateTime start, DateTime end, SeatingEngineStatus engineStatus) { _status = engineStatus; _isMatchingRank = isMatchingRank; _bufferLength = bufferLength; _employeeSeatOccupationRegister = new Dictionary<ISimpleEmployee, List<List<SeatArrangement>>>(); _employeeAssignmentRegister = new Dictionary<TimeBox, List<Fork>>(); _termOccupationRegister = new Dictionary<ISeatingTerm, List<List<SeatArrangement>>>(); IEnumerable<List<SeatArrangement>> occupationList; IEnumerable<ISeat> seatList; #region StatusMessage int temp1 = 0; int[] occupationData; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineGeatherInfo", DateTime.Now); #endregion #region // Prepare Data // var getSeat = new Func<string, Seat>(seat => _seatBoxSet.ContainsKey(seat) ? _seatBoxSet[seat].Seat : default(Seat)); var addSeatArrangement = new Func<string, SeatArrangement, bool>( (seat, seatArrangement) => _seatBoxSet[seat].AddOccupation(seatArrangement)); foreach (var timeBox in _agentsOnSeat) timeBox.GetAllTerm<Term>(start, end).GenSeatArrangements(timeBox.Agent, getSeat, addSeatArrangement); foreach (var timeBox in _participaters) { var filteredTerms = timeBox.GetAllTermWithoutOffWork<Term>(start, end, o => { return o.GetLowestTerm().If<ISeatingTerm>(x=> x.ArrangeSeatYet() && x.StartIsCoverd(start, end)); }).ToArray(); timeBox.GetAllTerm<Term>(start, end).GenSeatArrangements(timeBox.Agent, getSeat, addSeatArrangement); var prv = default(Term); var seatArrangementGroup = new List<SeatArrangement>(); var occupationGroup = new List<List<SeatArrangement>>(); Action finalStep = () => { }; var agent = timeBox.Agent; filteredTerms.SliceOccupied((dateRange, term) => { if (term == null || !term.IsNeedSeat) { prv = term; return default(SeatArrangement); } if (prv != null && !ReferenceEquals(prv, term) && prv.Level == 0 && term.Level == 0) { prv = null; } var source = default(Term); TermExt.X(prv, term, ref source); var instance = default(SeatArrangement); if (source.If(o => o.SeatIsEmpty()) == true) { instance = new SeatArrangement(source, agent, dateRange.Start, dateRange.End) { Remark = "ByEngine" }; var isOccupiedUnlaoredSubevent = new Func<Term, bool>(o => o.GetIsNeedSeatField() && o is UnlaboredSubEvent); if (isOccupiedUnlaoredSubevent(source) || (source.Level > 1 && source.SeatIsEmpty() && isOccupiedUnlaoredSubevent(source.Bottom))) seatArrangementGroup.Add(instance); else { var key = (Term)term.GetLowestTerm(); if (!_termOccupationRegister.ContainsKey(key)) _termOccupationRegister[key] = new List<List<SeatArrangement>>(); _termOccupationRegister[key].Add(seatArrangementGroup); if (seatArrangementGroup.Count > 0) occupationGroup.Add(seatArrangementGroup); if (term is IAssignment) _status.AssignmentAmount += 1; seatArrangementGroup = new List<SeatArrangement>(new[] { instance }); finalStep = () => { _termOccupationRegister[key].Add(seatArrangementGroup); occupationGroup.Add(seatArrangementGroup); }; } } prv = term; return instance; }, t => t.IsNeedSeat); finalStep(); _employeeSeatOccupationRegister.Add(timeBox.Agent, occupationGroup); _employeeAssignmentRegister.Add(timeBox, filteredTerms.GetFork()); } //TODO: load exist occupations _seatOccupationRegister = _seatBoxSet.Values .ToDictionary(o => o.Seat as ISeatingSeat, o => o.Occupations.ToList()); #region StatusMessage _status.EmployeeAmount = _employeeAssignmentRegister.Count; //foreach (List<Fork> fkList in _employeeAssignmentRegister.Values) // temp1 += fkList.Count; //_status.AssignmentAmount = 0; temp1 = 0; foreach (List<List<SeatArrangement>> soList in _employeeSeatOccupationRegister.Values) { foreach (List<SeatArrangement> sooList in soList) temp1 += sooList.Count; } _status.SeatArrangementAmount = temp1; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineStartSeating", DateTime.Now); #endregion #endregion #region // Consolidation Rule Active // foreach (var consolidationRule in _seatConsolidationRepository.GetByStie(site)) { if (!_seatsMap.Keys.Contains(consolidationRule.TargetSeat.Area)) continue; seatList = GetSeatByRule(consolidationRule, _seatsMap[consolidationRule.TargetSeat.Area], true); occupationList = GetOccupationByConsolidationRule(consolidationRule); foreach (var seat in seatList) { foreach (var seatArrangement in occupationList) SetOccupationSeat(seatArrangement, seat); } } // debug //Console.WriteLine("============================="); // debug #region StatusMessage _status.Process = 0.25; occupationData = getState(); _status.Stage1ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage1ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage1ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += String.Format("{0} : EngineConsolidationFinish", DateTime.Now); #endregion #endregion #region // Seat Priority Employee Active // int priorityEmployeeIndexMax = Math.Min(4 - (int)agentPriorityMethodology, 3); for (int priorityEmployeeIndex = 0; priorityEmployeeIndex < priorityEmployeeIndexMax; priorityEmployeeIndex++) { foreach (var item in _priorityEmployeeSet) { var priorityEmployeeConut = item.Value.Count; if (priorityEmployeeIndex >= priorityEmployeeConut) continue; occupationList = GetOccupationByEmployee(item.Value[priorityEmployeeIndex].Object); foreach (List<SeatArrangement> iso in occupationList) { SetOccupationSeat(iso, item.Key); } } #region StatusMessage _status.Process = 0.25 + 0.25 * priorityEmployeeIndex / 3; occupationData = getState(); _status.Stage2ArrangedAmount[priorityEmployeeIndex] = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage2ArrangedPercentage[priorityEmployeeIndex] = 100 * (double)_status.Stage2ArrangedAmount[priorityEmployeeIndex] / (double)_status.SeatArrangementAmount; //_status.Stage2ArrangedAmount = _status.Stage2ArrangedAmount; //_status.Stage2ArrangedPercentage = _status.Stage2ArrangedPercentage; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EnginePriorityEmployee {1} Finish", DateTime.Now, priorityEmployeeIndex); #endregion } #endregion #region // Seat Priority Organization Active // foreach (var area in _seatsMap) { foreach (var seat in area.Value) { if (seat.PriorityOrganization == null) continue; //var seatRank = seat.Rank; occupationList = GetOccupationByOrganization(seat.PriorityOrganization, rank => true, skills => true, o => true); foreach (List<SeatArrangement> occupation in occupationList) SetOccupationSeat(occupation, seat); } } #region StatusMessage _status.Process = 0.75; occupationData = getState(); _status.Stage3ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage3ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage3ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EnginePriorityOrgFinish", DateTime.Now); #endregion #endregion #region // Area Priority Organization Active // OrganizationSeatingArea organizationSeatingRule; int priorityOrganizationIndexMax = _organizationSeatingAreaSet.Values.Max(o => o.Length); for (int index = 0; index < priorityOrganizationIndexMax; index++) { foreach (var item in _organizationSeatingAreaSet.OrderBy(o=> o.Key.SaftyGetProperty<int,IIndexable>(i=> i.Index))) { if (index >= item.Value.Length) continue; organizationSeatingRule = item.Value[index]; seatList = GetSeatByRule(organizationSeatingRule, _seatsMap[item.Key], false); occupationList = GetOccupationByOrganization(organizationSeatingRule.Object, rank => true, skill => true, o => true); foreach (var seat in seatList) { //var seatRank = seat.Rank; foreach (List<SeatArrangement> iso in occupationList) SetOccupationSeat(iso, seat); } } } #endregion #region // Clear Partial Assignment and ReAssign AssignmentWise // //foreach (var kvp in _termOccupationRegister) //{ // if (CheckAssignmentState(kvp.Key) == AssignmentSeatingState.Partial) // { // foreach (var iso in kvp.Value) // { // if (iso.Seat != default(ISeat)) // { // _seatOccupationRegister[iso.Seat].Remove(iso); // iso.Seat = default(ISeat); // } // } // } //} //for (int index = 0; index < priorityOrganizationIndexMax; index++) //{ // foreach (var item in _seatsMap) // { // var area = item.Key; // if (index >= _organizationSeatingAreaSet[area].Length) // continue; // var orderedServiceOrganizations = _organizationSeatingAreaSet[area]; // organizationSeatingRule = orderedServiceOrganizations[index]; // // try arrange Assignment-wise // foreach (ISeatingTerm isa in GetAssignmentByOrganization(organizationSeatingRule.Object, rank => true)) // { // var seatArrangementList = _termOccupationRegister.ContainsKey(isa) ? _termOccupationRegister[isa] : null; // if (seatArrangementList == null) // continue; // bool isAssignmentSuccess = true; // foreach (var iso in seatArrangementList) // { // bool isOccupationSuccess = false; // seatList = GetSeatByRule(organizationSeatingRule, item.Value, false); // foreach (var iss in seatList.Where(st => _isMatchingRank ? st.Rank <= iso.Agent.Rank : true)) // { // if (SetOccupationSeat(iso, iss)) // { // isOccupationSuccess = true; // break; // } // } // if (!isOccupationSuccess) // { // isAssignmentSuccess = false; // break; // } // } // // fail to Arrange Whole Assignment cancel Assignment // if (!isAssignmentSuccess) // { // foreach (SeatArrangement iso in seatArrangementList) // { // if (iso.Seat != default(ISeat)) // { // _seatOccupationRegister[iso.Seat].Remove(iso); // iso.Seat = default(ISeat); // } // } // } // } // } //} #endregion #region StatusMessage _status.Process = 1; occupationData = getState(); _status.Stage4ArrangedAmount = occupationData[1] - _status.ArrangedSeatArrangementAmount; _status.Stage4ArrangePercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.Stage4ArrangedAmount / (double)_status.SeatArrangementAmount; _status.TotalContinueAssignmentAmount = occupationData[2]; _status.TotalContinueAssignmentPercentage = _status.AssignmentAmount == 0 ? 0 : 100 * (double)_status.TotalContinueAssignmentAmount / (double)_status.AssignmentAmount; _status.ArrangedSeatArrangementAmount = occupationData[1]; _status.ArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.ArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.UnArrangedSeatArrangementAmount = _status.SeatArrangementAmount - _status.ArrangedSeatArrangementAmount; _status.UnArrangedSeatArrangementPercentage = _status.SeatArrangementAmount == 0 ? 0 : 100 * (double)_status.UnArrangedSeatArrangementAmount / (double)_status.SeatArrangementAmount; _status.SeatUsageRate = GetSeatUsageRate((end - start).TotalMinutes); _status.TextMessage += "\n"; _status.TextMessage += string.Format("{0} : EngineAreaOrgFinsish", DateTime.Now); #endregion foreach (var kvp in _termOccupationRegister) { foreach (var arrangementList in kvp.Value) { foreach (var arrangement in arrangementList.Where(o => o.Seat != null)) { _seatBoxSet[arrangement.Seat.Id.ToString()].AddOccupation(arrangement); } } } //foreach (var kvp in _termOccupationRegister) //{ // var assignment = ((AssignmentBase)kvp.Key); // AssignmentSeatingState checkState = CheckAssignmentState(assignment); // if (checkState == AssignmentSeatingState.Empty) // { // assignment.OccupyStatus = "W"; // } // else if (checkState == AssignmentSeatingState.Full) // { // assignment.OccupyStatus = "C"; // } // else if (checkState == AssignmentSeatingState.FullButSeprate) // { // assignment.OccupyStatus = "S"; // } // else // { // //throw new Exception("SeatingEngine inner exception: There is partial assignment in result."); // } //} //_timeBoxRepository.Clear(); return _employeeAssignmentRegister.Keys; }
public Seat(SeatLocation location, SeatArrangement seatArrangement) { Location = Location; Arrangement = seatArrangement; }
public void AssignSeat(Term shift, IWorkingAgent selectedAgent) { var affectedRows = new[] { SelectedSeat }; if (!shift.SeatIsEmpty()) { var removeDelegates = new Action(() => { }); affectedRows = selectedAgent.Schedule.GetCoveredTermsWithAbsent(shift).Add(shift) .Where(o => !o.SeatIsEmpty() && _seatBoxes.ContainsKey(o.Seat)) .Select(o => { var seatBox = (SeatBox)_seatBoxes[o.Seat]; foreach (var c in seatBox.Occupations.Where(c => c.If <SeatArrangement>(a => a.Source.Equals(o)))) { var occupation = c; removeDelegates += () => { seatBox.RemoveOccupation(occupation); selectedAgent.Occupations.Remove(occupation); }; } return(seatBox); }) .ToArray(); removeDelegates(); //var originalSeat = (SeatBox)_seatBoxes[shift.Seat]; //var seatArrangement = originalSeat.Occupations.OfType<SeatArrangement>().FirstOrDefault(o => o.Source == shift && o.TimeEquals(shift)); //if (seatArrangement != null) // originalSeat.RemoveOccupation(seatArrangement); //affectedRows = new[] { SelectedSeat, originalSeat }; } var prv = default(Term); var seatId = SelectedSeat.Id.ToString(); shift.Seat = seatId; var coveredTerms = selectedAgent.Schedule.GetCoveredTermsWithAbsent(shift); coveredTerms.ForEach(o => o.Seat = null).Add(shift) .SliceOccupied((dateRange, term) => { if (!term.IsNeedSeat) { term.Seat = seatId; prv = term; return(default(SeatArrangement)); } if (prv != null && !ReferenceEquals(prv, term) && prv.Level == 0 && term.Level == 0) { prv = null; } var source = default(Term); TermExt.X(prv, term, ref source); var instance = new SeatArrangement(selectedAgent.Profile, dateRange.Start, dateRange.End, SelectedSeat.Seat) { Source = source }; source.Seat = seatId; SelectedSeat.AddOccupation(instance); selectedAgent.Occupations.Add(instance); prv = term; return(instance); }, t => t.IsNeedSeat); //shift.SaftyInvoke<AssignmentBase>(o => { o.OccupyStatus = "C"; }); Reload(affectedRows); OccupationsChanged(-1); }