private void PutIdleUsersAtCashiers() { var availableUsers = users.Where(u => u.Cashier == null).ToList(); if (availableUsers.Count == 0) { return; } // Any idle users, and any free cashier stations, and any non-served tickets? var availableCashiers = cashiers.Where(c => c.CurrentUser == null).ToList(); var servableSeviceTypes = serviceTypes.Where(st => st.Queue.HasTickets).ToList(); bool validOperation = (availableUsers.Count > 0) && (availableCashiers.Count > 0) && (servableSeviceTypes.Count > 0); if (!validOperation) { // This office is working at max capacity, or there are no waiting customers return; } float cashierOpenProbability = this.UserCashierOpeningsPerTick; TestRandom(cashierOpenProbability, () => { DummyUser idleUser = GetRandom(availableUsers); DummyCashier freeCashier = GetRandom(availableCashiers); DummyServiceType serviceType = GetRandom(servableSeviceTypes); Log("{0} manning {1}, dealing with {2}", idleUser, freeCashier, serviceType); freeCashier.Open(idleUser, serviceType); }); }
public void Open(DummyUser user, DummyServiceType serviceType) { if (CurrentUser != null) throw new InvalidOperationException("Cashier already occupied"); CurrentUser = user; ServiceType = serviceType; user.Cashier = this; }
public void Open(DummyUser user, DummyServiceType serviceType) { if (CurrentUser != null) { throw new InvalidOperationException("Cashier already occupied"); } CurrentUser = user; ServiceType = serviceType; user.Cashier = this; }