public void Preload(string[] parameters) { Log4NetHelper.Configure("WebApi"); var log = LogManager.GetLogger(GetType()); EpsHelper.Initialize(); log.Info("WarmUp complete"); }
/// <summary> /// Конструктор задания. /// </summary> public EpsJob(Output output, string userName) { if (output == null) { throw new ArgumentNullException("output"); } _output = output; _zip = false; _reserve = false; _tasks = new List <EpsTask>(); _reports = new Dictionary <string, EpsFastReport>(); try { CreateReports(userName); ParseJobParams(); CreateJobFolder(); if (_output.OutputTasks == null || _output.OutputTasks.Count == 0) { throw new Exception("Output tasks are empty."); } //сортируем в соответствии с OutputTaskOrder foreach (var obj in _output.OutputTasks.Where(p => p != null).OrderBy(p => p.OutputTaskOrder)) { var task = new EpsTask(obj, EpsHelper.GetKey(_output).To <decimal>(), _jobFolder, _zip, _reserve); Tasks.Add(task); if (_reports == null) { continue; } if (task.ExportType != null) { foreach (var p in _reports.Select(p => p.Value).Where(p => p != null)) { p.AddExportType(task.ExportType); } } } } catch (Exception ex) { _output.OutputStatus = EpsJobStatus.OS_ERROR.ToString(); _output.OutputFeedback = ex.Message; throw; } }
/// <summary> /// Данные берутся из БД. /// </summary> //[Test] public void StartJob() { // //Инициализируем сервис. Считываем конфигурационные файлы // var configManager = ConfigManagerBase.Instance<EpsConfigManager>(null); // configManager.SetDefaultValues(); // configManager.OnEventErrorHandler += (exception, type, code, message, process, id, name, userName) => // Trace.WriteLine(exception != null // ? string.Format("Ошибка в EpsConfigManager'е. {0}", exception) // : string.Format("Сообщение EpsConfigManager'а. {0}", process)); // // //TODO: переделать на контекст // //configManager.ReadConfig<EpsConfig>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EPS"), "EPS.config"); // var config = configManager.GetConfig() as EpsConfig; var ioutputmanager = CreateManager <Output>() as IOutputManager; if (ioutputmanager == null) { throw new DeveloperException("Can't get IOutputManager."); } //var listEpsOutput = ioutputmanager.GetEpsOutputLst(config.AmountQueue - job.Count, config.Handler); //TODO: переделать на контекст //config.Handler = 1; var listEpsOutput = ioutputmanager.GetEpsOutputLst(10, 1); if (listEpsOutput != null) { foreach (var output in listEpsOutput.Where(p => p != null)) { //Запускаем EPS Job var epsjob = new wmsMLC.EPS.wmsEPS.EpsJob(output, "User"); var task = new Task(epsjob.DoJob); task.Start(); Trace.WriteLine(string.Format("Задание с данными {0} запущено.", EpsHelper.GetKey(epsjob.GetOutput()))); Trace.WriteLine("======================================"); task.Wait(); using (var manager = IoC.Instance.Resolve <IBaseManager <Output> >()) { manager.Update(output); } } } }
public void StartJobWithCreateData() { //добавляем данные в output var epsTest = new wmsMLC.Tests.Functional.EPS.EpsTest(); var output = epsTest.CreateOutput(); var key = ((IKeyHandler)output).GetKey(); key.Should().NotBeNull("У сохраненного объекта Ключ должен быть заполнен."); //var mgr = IoC.Instance.Resolve<IBaseManager<Output>>(); //mgr.Insert(ref output); //Инициализируем сервис. Считываем конфигурационные файлы //TODO: переделать на контекст // var configManager = ConfigManagerBase.Instance<EpsConfigManager>(new ServiceContext("StartJobWithCreateData", null)); // configManager.SetDefaultValues(); // configManager.OnEventErrorHandler += (exception, type, code, message, process, id, name, userName) => // Trace.WriteLine(exception != null // ? string.Format("Ошибка в EpsConfigManager'е. {0}", exception) // : string.Format("Сообщение EpsConfigManager'а. {0}", process)); // // // //TODO: переделать на контекст // //configManager.ReadConfig<EpsConfig>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EPS"), "EPS.config"); // var config = configManager.GetConfig(); //Запускаем EPS Job var epsjob = new wmsMLC.EPS.wmsEPS.EpsJob(output, "User"); var task = new Task(epsjob.DoJob); task.Start(); Trace.WriteLine(string.Format("Задание с данными {0} запущено.", EpsHelper.GetKey(epsjob.GetOutput()))); Trace.WriteLine("======================================"); task.Wait(); using (var manager = IoC.Instance.Resolve <IBaseManager <Output> >()) { manager.Update(output); } }
/// <summary> /// Создает задание для EPS и выполняет его. /// </summary> public void ExecuteEpsJob(string jobCode, string executor, Dictionary <string, object> parameters, int?timeoutms) { Contract.Requires(!string.IsNullOrEmpty(jobCode)); Contract.Requires(!string.IsNullOrEmpty(executor)); string context; using (var session = SessionFactory.OpenSession()) { var job = session.Get <EpsJob>(jobCode); if (job == null) { throw new Exception(string.Format("Can't find job with code '{0}'.", jobCode)); } //if (!job.JobHandler.HasValue) // throw new Exception(string.Format("Job '{0}' has no JobHandler. Please check job settings.", jobCode)); if (job.JobLocked) { throw new Exception(string.Format("Eps job '{0}' is locked.", jobCode)); } // пытаемся применить быструю проверку необходимости запуска if (!EpsHelper.IsNeedToStart(job, session)) { throw new Exception( string.Format("Job '{0}' shouldn't be executed. Check return 0 rows.", jobCode)); } // дополняем задачу параметрами и разбиваем, если нужно var additionalParameters = EpsHelper.GetAddigionalParametersAndSplit(job, session); if (parameters != null && parameters.Count > 0) { //Если сверху пришли параметры, применяем их к каждому элементу массива if (additionalParameters == null) { additionalParameters = new List <Dictionary <string, object> >(); } if (additionalParameters.Count > 0) { foreach (var par in additionalParameters) { foreach (var newpar in parameters) { par[newpar.Key] = newpar.Value; } } } else { additionalParameters.Add(parameters); } } var outputlst = new List <EpsOutput>(); if (additionalParameters == null) { var output = EpsHelper.ProcessEpsJob(executor, job, session, null, null); outputlst.Add(output); } else { if (additionalParameters.Count == 0) { throw new Exception( string.Format("Job '{0}' shouldn't be executed. Split query return 0 rows.", jobCode)); } foreach (var p in additionalParameters) { var output = EpsHelper.ProcessEpsJob(executor, job, session, p, null); outputlst.Add(output); } } if (outputlst.Count == 0) { return; } context = SerializeEpsOutputToDto(outputlst.ToArray()); } if (string.IsNullOrEmpty(context)) { return; } Post("print", context, timeoutms); }
/// <summary> /// Обработка файлов задачи. /// !!! Вызывать только после обработки параметров задачи !!! /// </summary> /// <param name="reports">отчеты</param> public void ProcessFiles(EpsFastReport[] reports) { if (reports != null && reports.Length > 0 && _exportType != null) { foreach (var epsFastReport in reports) { if (epsFastReport == null) { continue; } var extension = GetParamValue <string>(EpsTaskParams.FileExtension); extension = string.IsNullOrEmpty(extension) ? EpsHelper.GetFileExtension(_exportType.Format) : extension.TrimStart('.'); if (string.IsNullOrEmpty(extension)) { throw new Exception(string.Format("Неопределено расширение файла для формата '{0}'.", _exportType.Format)); } var resultReportFile = Sb.Substitute(epsFastReport.ReportName); byte[] data; if (Archiver == null) { data = epsFastReport.GetExportStream(_exportType); } else { data = Archiver.ArchiveStreamToStream(epsFastReport.GetExportStream(_exportType), resultReportFile + "." + extension, Properties.Settings.Default.CompressionLevel); } Files.Add(extension.Length > 0 ? new FileStruct(data, resultReportFile, extension, Ziped) : new FileStruct(data, resultReportFile, Ziped)); } } else //Если отчетов нет, то проверяем парметр EpsTaskParams.SourceFolder { if (FindByName(EpsTaskParams.SourceFolder) == null) { throw new Exception("SourceFolder parameter not found."); } } var fileList = FilePumper.GetFileList(); if (FilePumper.PumperState) { if (fileList == null) { return; } foreach (var f in fileList) { var data = (Archiver != null) ? Archiver.ArchiveStreamToStream(FilePumper.GetFile(f), Path.GetFileName(f), Properties.Settings.Default.CompressionLevel) : FilePumper.GetFile(f); Files.Add(new FileStruct(data, f, Ziped)); } } else { throw new Exception("Could not get source files."); } }
public void Execute(IJobExecutionContext context) { var jobCode = context.GetRequiredParameter <string>(EpsJobCodeParamName); var inputParams = context.MergedJobDataMap .Where(item => item.Key != EpsJobCodeParamName).ToArray(); var parameters = inputParams.Length > 0 ? inputParams.ToDictionary(item => item.Key, item => item.Value) : null; using (var session = _sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { var executor = WmsEnvironment.UserName; if (string.IsNullOrEmpty(executor)) { throw new AuthenticationException("Executor is not Authenticated."); } var job = session.Get <EpsJob>(jobCode); if (job == null) { throw new JobExecutionException(string.Format("Can't find job with code '{0}'.", jobCode)); } if (!job.JobHandler.HasValue) { throw new JobExecutionException( string.Format("Job '{0}' has no JobHandler. Please check job settings.", jobCode)); } //if (job.JobHandler != _handler) // throw new JobExecutionException(string.Format("Executor for job '{0}' can execute only jobs with handler {1}, but this job have handler {2}. Please check job settings.", jobCode, _handler, job.JobHandler)); if (job.JobLocked) { throw new JobExecutionException(string.Format("Eps job '{0}' is locked.", jobCode)); } // пытаемс¤ применить быструю проверку необходимости запуска if (!EpsHelper.IsNeedToStart(job, session)) { throw new JobExecutionException( string.Format("Job '{0}' shouldn't be executed. Check return 0 rows.", jobCode)); } try { // дополн¤ем задачу параметрами и разбиваем, если нужно var additionalParameters = EpsHelper.GetAddigionalParametersAndSplit(job, session); if (parameters != null && parameters.Count > 0) { //≈сли сверху пришли параметры, примен¤ем их к каждому элементу массива if (additionalParameters == null) { additionalParameters = new List <Dictionary <string, object> >(); } if (additionalParameters.Count > 0) { foreach (var par in additionalParameters) { foreach (var newpar in parameters) { par[newpar.Key] = newpar.Value; } } } else { additionalParameters.Add(parameters); } } if (additionalParameters == null) { var output = EpsHelper.ProcessEpsJob(executor, job, session, null, Log); EpsHelper.SaveEpsOutput(output, session); } else { if (additionalParameters.Count == 0) { throw new Exception( string.Format("Job '{0}' shouldn't be executed. Split query return 0 rows.", jobCode)); } foreach (var p in additionalParameters) { var output = EpsHelper.ProcessEpsJob(executor, job, session, p, Log); EpsHelper.SaveEpsOutput(output, session); } } } catch (Exception ex) { throw new JobExecutionException(ex); } transaction.Commit(); } } }
public override void DoTask(EpsFastReport[] reports) { var mailHelper = new MailHelper(); using (var mail = mailHelper.CreateMailSender()) { var newLine = "\r\n\r\n"; // обработка форматов тела письма if (Settings.Default.MailBodyFormat.Equals(MediaTypeNames.Text.Html)) { newLine = "<br><br>"; } mailHelper.SetFrom(mail); mailHelper.SetCredentials(mail); var sendTo = GetAllParamValues <string>(EpsTaskParams.Email); foreach (var addrr in sendTo) { mail.AddTo(addrr); } var asAttach = GetParamValue(EpsTaskParams.AsAttachment, defaultValue: 1) == 1; var sendBlankMail = GetParamValue(EpsTaskParams.SendBlankMail, defaultValue: 1) == 1; var fileFormat = GetParamValue <string>(EpsTaskParams.FileFormat); if (!string.IsNullOrEmpty(fileFormat)) { Sb.SetMacro("FileFormat", fileFormat); var ext = EpsHelper.GetFileExtension(fileFormat); if (ext != null) { Sb.SetMacro("FileExtension", ext); } } var deleteSrcFile = FindByName(EpsTaskParams.MoveFile) != null && FindByName(EpsTaskParams.CopyFile) == null; var fileMask = GetParamValue <string>(EpsTaskParams.FileMask); if (!string.IsNullOrEmpty(fileMask)) { FilePumper.AddSearchPattern(fileMask); } var sourceFolder = GetParamValue <string>(EpsTaskParams.SourceFolder); if (!string.IsNullOrEmpty(sourceFolder)) { FilePumper.SetSourcePath(sourceFolder); } FilePumper.SetDestinationMove(deleteSrcFile); var resultReportFileValue = string.Empty; if (FindByName(EpsTaskParams.ResultReportFile) != null) { Sb.SetMacro("ResultReportFile", GetParamValue <string>(EpsTaskParams.ResultReportFile)); } else { if (reports != null) { foreach (var report in reports.Where(p => p != null)) { resultReportFileValue += string.Format("{0}{1}", resultReportFileValue != string.Empty ? ";" : null, report.ReportName); } } if (resultReportFileValue != string.Empty) { Sb.SetMacro("ResultReportFile", Sb.Substitute(resultReportFileValue)); } } // заполняем тему var mailSubject = ProcessSqlMacro(GetParamValue(EpsTaskParams.MailSubject, defaultValue: Settings.Default.MailSubject)); mail.SetSubject(mailSubject); // Вызывать ProcessFiles только после обработки параметров задачи ProcessFiles(reports); if (Files.Count < 1) { if (!sendBlankMail) { return; // не отсылаем почту } } // заполняем тело var mailBody = ProcessSqlMacro(GetParamValue(EpsTaskParams.MailBody, defaultValue: Settings.Default.MailHeader)); mail.SetBody(mailBody + newLine, true); // добавляем файлы foreach (var a in Files) { if (asAttach) { mail.AddAttach(new MemoryStream(a.Data), a.FileName); } else { if (!Ziped) // не будем совать в тело zip файл { var s = new StreamReader(new MemoryStream(a.Data)); mail.AppendBody(s.ReadToEnd()); s.Close(); } } } // ставим подпись var mailSignature = ProcessSqlMacro(GetParamValue(EpsTaskParams.MailSignature, defaultValue: Settings.Default.MailSignature)); mail.AppendBody(newLine + mailSignature); // отправляем mail.Send(); var logger = LogManager.GetLogger(GetType()); logger.Info(string.Format("Mail '{0}' send to '{1}'.", mailSubject, string.Join(", ", sendTo))); } }
private void CreateReports(string userName) { //проверяем есть ли параметры задающие файлы отчета? if (_output.ReportParams == null || !_output.ReportParams.Any(p => p != null && p.OutputParamCode.To(EpsTaskParams.None) == EpsTaskParams.EpsReport)) { return; } //Формируем более "дружественную" коллекцию параметров отчета var reportParams = _output.ReportParams.Where(p => p != null) .Select(p => new { Code = p.OutputParamCode, ParamType = p.OutputParamCode.To(EpsTaskParams.None), Value = p.OutputParamValue, Subvalue = p.OutputParamSubvalue, }) .Distinct() .ToArray(); Func <EpsTaskParams, string, string> getValueHandler = (parType, epsreport) => { //1. Проверяем на заполнение поле Subvalue. var result = reportParams .Where(p => p.ParamType == parType && p.Subvalue.EqIgnoreCase(epsreport)) .Select(p => p.Value) .FirstOrDefault(); if (result.IsNullOrEmptyAfterTrim()) { //2. Если не нашли берем параметр, у которого поле Subvalue == null result = reportParams .Where(p => p.ParamType == parType && p.Subvalue == null) .Select(p => p.Value) .FirstOrDefault(); } return(result); }; var jobid = _output.GetKey <object>(); var login = _output.Login_R; //Формируем отчеты //Группируем по значению поля Value. foreach (var rep in reportParams.Where(p => p.ParamType == EpsTaskParams.EpsReport && !p.Value.IsNullOrEmptyAfterTrim()).GroupBy(k => k.Value)) { //получаем параметр типа EpsTaskParams.ResultReportFile var resultReportFile = getValueHandler(EpsTaskParams.ResultReportFile, rep.Key); if (resultReportFile.IsNullOrEmptyAfterTrim()) { //TODO: возможно берем еще откуда-нибудь. resultReportFile = EpsHelper.ReportNameMacro; } resultReportFile = ProcessReportFileName(resultReportFile, _output.ReportParams); //получаем параметр типа EpsTaskParams.ChangeODBC. 0 - строку переопределять (переопределяет все подключения в отчете), 1 - строку не переопределять. var changeOdbc = getValueHandler(EpsTaskParams.ChangeODBC, rep.Key).To(0); //получим пользовательский параметр ReportUseODAC var reportUseOdac = EpsHelper.GetReportCustomParameter(Path.GetFileNameWithoutExtension(rep.Key), ReportCpv.ReportUseOdacParameter); var connectionString = changeOdbc == 0 ? Properties.Settings.Default.ConnectionStringOdbc : null; //параметр ReportUseODAC в приоритете if (reportUseOdac.To(0) == 1) { connectionString = Properties.Settings.Default.ConnectionStringOdac; } //инициализация отчета var reportPath = (_output.ReportFileSubfolder_R != null) ? Path.Combine(Properties.Settings.Default.ReportPath, _output.ReportFileSubfolder_R, rep.Key) : Path.Combine(Properties.Settings.Default.ReportPath, rep.Key); var report = new EpsFastReport( EpsHelper.SetFileName(resultReportFile, Path.GetFileNameWithoutExtension(rep.Key)), reportPath, connectionString, Properties.Settings.Default.ArchivePath + "\\frtmp" ); _reports[rep.Key] = report; //получаем параметры типа EpsTaskParams.Variable //это как должно быть var variables = reportParams.Where(p => p.ParamType == EpsTaskParams.None && rep.Key.EqIgnoreCase(p.Subvalue)); foreach (var variable in variables.Where(p => p != null && !p.Value.IsNullOrEmptyAfterTrim())) { report.AddParameters(variable.Code, variable.Value); } //Добавляем в отчет параметр UserCode report.AddParameters("UserCode", userName); _logger.Info(string.Format("Job = '{0}' ('{1}'), EpsReport = '{2}', ResultReportFile = '{3}'.", jobid, login, report.ReportName, resultReportFile)); } }
private void CreateJobFolder() { var currentDate = DateTime.Now; _jobFolder = Path.Combine(Properties.Settings.Default.ArchivePath, currentDate.Year.ToString(CultureInfo.InvariantCulture), currentDate.Month.ToString(CultureInfo.InvariantCulture), currentDate.Day.ToString(CultureInfo.InvariantCulture), EpsHelper.GetKey(_output).ToString()); if (!_reserve) { return; } try { if (!Directory.Exists(_jobFolder)) { Directory.CreateDirectory(_jobFolder); } } catch (Exception ex) { _logger.Error(new DeveloperException(string.Format("Can't crate folder '{0}'.", _jobFolder), ex)); _jobFolder = Properties.Settings.Default.ArchivePath; } }