示例#1
0
        public void SendNotify(int wish_id)
        {
            using (ReportScheduleEntities db = new ReportScheduleEntities())
            {
                Wishes w = db.Wishes.Where(x => x.wish_id == wish_id).SingleOrDefault();

                string email   = db.Users.Where(x => x.user_id == w.wish_user_id).SingleOrDefault().user_email;
                string subject = w.wish_report_type_name;

                StringBuilder param = new StringBuilder();

                XmlSerializer serializer = new XmlSerializer(typeof(ReportModel));
                using (TextReader reader = new StringReader(w.wish_report_type_xml))
                {
                    ReportModel report = (ReportModel)serializer.Deserialize(reader);

                    if (report.Parameters.Count != 0)
                    {
                        foreach (var p in report.Parameters)
                        {
                            param.AppendLine("\t" + p.ParameterAlias + " : " + p.ParameterValue);
                        }
                    }
                    else
                    {
                        param.AppendLine("\t нет");
                    }
                }

                var ru   = CultureInfo.GetCultureInfo("ru-RU");
                var body = new StringBuilder();

                if (db.Tasks.Where(x => x.task_wish_id == wish_id && x.task_status == "done").Count() == 0)
                {
                    body.AppendLine("ПРОВАЛ!!");
                    body.AppendLine().AppendLine("ПРОВАЛЕНО задание на выгрузку отчета \"" + w.wish_report_type_name + "\", созданному Вами " + w.wish_createdate.Day.ToString() + " " + ru.DateTimeFormat.MonthGenitiveNames[w.wish_createdate.Month - 1] + " " + w.wish_createdate.Year.ToString() + " году в " + w.wish_createdate.ToString("HH:mm") + ".");
                    body.AppendLine().AppendLine("Никаких данных извлечь не удалось. Для более подробной информации об ошибке зайдите на страницу \"Мониторинг\" в веб-приложении \"Планировщик отчетов\".");
                    body.AppendLine().AppendLine("ИНФОРМАЦИЯ:");
                    body.AppendLine("Параметры:");
                    body.AppendLine(param.ToString());
                }
                else
                {
                    body.AppendLine("Тук-тук!");
                    body.AppendLine().AppendLine("С пылу с жару готов отчет \"" + w.wish_report_type_name + "\" по заданию, созданному Вами " + w.wish_createdate.Day.ToString() + " " + ru.DateTimeFormat.MonthGenitiveNames[w.wish_createdate.Month - 1] + " " + w.wish_createdate.Year.ToString() + " году в " + w.wish_createdate.ToString("HH:mm"));
                    body.AppendLine().AppendLine("ИНФОРМАЦИЯ:");
                    body.AppendLine("Параметры:");
                    body.AppendLine(param.ToString());
                    body.AppendLine().AppendLine("Скачать отчет Вы можете по ссылке: " + GetPathExcelFile(wish_id));
                }

                body.AppendLine().AppendLine("С уважением, центр «Мои Документы».");
                body.AppendLine().AppendLine("---");
                body.AppendLine("Данное сообщение сформировано автоматически. Пожалуйста, не отвечайте на него.");
                body.AppendLine("УВЕДОМЛЕНИЕ О КОНФИДЕНЦИАЛЬНОСТИ: Это электронное сообщение и любые документы, приложенные к нему, содержат конфиденциальную информацию. Настоящим уведомляем Вас о том, что если это сообщение не предназначено Вам, использование, копирование, распространение информации, содержащейся в настоящем сообщении, а также осуществление любых действий на основе этой информации, строго запрещено. Если Вы получили это сообщение по ошибке, пожалуйста, сообщите об этом отправителю по электронной почте и удалите это сообщение.");
                body.AppendLine();

                SendMail(email, subject, body);
            }
        }
示例#2
0
        private bool CheckWishFail(Wishes w)
        {
            using (ReportScheduleEntities db = new ReportScheduleEntities())
            {
                if (db.Tasks.Where(x => x.task_wish_id == w.wish_id && x.task_status == "fail").Count() == 0)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#3
0
        private async void ReportRequestAsync(Wishes w)
        {
            var tasks = new List <Task>();

            using (ReportScheduleEntities db = new ReportScheduleEntities())
            {
                foreach (Tasks t in db.Tasks.Where(x => x.task_wish_id == w.wish_id && x.task_status != "done" && x.task_status != "fail"))
                {
                    if (System.DateTime.Compare(t.task_startdate, System.DateTime.Now) > 0)
                    {
                        t.task_status = "wait";
                        continue;
                    }

                    t.task_number_attempts = t.task_number_attempts ?? 0;

                    //Превышено количество попыток
                    if ((w.wish_total_attempts != null) && (t.task_number_attempts >= w.wish_total_attempts))
                    {
                        t.task_last_error_text = t.task_last_error_text ?? "";
                        t.task_last_error_text = "Исчерпано количество попыток выгрузки отчета. " + t.task_last_error_text;
                        t.task_status          = "fail";
                        continue;
                    }

                    tasks.Add(Task.Run(() => ReportRequest(t.task_id, w.wish_report_type_xml)));
                }
                db.SaveChanges();

                Task task_wait = Task.WhenAll(tasks);

                try
                {
                    await task_wait;
                }
                catch { }

                Wishes wish = db.Wishes.Where(x => x.wish_id == w.wish_id).FirstOrDefault();
                wish.wish_status = CheckWishDone(wish) ? CheckWishFail(wish) ? "fail": "done" : "wait";
                db.SaveChanges();
                if ((wish.wish_status == "done") || (wish.wish_status == "fail"))
                {
                    try
                    {
                        SendNotify(wish.wish_id);
                    }
                    catch
                    {
                        WriteOnStory("Не удалось отправить письмо по email! Что-то с почтовым сервером!");
                    }
                }
            }
        }
示例#4
0
        //Проверка на успешное завершение задания
        private bool CheckWishDone(Wishes w)
        {
            using (ReportScheduleEntities db = new ReportScheduleEntities())
            {
                if (db.Tasks.Where(x => x.task_wish_id == w.wish_id && x.task_status != "done" && x.task_status != "fail").Count() == 0)
                {
                    WriteOnStory("Задание на выгрузку отчета \"" + w.wish_report_type_name + "\" завершено.");

                    return(true);
                }
            }

            return(false);
        }
示例#5
0
 //Проверка задания на дедлайн
 private bool CheckDeadline(Wishes w)
 {
     using (ReportScheduleEntities db = new ReportScheduleEntities())
     {
         if (System.DateTime.Compare(w.wish_deadline, System.DateTime.Now) <= 0)
         {
             WriteOnStory("Задание на выгрузку отчета \"" + w.wish_report_type_name + "\" провалено. Прошел срок исполнения.");
             if (db.Tasks.Where(x => x.task_wish_id == w.wish_id && x.task_status != "done").Count() != 0)
             {
                 //Всем не завершенным задачам ставим статус "провала"
                 foreach (Tasks t in db.Tasks.Where(x => x.task_wish_id == w.wish_id && x.task_status != "done" && x.task_status != "fail"))
                 {
                     t.task_last_error_text = t.task_last_error_text ?? "";
                     t.task_last_error_text = "Прошел срок выполнения выгрузки отчета. " + t.task_last_error_text;
                     t.task_status          = "fail";
                     WriteOnStory("Прошел срок выполнения выгрузки отчета \"" + w.wish_report_type_name + "\" для " + db.Places.Where(x => x.place_id == t.task_place_id).FirstOrDefault().place_name);
                 }
                 db.SaveChanges();
             }
             return(false);
         }
     }
     return(true);
 }
示例#6
0
        private void GetWishes()
        {
            System.Threading.Thread.Sleep(1000);

            using (ReportScheduleEntities db = new ReportScheduleEntities())
            {
                try
                {
                    Wishes w = null;
                    foreach (Wishes item in db.Wishes.Where(x => x.wish_status != "not_ready" && x.wish_status != "done" && x.wish_status != "fail" && x.wish_status != "work"))
                    {
                        //Задача в ожидании
                        if (item.wish_status == "wait")
                        {
                            //Проверка прошло ли время
                            foreach (Tasks t in db.Tasks.Where(x => x.task_wish_id == item.wish_id && ((x.task_status == "wait") || (x.task_status == "new"))))
                            {
                                if (System.DateTime.Compare(t.task_startdate, System.DateTime.Now) <= 0)
                                {
                                    w = item;
                                    break;
                                }
                                else
                                {
                                    if (t.task_status == "new")
                                    {
                                        t.task_status = "wait";
                                    }
                                }
                            }
                        }
                        else
                        {
                            w = item;
                        }
                        if (w != null)
                        {
                            break;
                        }
                    }
                    db.SaveChanges();

                    if (w != null)
                    {
                        if (w.wish_status != "wait")
                        {
                            WriteOnStory("Найдено задание на выгрузку отчета \"" + w.wish_report_type_name + "\".");
                        }

                        //Проверка задачи на дедлайн
                        w.wish_status = CheckDeadline(w) ? "work" : "fail";
                        db.SaveChanges();

                        if (w.wish_status == "fail")
                        {
                            SendNotify(w.wish_id);
                            return;
                        }

                        Task.Run(() => doWork(w));
                    }
                }
                catch
                {
                    WriteOnStory("Не удалось подключиться к БД ReportSchedule. Попытка подключения через 1 минуту!");
                    System.Threading.Thread.Sleep(60000);
                    return;
                }
            }
        }
示例#7
0
 private void doWork(Wishes w)
 {
     ReportRequestAsync(w);
 }