Пример #1
0
        public void SuccesLog(IPriceFormalizer p, string filename)
        {
            FormSecs = Convert.ToInt64(DateTime.Now.Subtract(begin).TotalSeconds);
            string messageBody = "", messageSubject = "";

            //Формирование заголовков письма и
            SuccesGetBody("Прайс упешно формализован", ref messageSubject, ref messageBody, p?.Info);
            string downloadId = null;
            var    fileName   = Path.GetFileNameWithoutExtension(filename);

            if (fileName.IndexOf("_") > -1)
            {
                downloadId = fileName.Substring(fileName.IndexOf("_") + 1, fileName.Length - fileName.IndexOf("_") - 1);
                uint id;
                uint.TryParse(downloadId, out id);
                downloadId = id.ToString();
            }

            using (var session = SessionHelper.GetSessionFactory().OpenSession())
                using (var trx = session.BeginTransaction()) {
                    p.Stat.Fix(downloadId, Settings.Default.MinRepeatTranCount);
                    p.Stat.TotalSecs = (uint?)FormSecs;
                    session.Save(p.Stat);
                    trx.Commit();
                }

            if (_prevErrorMessage != String.Empty)
            {
                Mailer.SendToWarningList(messageSubject, messageBody);
            }
        }
Пример #2
0
        public void ErrodLog(IPriceFormalizer p, Exception ex)
        {
            FormSecs = Convert.ToInt64(DateTime.Now.Subtract(begin).TotalSeconds);
            string messageBody = "", messageSubject = "";

            if (ex is FormalizeException)
            {
                CurrentErrorMessage = ex.Message;
            }
            else
            {
                CurrentErrorMessage = ex.ToString();
            }
            var addition = CurrentErrorMessage;

            //Если предыдущее сообщение не отличается от текущего, то не логируем его
            if (_prevErrorMessage == CurrentErrorMessage)
            {
                return;
            }

            //Формирование заголовков письма и
            GetBody("Ошибка формализации", ref addition, ref messageSubject, ref messageBody, p?.Info);
            LogToDb(command => {
                command.CommandText = "INSERT INTO logs.FormLogs (LogTime, Host, PriceItemId, Addition, ResultId, TotalSecs) VALUES (NOW(), ?Host, ?PriceItemId, ?Addition, ?ResultId, ?TotalSecs)";
                command.Parameters.Clear();
                command.Parameters.AddWithValue("?PriceItemId", _processItem.PriceItemId);
                command.Parameters.AddWithValue("?Host", Environment.MachineName);
                command.Parameters.AddWithValue("?Addition", addition);
                command.Parameters.AddWithValue("?ResultId", FormResults.Error);
                command.Parameters.AddWithValue("?TotalSecs", FormSecs);
                command.ExecuteNonQuery();
            });
            Mailer.SendToWarningList(messageSubject, messageBody);
        }
        public void BaseSetup()
        {
            Downloaded     = false;
            formalizer     = null;
            file           = "test.txt";
            defaultContent = @"9 МЕСЯЦЕВ КРЕМ Д/ПРОФИЛАКТИКИ И КОРРЕКЦИИ РАСТЯЖЕК 150МЛ;Валента Фармацевтика/Королев Ф;2864;220.92;1;
5 ДНЕЙ ВАННА Д/НОГ СМЯГЧАЮЩАЯ №10 ПАК. 25Г;Санкт-Петербургская ф.ф.;24;73.88;0;
911 ВЕНОЛГОН ГЕЛЬ Д/ НОГ ПРИ ТЯЖЕСТИ БОЛИ И ОТЕКАХ ТУБА 100МЛ;Твинс Тэк;40;44.71;1;";
        }
        protected void Formalize()
        {
            session.Flush();
            if (session.Transaction.IsActive)
            {
                session.Transaction.Commit();
            }

            if (formalizer == null)
            {
                formalizer = CreateFormalizer();
            }

            formalizer.Downloaded = Downloaded;
            formalizer.Formalize();
            formalizer = null;
        }
        /// <summary>
        /// Процедура формализации
        /// </summary>
        public void ThreadWork()
        {
            ProcessState = PriceProcessState.Begin;
            try {
                using (var cleaner = new FileCleaner())
                    using (NDC.Push($"PriceItemId = {ProcessItem.PriceItemId}")) {
                        //имя файла для копирования в директорию Base выглядит как: <PriceItemID> + <оригинальное расширение файла>
                        var outPriceFileName = Path.Combine(Settings.Default.BasePath,
                                                            ProcessItem.PriceItemId + Path.GetExtension(ProcessItem.FilePath));
                        //Используем идентификатор нитки в качестве названия временной папки
                        var tempPath = Path.GetTempPath() + TID + "\\";
                        //изменяем имя файла, что оно было без недопустимых символов ('_')
                        var tempFileName = tempPath + ProcessItem.PriceItemId + Path.GetExtension(ProcessItem.FilePath);
                        cleaner.Watch(tempFileName);
                        _logger.DebugFormat("Запущена нитка на обработку файла : {0}", ProcessItem.FilePath);

                        ProcessState = PriceProcessState.CreateTempDirectory;
                        FileHelper.InitDir(tempPath);

                        var max = 8;
                        for (var i = 1; i <= max; i++)
                        {
                            try {
                                ProcessState          = PriceProcessState.CallValidate;
                                formalizer            = PricesValidator.Validate(ProcessItem.FilePath, tempFileName, (uint)ProcessItem.PriceItemId);
                                formalizer.Downloaded = ProcessItem.Downloaded;
                                ProcessState          = PriceProcessState.CallFormalize;
                                formalizer.Formalize();
                                _log.SuccesLog(formalizer, ProcessItem.FilePath);
                                break;
                            }
                            catch (MySqlException e) {
                                if (i == max)
                                {
                                    throw;
                                }
                                //Duplicate entry '%s' for key %d
                                //всего скорее это значит что одновременно формализовался прайс-лист с такими же синонимами, нужно повторить попытку
                                _logger.Warn($"Повторяю формализацию прайс-листа попытка {i} из {max}", e);
                            }
                            catch (Exception e) {
                                var warning =
                                    (e as WarningFormalizeException) ?? (e.InnerException as WarningFormalizeException);
                                if (warning != null)
                                {
                                    _log.WarningLog(warning, warning.Message);
                                    break;
                                }
                                throw;
                            }
                        }

                        FormalizeOK  = true;
                        ProcessState = PriceProcessState.FinalCopy;
                        //Если файл не скопируется, то из Inbound он не удалиться и будет попытка формализации еще раз
                        if (File.Exists(tempFileName))
                        {
                            File.Copy(tempFileName, outPriceFileName, true);
                        }
                        else
                        {
                            File.Copy(ProcessItem.FilePath, outPriceFileName, true);
                        }
                        var ft = DateTime.UtcNow;
                        File.SetCreationTimeUtc(outPriceFileName, ft);
                        File.SetLastWriteTimeUtc(outPriceFileName, ft);
                        File.SetLastAccessTimeUtc(outPriceFileName, ft);
                    }
            }
            catch (ThreadAbortException e) {
                _logger.Warn(Settings.Default.ThreadAbortError, e);
                _log.ErrodLog(formalizer, new Exception(Settings.Default.ThreadAbortError));
            }
            catch (Exception e) {
                if (e is DbfException || e is XmlException)
                {
                    _logger.Warn("Ошибка при формализации прайс листа", e);
                }
                else
                {
                    _logger.Error("Ошибка при формализации прайс листа", e);
                }
                _log.ErrodLog(formalizer, e);
            }
            finally {
                ProcessState = PriceProcessState.FinalizeThread;
                _logger.InfoFormat("Нитка завершила работу с прайсом {0}: {1}.", ProcessItem.FilePath, DateTime.UtcNow.Subtract(StartDate));
                FormalizeEnd = true;
            }
        }