Ejemplo n.º 1
0
        public void Temporary_task_should_not_contains_triggers()
        {
            var service = ScheduleHelper.GetService();
            var folder  = ScheduleHelper.GetReportsFolder(service);

            ScheduleHelper.DeleteTask(folder, 100, "GR");
            ScheduleHelper.DeleteTask(folder, 1, "temp");

            var task = ScheduleHelper.GetTaskOrCreate(service, folder, 100, "", "GR");

            ScheduleHelper.SetTaskEnableStatus(100, true, "GR");
            var definition = task.Definition;
            var trigger    = new WeeklyTrigger {
                DaysOfWeek    = DaysOfTheWeek.Friday,
                WeeksInterval = 1,
                StartBoundary = DateTime.Now
            };

            definition.Triggers.Add(trigger);
            ScheduleHelper.UpdateTaskDefinition(service, folder, Convert.ToUInt64(100), definition, "GR");

            task = ScheduleHelper.FindTask(service, folder, 100, "GR");
            Assert.That(task.Definition.Triggers.Count, Is.EqualTo(1));
            var temp = Report.CreateTemporaryTaskForRunFromInterface(service, folder, task, "cmd /c echo");

            Assert.That(temp.Definition.Triggers.Count, Is.EqualTo(0));
        }
        public void Set_shedule_month()
        {
            var report = CreateReport("Mixed");

            Open($"/Reports/schedule.aspx?r={report.GeneralReport.Id}");

            Click("Добавить ежемесячное расписание");
            //Чекбоксы должны быть выбраны по-умолчанию, но на всякий случай оставляю код
            //browser.Div("firstSixMonth").ChildOfType<CheckBox>(box => !box.Checked).Checked = true;
            //browser.Div("firstFifteenDays").ChildOfType<CheckBox>(box => !box.Checked).Checked = true;
            Click("Применить");
            AssertText("Временной промежуток от 23:00 до 4:00 является недопустимым для времени выполнения отчета");
            var text = browser.FindElementsByCssSelector("input[type=\"text\"]").First(x => x.GetAttribute("value") == "0:00");

            text.Clear();
            text.SendKeys("10:00");
            Click("Применить");
            AssertNoText("Временной промежуток от 23:00 до 4:00 является недопустимым для времени выполнения отчета");
            AssertText("Задать расписание для отчета");

            var taskService   = ScheduleHelper.GetService();
            var reportsFolder = ScheduleHelper.GetReportsFolder(taskService);
            var currentTask   = ScheduleHelper.GetTaskOrCreate(taskService, reportsFolder, report.GeneralReport.Id, "", "GR");

            Assert.That(currentTask.Definition.Settings.RestartCount == 3);
            Assert.That(currentTask.Definition.Settings.RestartInterval == new TimeSpan(0, 15, 0));
            Assert.That(currentTask.Definition.Settings.StartWhenAvailable);
            Click(By.CssSelector(".deleteMonthItem"));
            Click("Применить");
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(Request["TemporaryId"]))
            {
                Response.Redirect("base.aspx");
            }
            else
            {
                uint contactOwnerId;
                if (uint.TryParse(ConfigurationManager.AppSettings["ReportsContactGroupOwnerId"], out contactOwnerId))
                {
                    try {
                        _reportsContactGroupOwner = ContactGroupOwner.Find(contactOwnerId);
                    }
                    catch (NotFoundException exp) {
                        throw new ReportTunerException("В файле Web.Config параметр ReportsContactGroupOwnerId указывает на несуществующую запись.", exp);
                    }
                }
                else
                {
                    throw new ReportTunerException("В файле Web.Config параметр ReportsContactGroupOwnerId не существует или настроен некорректно.");
                }

                _generalReport = GeneralReport.Find(Convert.ToUInt64(Request["TemporaryId"]));
                _taskService   = ScheduleHelper.GetService();
                _currentTask   = ScheduleHelper.GetTaskOrCreate(
                    _taskService,
                    ScheduleHelper.GetReportsFolder(_taskService),
                    _generalReport.Id,
                    "Временный отчет, созданный " + _generalReport.TemporaryCreationDate.Value.ToString(), "GR");

                btnRun.Enabled = _currentTask.Enabled && (_currentTask.State != TaskState.Running);
                btnRun.Text    = (_currentTask.State == TaskState.Running) ? StatusNotRunning : StatusRunning;

                if ((_generalReport.ContactGroup == null) && btnRun.Enabled)
                {
                    btnRun.Enabled = false;
                }

                if (!IsPostBack)
                {
                    ClearSearch();
                    if (_generalReport.ContactGroup != null)
                    {
                        lContactGroupName.Text = _generalReport.ContactGroup.Name;
                    }
                }
            }
        }
        public void CurrentTaskStartReport()
        {
            var report = CreateReport("Mixed");

            Open($"/Reports/schedule.aspx?r={report.GeneralReport.Id}");
            Click("Выполнить задание");

            Thread.Sleep(500);

            var taskService   = ScheduleHelper.GetService();
            var reportsFolder = ScheduleHelper.GetReportsFolder(taskService);
            var currentTask   = ScheduleHelper.GetTaskOrCreate(taskService, reportsFolder, report.GeneralReport.Id, "", "GR");

            Assert.That(((ExecAction)currentTask.Definition.Actions[0]).Arguments, Does.Contain("manual:true"));
        }
Ejemplo n.º 5
0
        public void RunTask()
        {
            var taskService   = ScheduleHelper.GetService();
            var reportsFolder = ScheduleHelper.GetReportsFolder(taskService);
            var currentTask   = ScheduleHelper.GetTaskOrCreate(taskService, reportsFolder, 1, "Это тестовый отчет Морозова (Рейтинг)", "GR");

            currentTask.Run();
            Thread.Sleep(500);
            if (currentTask != null)
            {
                currentTask.Dispose();
                currentTask = null;
            }
            if (taskService != null)
            {
                taskService.Dispose();
                taskService = null;
            }
        }
        protected void btnFinish_Click(object sender, EventArgs e)
        {
            if (_currentTask != null)
            {
                _currentTask.Dispose();
                _currentTask = null;
            }

            ScheduleHelper.DeleteTask(ScheduleHelper.GetReportsFolder(_taskService), _generalReport.Id, "GR");

            //Закончили работу с задачами
            if (_taskService != null)
            {
                _taskService.Dispose();
                _taskService = null;
            }

            //Удаляем отчет
            using (new TransactionScope()) {
                _generalReport.Delete();
            }

            Response.Redirect("base.aspx");
        }
Ejemplo n.º 7
0
    protected void Page_Load(object sender, EventArgs e)
    {
        if ((Request.UrlReferrer == null || !Request.UrlReferrer.LocalPath.Contains("Schedule.aspx")) && Session["StartTaskTime"] != null)
        {
            Session.Remove("StartTaskTime");
        }

        if (Request["r"] == null)
        {
            Response.Redirect("GeneralReports.aspx");
        }

        _generalReport = GeneralReport.Find(Convert.ToUInt64(Request["r"]));

        taskService           = ScheduleHelper.GetService();
        reportsFolder         = ScheduleHelper.GetReportsFolder(taskService);
        currentTask           = ScheduleHelper.GetTaskOrCreate(taskService, reportsFolder, _generalReport.Id, _generalReport.Comment, "GR");
        currentTaskDefinition = currentTask.Definition;

        tempTask = ScheduleHelper.FindTaskNullable(reportsFolder, _generalReport.Id, "temp_");
        TaskState tempTaskState;
        string    tempTaskDescription = string.Empty;

        if (tempTask != null)
        {
            tempTaskState       = tempTask.State;
            tempTaskDescription = tempTask.Definition.RegistrationInfo.Description;
        }
        else
        {
            tempTaskState = TaskState.Unknown;
        }

        btnExecute.Enabled = currentTask.State != TaskState.Running && tempTaskState != TaskState.Running;
        btnExecute.Text    = (currentTask.State == TaskState.Running) ? StatusNotRunning : StatusRunning;

        var userName = HttpContext.Current.User.Identity.Name.Replace(@"ANALIT\", string.Empty);

        ErrorMassage.Text     = string.Empty;
        ErrorMassage.CssClass = "error";

        var description = tempTaskState == TaskState.Running ? string.Format("(запустил: {0})", tempTaskDescription) : string.Empty;

        if (tempTaskState == TaskState.Running || currentTask.State == TaskState.Running)
        {
            ExecAction action = null;
            var        currentReportNumber = "";
            ulong      runningNumber       = 0;
            if (tempTaskState == TaskState.Running)
            {
                if (tempTask != null)
                {
                    action = (ExecAction)tempTask.Definition.Actions.FirstOrDefault();
                }
            }
            else
            {
                action = (ExecAction)currentTask.Definition.Actions.FirstOrDefault();
            }
            if (action != null)
            {
                var arguments = (action).Arguments;
                if (!String.IsNullOrEmpty(arguments))
                {
                    if (arguments.IndexOf("/gr:") >= 0)
                    {
                        var substring    = arguments.Substring(arguments.IndexOf("/gr:") + 4);
                        var numberLength = substring.IndexOf(@" /");
                        var reportNumber = substring.Substring(0, numberLength != -1 ? numberLength : substring.Length);
                        if (!String.IsNullOrEmpty(reportNumber))
                        {
                            currentReportNumber += " № ";
                            currentReportNumber += reportNumber;
                            ulong.TryParse(reportNumber, out runningNumber);
                        }
                    }
                }
            }
            var startTime = GetStartTime(DbSession, runningNumber != 0 ? runningNumber : _generalReport.Id);

            var prefix = tempTaskState == TaskState.Running ? String.Format("Успешно запущен разовый отчет{0}", currentReportNumber)
                                : String.Format("Отчет запущен ({0})", currentReportNumber);
            if (tempTaskDescription == userName || currentTask.State == TaskState.Running)
            {
                ErrorMassage.Text      = string.Format("{0}, ожидайте окончания выполнения операции. {1}", prefix, startTime);
                ErrorMassage.BackColor = Color.LightGreen;
            }
            else
            {
                ErrorMassage.Text      = String.Format("{1}, выполнение данного отчета отложено {0}. {2}", description, prefix, startTime);
                ErrorMassage.BackColor = Color.Red;
            }
            btn_Mailing.Enabled = false;
            RadioSelf.Enabled   = false;
            RadioMails.Enabled  = false;
        }
        if (tempTaskState == TaskState.Queued || currentTask.State == TaskState.Queued)
        {
            var prefix = tempTaskState == TaskState.Running ? "Запускается разовый отчет" : "Отчет запускается";
            if (tempTaskDescription == userName || currentTask.State == TaskState.Queued)
            {
                ErrorMassage.Text      = string.Format("{0}, ожидайте окончания выполнения операции", prefix);
                ErrorMassage.BackColor = Color.LightGreen;
            }
            else
            {
                ErrorMassage.Text      = string.Format("{1} {0}, выполнение данного отчета отложено)", description, prefix);
                ErrorMassage.BackColor = Color.Red;
            }
            btn_Mailing.Enabled = false;
            RadioSelf.Enabled   = false;
            RadioMails.Enabled  = false;
        }
        if ((tempTaskState == TaskState.Ready && currentTask.State != TaskState.Running && currentTask.State != TaskState.Queued) ||
            (currentTask.State == TaskState.Ready && tempTaskState != TaskState.Running && tempTaskState != TaskState.Queued))
        {
            if (tempTaskDescription == userName || currentTask.State == TaskState.Ready)
            {
                // отчет выполнен
                if (Session["StartTaskTime"] != null)
                {
                    Session.Remove("StartTaskTime");
                    ErrorMassage.Text      = "Операция выполнена";
                    ErrorMassage.BackColor = Color.LightGreen;
                }
                else
                {
                    ErrorMassage.Text = "";
                }
            }
        }

        if ((tempTaskState == TaskState.Disabled && currentTask.State != TaskState.Running && currentTask.State != TaskState.Queued) ||
            (currentTask.State == TaskState.Disabled && tempTaskState != TaskState.Running && tempTaskState != TaskState.Queued))
        {
            if (Session["StartTaskTime"] != null)
            {
                Session.Remove("StartTaskTime");
                ErrorMassage.Text      = "Операция отменена";
                ErrorMassage.BackColor = Color.Red;
            }
            else
            {
                ErrorMassage.Text = "";
            }
        }

        var otherTriggers = new List <Trigger>();

        if (!IsPostBack)
        {
            var selfMail = GetSelfEmails();
            if ((selfMail.Count != 0) && (selfMail[0].Length != 0))
            {
                RadioSelf.Text = "Выполнить и отослать на: " + selfMail[0][0];
            }

            dtFrom.Value   = DateTime.Now.AddDays(-7).ToShortDateString();
            dtTo.Value     = DateTime.Now.ToShortDateString();
            mail_Text.Text = GetMailingAdresses();

            try {
                lblClient.Text        = _generalReport.Payer.Id + " - " + _generalReport.Payer.ShortName;
                lblReportComment.Text = _generalReport.Comment;
                var lastLogTimes = ObjectFromQuery(new[] { new MySqlParameter("?GeneralReportCode", _generalReport.Id) },
                                                   @"
SELECT
  Max(LogTime) as MaxLogTime
FROM
  logs.reportslogs
WHERE
  reportslogs.GeneralReportCode = ?GeneralReportCode
");
                if ((lastLogTimes.Count > 0) && (lastLogTimes[0].Length > 0))
                {
                    if (lastLogTimes[0][0] is DateTime)
                    {
                        MyCn.Open();
                        MyCmd.CommandText = @"
SELECT
  LogTime,
  EMail,
  SMTPID
FROM
  logs.reportslogs
WHERE
	reportslogs.GeneralReportCode = ?GeneralReportCode
and reportslogs.LogTime > ?LastLogTime
order by LogTime desc
";
                        MyCmd.Parameters.AddWithValue("?LastLogTime", ((DateTime)lastLogTimes[0][0]).AddDays(-1).Date);
                        var _logs = new DataTable();
                        MyDA.Fill(_logs);
                        gvLogs.DataSource = _logs;
                    }
                }
                gvLogs.DataBind();

                MyCmd.Parameters.Clear();
                MyCmd.CommandText = @"select
rel.StartTime,
if (not EndError, rel.EndTime, 'Ошибка при формировании отчета') as EndTime
from `logs`.reportexecutelogs rel
where rel.GeneralReportCode = ?GeneralReportCode
order by StartTime desc
limit 15;";
                MyCmd.Parameters.AddWithValue("?GeneralReportCode", _generalReport.Id);

                var startlogs = new DataTable();
                MyDA.Fill(startlogs);
                startLogs.DataSource = startlogs;

                startLogs.DataBind();
            }
            finally {
                MyCn.Close();
            }

            chbAllow.Checked = currentTask.Enabled;
            lblWork.Text     = ((ExecAction)currentTask.Definition.Actions[0]).Path + " " + ((ExecAction)currentTask.Definition.Actions[0]).Arguments;
            lblFolder.Text   = ((ExecAction)currentTask.Definition.Actions[0]).WorkingDirectory;
            if (_generalReport.FirmCode != null)
            {
                var ftpId = _generalReport.FirmCode.ToString().PadLeft(3, '0');
                FtpPath.Text = $"ftp://ftp.analit.net/OptBox/{ftpId}/Reports/";
            }
            else
            {
                FtpPath.Text = "";
            }
            var tl = currentTask.Definition.Triggers;

            for (int i = 0; i < tl.Count; i++)
            {
                if (tl[i] is WeeklyTrigger)
                {
                    var dr      = DS.Tables[dtSchedule.TableName].NewRow();
                    var trigger = ((WeeklyTrigger)tl[i]);
                    dr[SStartHour.ColumnName]   = trigger.StartBoundary.Hour;
                    dr[SStartMinute.ColumnName] = trigger.StartBoundary.Minute;
                    var days = trigger.DaysOfWeek;

                    SetWeekDays(dr, DaysOfTheWeek.Monday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Tuesday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Wednesday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Thursday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Friday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Saturday, days);
                    SetWeekDays(dr, DaysOfTheWeek.Sunday, days);

                    DS.Tables[dtSchedule.TableName].Rows.Add(dr);
                }
                else if (tl[i] is MonthlyTrigger)
                {
                    var dr = DS.Tables[dtScheduleMonth.TableName].NewRow();
                    //очищаем таблицу от значений по умолчанию
                    for (var k = 1; k <= 31; k++)
                    {
                        dr["d" + k] = 0;
                    }
                    for (var k = 1; k <= 12; k++)
                    {
                        dr["m" + k] = 0;
                    }

                    var trigger = ((MonthlyTrigger)tl[i]);
                    dr[MSStartHour.ColumnName]   = trigger.StartBoundary.Hour;
                    dr[MSStartMinute.ColumnName] = trigger.StartBoundary.Minute;
                    var             months = trigger.MonthsOfYear;
                    MonthsOfTheYear month;
                    for (int j = 0; j < 12; j++)
                    {
                        MonthsOfTheYear.TryParse((1 << j).ToString(), true, out month);
                        if (months.HasFlag(month))
                        {
                            dr["m" + (j + 1)] = 1;
                        }
                    }
                    foreach (int em in trigger.DaysOfMonth)
                    {
                        dr["d" + em] = 1;
                    }
                    DS.Tables[dtScheduleMonth.TableName].Rows.Add(dr);
                }
                else
                {
                    otherTriggers.Add(tl[i]);
                }
            }

            DS.Tables[dtSchedule.TableName].AcceptChanges();
            dgvSchedule.DataSource = DS;
            dgvSchedule.DataMember = dtSchedule.TableName;
            dgvSchedule.DataBind();

            dgvScheduleMonth.DataSource = DS;
            dgvScheduleMonth.DataMember = dtScheduleMonth.TableName;
            dgvScheduleMonth.DataBind();

            gvOtherTriggers.DataSource = otherTriggers;
            gvOtherTriggers.DataBind();

            Session[DSSchedule] = DS;

            CloseTaskService();
        }
        else
        {
            DS = ((DataSet)Session[DSSchedule]);
            if (DS == null)             // вероятно, сессия завершилась и все ее данные утеряны
            {
                Reports_GeneralReports.Redirect(this);
            }
        }

        send_created_report.Visible = _generalReport.IsSuccessfulyProcessed;
    }
Ejemplo n.º 8
0
        public static bool ProcessReport(int generalReportId, bool manual, bool interval, DateTime dtFrom, DateTime dtTo)
        {
            var           result    = false;
            var           reportLog = new ReportExecuteLog();
            GeneralReport report    = null;

            using (var session = GeneralReport.Factory.OpenSession())
                using (var mc = new MySqlConnection(ConnectionHelper.GetConnectionString())) {
                    mc.Open();
                    try {
                        var timeout = ConfigurationManager.AppSettings["MySqlTimeout"];
                        if (!String.IsNullOrEmpty(timeout))
                        {
                            mc.Execute($"set interactive_timeout={timeout};set wait_timeout={timeout};");
                        }
                        using (var trx = session.BeginTransaction()) {
                            reportLog.GeneralReportCode = generalReportId;
                            reportLog.StartTime         = DateTime.Now;
                            session.Save(reportLog);
                            trx.Commit();
                        }

                        report = session.Get <GeneralReport>((uint)generalReportId);
                        if (report == null)
                        {
                            throw new Exception($"Отчет с кодом {generalReportId} не существует.");
                        }
                        if (!report.Enabled && !manual)
                        {
                            throw new ReportException("Невозможно выполнить отчет, т.к. отчет выключен.");
                        }

                        _log.DebugFormat("Запуск отчета {0}", report.Id);
                        report.ProcessReports(reportLog, mc, interval, dtFrom, dtTo);
                        _log.DebugFormat("Отчет {0} выполнился успешно", report.Id);

                        using (var trx = session.BeginTransaction()) {
                            reportLog.EndTime = DateTime.Now;
                            trx.Commit();
                        }
                        result = true;
                    }
                    catch (Exception e) {
                        if (e is ReportException)
                        {
                            _log.Warn($"Ошибка при выполнении отчета {report}", e);
                        }
                        else
                        {
                            _log.Error($"Ошибка при выполнении отчета {report}", e);
                        }

                        try {
                            using (var trx = session.BeginTransaction()) {
                                reportLog.EndError = true;
                                session.Save(reportLog);
                                trx.Commit();
                            }
                        }
                        catch (Exception ex) {
                            _log.Error("Не удалось запротоколировать ошибку", ex);
                        }

                        var reportEx = e as ReportException;
                        if (reportEx != null)
                        {
                            Mailer.MailReportErr(reportEx.ToString(), reportEx.Payer, report.Id, reportEx.SubreportCode, reportEx.ReportCaption);
                            result = true;
                        }
                        else
                        {
                            Mailer.MailGeneralReportErr(report, e);
                        }
                    } finally {
                        //не уверен почему так но восстанавливаем состояние задачи только если отчет не выключен
                        //этого требует тест ProgramTest но логика мне не понятна
                        //подозрительно тк раньше это работало тк переменная была null и блок валился с исключением
                        if (report != null && report.Enabled)
                        {
                            ScheduleHelper.SetTaskAction(report.Id, "/gr:" + report.Id);
                            ScheduleHelper.SetTaskEnableStatus(report.Id, report.Enabled, "GR");
                            var taskService   = ScheduleHelper.GetService();
                            var reportsFolder = ScheduleHelper.GetReportsFolder(taskService);
                            ScheduleHelper.DeleteTask(reportsFolder, report.Id, "temp_");
                        }
                    }
                    return(result);
                }
        }