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); } }
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; } }