Здравствуйте. Подскажите пожалуйста как создать БП который будет отправлять на почту сотрудка сообщение что у него есть просроченные задачи?
Нравится
Самое простое что приходит в голову:
старт = добавление активности —> таймер(на, допустим 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> " + table.Columns[i].Caption + " </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;
}