Example #1
0
        public void Preload(string[] parameters)
        {
            Log4NetHelper.Configure("WebApi");
            var log = LogManager.GetLogger(GetType());

            EpsHelper.Initialize();
            log.Info("WarmUp complete");
        }
Example #2
0
        /// <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;
            }
        }
Example #3
0
        /// <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);
                    }
                }
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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.");
            }
        }
Example #7
0
        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();
                }
            }
        }
Example #8
0
        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)));
            }
        }
Example #9
0
        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));
            }
        }
Example #10
0
        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;
            }
        }