public void Execute(IJobExecutionContext context) { var key = context.JobDetail.Key; // jparam хранит параметры отчета, неспецифические к моменту запуска var report = (Report)context.JobDetail.JobDataMap["param"]; // tparam хранит временнЫе параметы var interval = (TriggerParam)context.Trigger.JobDataMap["tparam"]; if (interval is IInterval && report is IInterval) { ((IInterval)report).DateFrom = ((IInterval)interval).DateFrom; ((IInterval)report).DateTo = ((IInterval)interval).DateTo; } else { ((INotInterval)report).DateFrom = ((INotInterval)interval).DateFrom; } logger.Info($"Start running job {key.Group} {key.Name}"); try { report.Run(key, interval); } catch (Exception e) { logger.Error($"Job {key.Group} {key.Name} run failed:" + e.Message, e); var db = new producerinterface_Entities(); // вытащили расширенные параметры задачи var jext = db.jobextend.Single(x => x.JobName == key.Name && x.JobGroup == key.Group && x.Enable); // отправили статус об ошибке отчета jext.DisplayStatusEnum = DisplayStatus.Error; jext.LastRun = DateTime.Now; db.SaveChanges(); var ip = "неизвестен (авт. запуск)"; if (interval is RunNowParam) { ip = ((RunNowParam)interval).Ip; } var user = db.Account.First(x => x.Id == interval.UserId); user.IP = ip; var mail = new EmailSender(db, new Context(), user); mail.SendReportErrorMessage(jext, e.Message); return; } logger.Info($"Job {key.Group} {key.Name} run finished"); }
/// <summary> /// проверка наличия пермишена в БД и добавление в случае отсутствия /// </summary> private void AddPermission(TypeUsers accessType) { var type = (sbyte)accessType; var permissionExsist = DB.AccountPermission.Any(x => x.TypePermission == type && x.ControllerAction == permissionName && x.ActionAttributes == controllerAcctributes); // пермишен есть в БД, добавлять ничего не требуется if (permissionExsist) { return; } // если пермишена в БД нет, то добаляем пермишен к группе администраторов // проверим наличие группы "Администраторы" var adminGroupName = ConfigurationManager.AppSettings["AdminGroupName"]; // убрал условие Enabled потому что группа будет создана заново, если disabled var adminGroup = DB.AccountGroup.SingleOrDefault(x => x.Name == adminGroupName && x.TypeGroup == type); // добавляем новый доступ var newPermission = new AccountPermission { ControllerAction = permissionName, ActionAttributes = controllerAcctributes, TypePermission = type, Enabled = true, Description = "новый пермишен" }; DB.AccountPermission.Add(newPermission); DB.SaveChanges(); // добавляем его к группе Администраторы adminGroup.AccountPermission.Add(newPermission); var date = DateTime.Now; foreach (var user in adminGroup.Account) { user.LastUpdatePermisison = date; } DB.SaveChanges(); }
public void Start() { var permissions = db.AccountPermission.ToList(); db.AccountGroup.Where(s => s.Name == "Администраторы").ToList() .Each(u => { permissions.Each(f => { if (!u.AccountPermission.ToList().Any(s => s.Id == f.Id)) { u.AccountPermission.Add(f); } }); }); db.SaveChanges(); }
public void Process(JobKey key, Report report, TriggerParam tparam) { // записали в историю запусков string mailTo = null; if (tparam.MailTo != null && tparam.MailTo.Count > 0) { mailTo = String.Join(",", tparam.MailTo); } var reportRunLog = new ReportRunLog() { JobName = key.Name, RunNow = false, MailTo = mailTo, AccountId = tparam.UserId }; // записали IP только для ручного запуска var ip = "неизвестен (авт. запуск)"; if (tparam is RunNowParam) { ip = ((RunNowParam)tparam).Ip; reportRunLog.Ip = ip; reportRunLog.RunNow = true; } db.ReportRunLog.Add(reportRunLog); db.SaveChanges(); // вытащили расширенные параметры задачи var jext = db.jobextend.Single(x => x.JobName == key.Name && x.JobGroup == key.Group && x.Enable); // добавили сведения о последнем запуске jext.LastRun = DateTime.Now; db.SaveChanges(); var querySort = report.Read <T>(); var user = db.Account.First(x => x.Id == tparam.UserId); user.IP = ip; var mail = new EmailSender(db, new Context(), user); // действия при пустом отчете if (querySort.Count == 0) { jext.DisplayStatusEnum = DisplayStatus.Empty; db.Entry(jext).State = EntityState.Modified; db.SaveChanges(); mail.SendEmptyReportMessage(jext); return; } var reportRow = (ReportRow)Activator.CreateInstance(_type); querySort = reportRow.Treatment(querySort, report); var shredder = new ObjectShredder <T>(); var dataTable = shredder.Shred(querySort); var headers = report.GetHeaders(_helper); var ds = CreateDataSet(report.CastomName, headers, dataTable); // записали XML var sw = new StringWriter(); ds.WriteXml(sw, XmlWriteMode.WriteSchema); // сохранили в базу var jxml = db.reportxml.SingleOrDefault(x => x.JobName == key.Name && x.JobGroup == key.Group); if (jxml == null) { jxml = new reportxml() { JobName = key.Name, JobGroup = key.Group, SchedName = jext.SchedName, Xml = sw.ToString() }; db.reportxml.Add(jxml); } else { jxml.Xml = sw.ToString(); } // отправили статус, что отчет готов jext.DisplayStatusEnum = DisplayStatus.Ready; db.Entry(jext).State = EntityState.Modified; db.SaveChanges(); // если указаны email - отправляем if (tparam.MailTo != null && tparam.MailTo.Count > 0) { // создали excel-файл var file = CreateExcel(key.Group, key.Name, ds, report); // при автоматическом и ручном запуске разное содержимое письма if (tparam is CronParam) { mail.AutoPostReportMessage(jext, file.FullName, tparam.MailTo); } else if (tparam is RunNowParam) { mail.ManualPostReportMessage(jext, file.FullName, tparam.MailTo); } } }