Здравствуйте. Подскажите пожалуйста как создать БП который будет отправлять на почту сотрудка сообщение что у него есть просроченные задачи?
Нравится
Самое простое что приходит в голову:
старт = добавление активности —> таймер(на, допустим 5 часов) —> считывание активности —> если активность не завершена, то элемент отправить письмо (ответственному по активности) и выход. Если завершена, то выход.
Варфоломеев Данила, это получается, что читается одна активность которую добавили, а хотелось что бы все просроченные активности считывались
Вы имеете ввиду не постановку задачи и контроль ее своевременности решения, а контроль уже существующих задач и считывание их состояния? В своем бизнес-случае я решил следующим образом:
старт-триггер по времени ежедневно в 9:15 -> чтение выборки по обращениям (ну, тут, что вам необходимо) с отбором по состоянию и флагу "просрочен по разрешению" и ответственному -> если больше 0, то отправка письма ответственному, что у него есть просроченные обращения.
Косяк тут в том, что я не нашел как для выборки сформированной без конкретного ответственного "выдрать" всех ответственных и сделать им всем рассылку. Поэтому выполнено с отправкой руководителю.
Никульшина Алёна,
Я расписал "идеальный вариант", если настроить так с самого начала работы системы, то все активности будут анализироваться.
Насчёт считывания активностей: не знаю ни одного адекватного способа работать с циклами в БП с помощью польз. средств.
Единственный вариант — написать скрипттаск с esq запросом, который сделает выборку кол-ва просроченых задач по каждому пользователю, потом отправка письма каждому. Но это программирование логики.
Плотников ДИ пишет:
Косяк тут в том, что я не нашел как для выборки сформированной без конкретного ответственного "выдрать" всех ответственных и сделать им всем рассылку. Поэтому выполнено с отправкой руководителю.
Вот вот. всё упирается в "перебор" =) Эх если бы они это реализовали, а не пилили конструкторы из версии в версию...
Сделайте VIEW, который считает количество просроченных активностей по ответственным. На базе этого VIEW объект.
И уже его используйте в БП.
Владимир Соколов, проблема в том что я не знаю как правильно его сделать
Я делал через С# сценарий, так проще всего. Пример отправки отчёта по просроченным задачам
DataTable table = GetDataTableOnSql(context, @" SELECT Title , COALESCE(Contact.Name, '') AS [Исполнитель] , DATEADD(hour, 3, Activity.CreatedOn) AS [Дата создания задачи] , DATEDIFF(day, Activity.CreatedOn, GETUTCDATE()) AS [Дней в задаче] FROM Activity WITH (NOLOCK) LEFT JOIN Contact WITH (NOLOCK) ON Activity.OwnerId = Contact.Id WHERE Activity... = Как вы считаете, что задача просрочена??? ORDER BY Title " ); string prevTitle = ""; StringBuilder html = new StringBuilder(@"<html><head><style> table { border-collapse: collapse; } th { font-weight:bold; border: solid 1px #DDDDDD; } td { border: solid 1px #DDDDDD; } </style></head><body><strong>" + DateTime.Now.ToShortDateString() + "</strong><br/><br/>"); html.Append("<table><tr>"); for (int i = 1; i < table.Columns.Count; i++) html.Append("<th>&nbsp;&nbsp;" + table.Columns[i].Caption + "&nbsp;&nbsp;</th>"); html.Append("</tr>"); foreach (DataRow row in table.Rows) { string title = (string)row[0]; if (prevTitle != title) { html.Append("<tr><th style=\"text-align:left;\" colspan=\"" + (table.Columns.Count-1).ToString() + "\">"+title+"</th></tr>"); prevTitle = title; } html.Append("<tr>"); for (int i = 1; i < table.Columns.Count; i++) html.Append("<td>" + row[i].ToString() + "</td>"); html.Append("</tr>"); } html.Append("</table><br/><br/>С уважением,<br/>Робот ВРМ<br/></body></html>"); // Send report
Метод GetDataTableOnSql - просто читает DataTable по запросу
public DataTable GetDataTableOnSql(ProcessExecutingContext context, string sqlScript) { DataTable table = new DataTable(); CustomQuery customQuery = new CustomQuery(context.UserConnection, sqlScript); using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) { using (IDataReader dr = customQuery.ExecuteReader(dbExecutor)) { table.Load(dr); } } return table; }