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();
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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);
                }
            }
        }