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); } }
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); }
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! Что-то с почтовым сервером!"); } } } }
//Проверка на успешное завершение задания 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); }
//Проверка задания на дедлайн 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); }
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; } } }
private void doWork(Wishes w) { ReportRequestAsync(w); }