Вопрос

БП по просроченным задачам

Здравствуйте. Подскажите пожалуйста как создать БП который будет отправлять на почту сотрудка сообщение что у него есть просроченные задачи?

Нравится

8 комментариев

Самое простое что приходит в голову:

старт = добавление активности —> таймер(на, допустим 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;
}

 

Показать все комментарии