예제 #1
0
        /// <summary>
        /// Транзакция на передачу билета кассиру.
        /// </summary>
        private async Task <bool> WriteTicketTransaction(DeviceCashier devCashier, CashierHandling handling, MasterSerialPort port, CancellationToken ct)
        {
            var item = devCashier.Cashier.StartHandling();

            if (item == null)                         //БЛОКИРОВКА ТРАНЗАКЦИИ (билет уже используетсяв транзакции)
            {
                return(false);
            }

            var writeProvider = new Server2CashierWriteDataProvider(devCashier.AddresDevice, _logName)
            {
                InputData = item
            };
            await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

            if (writeProvider.IsOutDataValid)        //ТРАНЗАКЦИЯ ЗАВЕРШЕНА УСПЕШНО  (извлечем билет из очереди и присвоим кассиру)
            {
                devCashier.Cashier.StartHandlingSuccessful();
            }
            else                                     //ТРАНЗАКЦИЯ ЗАВЕРШЕНА С ОШИБКОЙ (снимем блокировку)
            {
                _loggerCashierInfo.Info($"НЕ УДАЧНАЯ ТРАНЗАКЦИЯ ПЕРЕДАЧИ БИЛЕТА КАССИРУ: Id= {devCashier.Cashier.Id}   НА КОМАНДУ={handling}");
                devCashier.Cashier.StartHandlingFaild();
                return(false);
            }
            return(true);
        }
예제 #2
0
        public async Task ExchangeService(MasterSerialPort port, CancellationToken ct)
        {
            if (port == null)
            {
                return;
            }

            foreach (var devCashier in _deviceCashiers)              //Запуск опроса кассиров
            {
                var readProvider = new Server2CashierReadDataProvider {
                    InputData = devCashier.Cashier.Id
                };
                devCashier.DataExchangeSuccess = await port.DataExchangeAsync(_timeRespone, readProvider, ct);

                if (!devCashier.IsConnect)
                {
                    devCashier.Cashier.DisconectHandling();
                    continue;
                }

                if (readProvider.IsOutDataValid)
                {
                    TicketItem item;
                    var        cashierInfo = readProvider.OutputData;

                    if (!cashierInfo.IsWork)
                    {
                        continue;
                    }

                    switch (cashierInfo.Handling)
                    {
                    case CashierHandling.IsSuccessfulHandling:
                        devCashier.Cashier.SuccessfulHandling();
                        break;

                    case CashierHandling.IsErrorHandling:
                        devCashier.Cashier.ErrorHandling();
                        break;

                    case CashierHandling.IsStartHandling:
                        item = devCashier.Cashier.StartHandling();
                        var writeProvider = new Server2CashierWriteDataProvider {
                            InputData = item
                        };
                        await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                        if (writeProvider.IsOutDataValid)                    //завершение транзакции ( успешная передача билета кассиру)
                        {
                            devCashier.Cashier.SuccessfulStartHandling();
                        }
                        break;

                    case CashierHandling.IsSuccessfulAndStartHandling:
                        devCashier.Cashier.SuccessfulHandling();

                        item          = devCashier.Cashier.StartHandling();
                        writeProvider = new Server2CashierWriteDataProvider {
                            InputData = item
                        };
                        await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                        if (writeProvider.IsOutDataValid)                    //завершение транзакции ( успешная передача билета кассиру)
                        {
                            devCashier.Cashier.SuccessfulStartHandling();
                        }
                        break;

                    case CashierHandling.IsErrorAndStartHandling:
                        devCashier.Cashier.ErrorHandling();

                        item          = devCashier.Cashier.StartHandling();
                        writeProvider = new Server2CashierWriteDataProvider {
                            InputData = item
                        };
                        await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                        if (writeProvider.IsOutDataValid)                    //завершение транзакции ( успешная передача билета кассиру)
                        {
                            devCashier.Cashier.SuccessfulStartHandling();
                        }
                        break;

                    default:
                        item = null;
                        break;
                    }
                }
            }

            //Отправка запроса синхронизации времени раз в час
            if (_lastSyncLabel != DateTime.Now.Hour)
            {
                _lastSyncLabel = DateTime.Now.Hour;

                var syncTimeProvider = new Server2CashierSyncTimeDataProvider();
                await port.DataExchangeAsync(_timeRespone, syncTimeProvider, ct);
            }
        }
        public async Task ExchangeService(MasterSerialPort port, CancellationToken ct)
        {
            if (port == null)
            {
                return;
            }

            try
            {
                foreach (var devCashier in _deviceCashiers)                                                                                                                                                                                                                                                                        //Запуск опроса кассиров
                {
                    _loggerCashierInfo.Info($"---------------------------КАССИР: Id= {devCashier.Cashier.Id}   CurrentTicket= {(devCashier.Cashier.CurrentTicket != null ? devCashier.Cashier.CurrentTicket.Prefix + devCashier.Cashier.CurrentTicket.NumberElement.ToString("000") : "НЕТ")}----------------------------------"); //LOG;

                    var readProvider = new Server2CashierReadDataProvider(devCashier.AddresDevice, _logName);
                    devCashier.DataExchangeSuccess = await port.DataExchangeAsync(_timeRespone, readProvider, ct);

                    if (!devCashier.IsConnect)
                    {
                        _loggerCashierInfo.Info($"кассир НЕ на связи: Id= {devCashier.Cashier.Id}");//LOG;
                        devCashier.LastSyncLabel = 0;
                        continue;
                    }

                    if (readProvider.IsOutDataValid)
                    {
                        TicketItem item;
                        var        cashierInfo = readProvider.OutputData;

                        //Если устойство было не на связи, то Отправка запроса синхронизации времени раз в час, будет произведенна мгновенно.
                        if (devCashier.LastSyncLabel != DateTime.Now.Hour)
                        {
                            devCashier.LastSyncLabel = DateTime.Now.Hour;
                            var syncTimeProvider = new Server2CashierSyncTimeDataProvider(_logName);
                            await port.DataExchangeAsync(_timeRespone, syncTimeProvider, ct);
                        }

                        //TODO: проверить
                        if (!cashierInfo.IsWork)
                        {
                            //Если кассир быстро закрыла сессию (до того как опрос порта дошел до нее), то билет из обработки надо убрать.
                            if (devCashier.Cashier.CurrentTicket != null)
                            {
                                _loggerCashierInfo.Info($"Команда от кассира: Id= {devCashier.Cashier.Id}   Handling=\"Если кассир быстро закрыла сессию(до того как опрос порта дошел до нее). НО У НЕЕ БЫЛ ТЕКУЩИЙ ОБРАБАТЫВАЕМЫЙ БИЛЕТ\"    NameTicket= {cashierInfo.NameTicket}");//LOG;
                                //devCashier.Cashier.SuccessfulHandling();
                            }
                            continue;
                        }

                        switch (cashierInfo.Handling)
                        {
                        case CashierHandling.IsSuccessfulHandling:
                            if (!devCashier.Cashier.CanHandling)
                            {
                                break;
                            }
                            devCashier.Cashier.SuccessfulHandling();
                            break;


                        case CashierHandling.IsErrorHandling:
                            if (!devCashier.Cashier.CanHandling)
                            {
                                break;
                            }
                            devCashier.Cashier.ErrorHandling();
                            break;


                        case CashierHandling.IsStartHandling:
                            item = devCashier.Cashier.StartHandling();
                            if (item == null)
                            {
                                break;
                            }

                            var writeProvider = new Server2CashierWriteDataProvider(devCashier.AddresDevice, _logName)
                            {
                                InputData = item
                            };
                            await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                            if (!writeProvider.IsOutDataValid)                                                                                                              //завершение транзакции ( НЕ успешная передача билета кассиру)
                            {
                                _loggerCashierInfo.Info($"НЕ УДАЧНАЯ ТРАНЗАКЦИЯ ПЕРЕДАЧИ БИЛЕТА КАССИРУ: Id= {devCashier.Cashier.Id}   НА КОМАНДУ={cashierInfo.Handling}"); //LOG;
                            }
                            devCashier.Cashier.SuccessfulStartHandling();
                            break;


                        case CashierHandling.IsRedirectHandling:
                            if (_adminCashier != null)
                            {
                                if (!devCashier.Cashier.CanHandling)
                                {
                                    break;
                                }
                                var redirectTicket = devCashier.Cashier.CurrentTicket;
                                if (redirectTicket != null)
                                {
                                    _adminCashier.Cashier.AddRedirectedTicket(redirectTicket);
                                }
                                devCashier.Cashier.SuccessfulHandling();
                            }
                            break;


                        case CashierHandling.IsSuccessfulAndStartHandling:
                            devCashier.Cashier.SuccessfulHandling();
                            item = devCashier.Cashier.StartHandling();
                            if (item == null)
                            {
                                break;
                            }

                            writeProvider = new Server2CashierWriteDataProvider(devCashier.AddresDevice, _logName)
                            {
                                InputData = item
                            };
                            await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                            if (!writeProvider.IsOutDataValid)                                                                                                              //завершение транзакции ( НЕ успешная передача билета кассиру)
                            {
                                _loggerCashierInfo.Info($"НЕ УДАЧНАЯ ТРАНЗАКЦИЯ ПЕРЕДАЧИ БИЛЕТА КАССИРУ: Id= {devCashier.Cashier.Id}   НА КОМАНДУ={cashierInfo.Handling}"); //LOG;
                            }
                            devCashier.Cashier.SuccessfulStartHandling();
                            break;


                        case CashierHandling.IsRedirectAndStartHandling:
                            if (_adminCashier != null)
                            {
                                var redirectTicket = devCashier.Cashier.CurrentTicket;
                                if (redirectTicket != null)
                                {
                                    _adminCashier.Cashier.AddRedirectedTicket(redirectTicket);
                                }
                                devCashier.Cashier.SuccessfulHandling();

                                item = devCashier.Cashier.StartHandling();
                                if (item == null)
                                {
                                    break;
                                }

                                writeProvider = new Server2CashierWriteDataProvider(devCashier.AddresDevice, _logName)
                                {
                                    InputData = item
                                };
                                await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                                if (!writeProvider.IsOutDataValid)                                                                                                              //завершение транзакции ( НЕ успешная передача билета кассиру)
                                {
                                    _loggerCashierInfo.Info($"НЕ УДАЧНАЯ ТРАНЗАКЦИЯ ПЕРЕДАЧИ БИЛЕТА КАССИРУ: Id= {devCashier.Cashier.Id}   НА КОМАНДУ={cashierInfo.Handling}"); //LOG;
                                }
                                devCashier.Cashier.SuccessfulStartHandling();
                            }
                            break;


                        case CashierHandling.IsErrorAndStartHandling:
                            devCashier.Cashier.ErrorHandling();
                            item = devCashier.Cashier.StartHandling();
                            if (item == null)
                            {
                                break;
                            }

                            writeProvider = new Server2CashierWriteDataProvider(devCashier.AddresDevice, _logName)
                            {
                                InputData = item
                            };
                            await port.DataExchangeAsync(_timeRespone, writeProvider, ct);

                            if (!writeProvider.IsOutDataValid)                                                                                                              //завершение транзакции ( НЕ успешная передача билета кассиру)
                            {
                                _loggerCashierInfo.Info($"НЕ УДАЧНАЯ ТРАНЗАКЦИЯ ПЕРЕДАЧИ БИЛЕТА КАССИРУ: Id= {devCashier.Cashier.Id}   НА КОМАНДУ={cashierInfo.Handling}"); //LOG;
                            }
                            devCashier.Cashier.SuccessfulStartHandling();
                            break;

                        default:
                            item = null;
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _loggerCashierInfo.Info($"EXCEPTION CashierExchangeService:   {ex.ToString()}");
            }
        }