Ejemplo n.º 1
0
        public Model.IQueueHistory Delete(string id, [FromUri] OutputReasonEnum reason)
        {
            return(new Model.Queue().Delete(id, reason));

            /* Active Record Pattern:
             * return new Model.Queue()
             * {
             *  ParkingCard = id,
             *  OutputReasonId = reason
             * }
             * .Delete();
             */
        }
Ejemplo n.º 2
0
        /// <summary>Удаляет заданный элемент из очереди</summary>
        /// <param name="id">Номер парковочной карты</param>
        /// <param name="reason">Причина исключения из очереди</param>
        public Model.IQueueHistory Delete(string id, OutputReasonEnum reason)
        {
            try
            {
                // для удаления элемента необходима полная информация о нём:
                var entity = new Model.Queue().Get(id);

                if (QueueManager.DeQueueTran(entity, reason))
                {
                    // возврат информации об удалённом элементе
                    return new QueueHistory()
                    {
                        Input = entity.Input,
                        ParkingCard = entity.ParkingCard
                    }.Get();
                }
                return null;
            }
            catch (Exception e)
            {
                Model.Log.Put(message: e.Message, exception: e);
                return null;
            }
        }
Ejemplo n.º 3
0
        /// <summary>Исключает элемент из очереди, транзакцией</summary>
        /// <param name="entity">Элемент</param>
        /// <param name="reason">Причина исключения из очереди</param>
        /// <param name="extRepository">Экземпляр репозитория при внешней транзакции</param>
        /// <param name="extTransaction">Экземпляр транзакции при внешней транзакции</param>
        /// <returns>Успех операции</returns>
        internal static bool DeQueueTran(Model.IQueue entity, OutputReasonEnum reason,
                                         Repository extRepository = null, DbContextTransaction extTransaction = null)
        {
            lock (Locker)
            {
                if (entity == null)
                {
                    return(false);
                }

                using (Repository repository = extRepository ?? new Repository())
                {
                    using (var tran = extTransaction ?? repository.Database.BeginTransaction(TranIsolationLevel))
                    {
                        // необходимо убедиться, что элемент существует в текущей транзакции:
                        var entityTran = repository.Queue.Find(entity.ParkingCard);
                        if (entityTran == null)
                        {
                            return(false);
                        }

                        var outputReason = repository.OutputReason
                                           .First(t => t.Code == reason.ToString());

                        // копирование элемента в историю:
                        if (repository.QueueHistory.Find(entity.Input, entity.ParkingCard) == null)
                        {
                            repository.QueueHistory.Add(new QueueHistory()
                            {
                                Input         = entity.Input,
                                Output        = DateTime.Now,
                                ParkingCard   = entity.ParkingCard,
                                Rotation      = entity.Rotation,
                                RotationStart = entity.RotationStart,
                                Position      = entity.Position,
                                OutputReason  = outputReason
                            });
                        }

                        // удаление элемента из очереди:
                        repository.Queue.Remove(entityTran);

                        // сохранение всех изменений модели:
                        repository.SaveChanges();

                        // пересчёт фиксированных позиций:
                        switch (reason)
                        {
                        case OutputReasonEnum.Rotation:
                            break;

                        case OutputReasonEnum.Peek:
                            FixedPositionsMoveUp(repository);
                            break;

                        case OutputReasonEnum.Vip:
                        case OutputReasonEnum.Time:
                            if (entity.Position <= RotationPlaceParam)
                            {
                                FixedPositionsMoveUp(repository);
                            }
                            break;
                        }

                        // отправка всех изменений модели в БД:
                        tran.Commit();
                    }
                }

                Model.Notifier.OnQueueChanged(new QueueChangedEventArgs()
                {
                    Reason = QueueChangedEnum.DeQueue,
                    Queue  = new Model.Queue().Get(ViewLimitParam)
                });

                return(true);
            }
        }