Уведомление по связанным инцидентам.

Доброго времени суток, коллеги!

Надо: при изменении состояния инцидента повесить уведомления (напоминалки) ответственным всех связанных инцидентов.
С какой стороны подступиться? Предположительно, в wnd_IncidentEditScript вешаюсь на function dlDataOnDatasetAfterPost, в которой проверяю !ds_incident.IsAppend, получаю перечень связанных инцидентов и их ответственных, навешиваю им напоминалки.
Если общее понимание верно, подскажите, как заполучить перечень связанных инцидентов?

Нравится

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

Здравствуйте, Андрей Борисович!

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Общее понимание верное.
Но IsAppend будет воспринимать любое изменение инцидента. Если же вам надо только состояние, то необходимо создать глобальную переменную, которая будет показывать изменялось ли состояние или нет. В целом, думаю, надо примерно такой скрипт в wnd_IncidentEditScript (если вас интересуют изменения на окне) или ds_IncidentScript (если изменения происходят не только в окне, но из другого скрипта, бизнес-процесса и т.д.)

var IsStatusChanged = false;//переменная показывает было ли изменено состояние
...
function DataChange(DataField) {
        ...
        var Name = DataField.Name;
	switch (Name){
                ...
		case ('StatusID'):
			...
                        IsStatusChanged = true;//состояние было изменено
		        break;
                ...
        }
}
...
function SelfOnDatasetAfterPost(Dataset) {
        ...
        if (!Dataset.IsAppend && IsStatusChanged) {
            //получаем связанные инциденты
            var LinkedIncident = Services.GetNewItemByUSI('ds_Incident');
            LinkedIncident.Close();
            ApplyDatasetFilter(LinkedIncident, 'ParentIncidentID', Dataset('ID'), true);
            LinkedIncident.Open();
            LinkedIncident.GoToFirst();
            while(!LinkedIncident.IsEOF) {
                //здесь по одному получаем связанные инциденты
                //например чтобы получить id связанного инцидента var LinkedIncidentId = LinkedIncident('ID');
                //делаем то, что нужно
 
                LinkedIncident.GoToNext();
            }
        }
}

В function DataChange(DataField) уже есть переменная IncidentEdit.StatusChanged, Попробую её задействовать.
Обращений к Dataset.IsAppend в wnd_IncidentEditScript не обнаружил, поэтому сделал проверку состояния напрямую

Итак, получилось вот такое:

    if (!(Dataset.State == dstInsert) && IncidentEdit.StatusChanged) {
        //получаем связанные инциденты
        var LinkedIncident = Services.GetNewItemByUSI('ds_Incident');
        LinkedIncident.Close();
        ApplyDatasetFilter(LinkedIncident, 'ParentIncidentID', Dataset('ID'), true);
        LinkedIncident.Open();
        LinkedIncident.GoToFirst();
	var Reminding = Services.GetNewItemByUSI('ds_Reminding');
        while(!LinkedIncident.IsEOF) {
            //здесь по одному получаем связанные инциденты
			Reminding.Append();
                        // ID напоминалки
			Reminding('ID') = Connector.GenGUID();
                        // Текст напоминалки
			Reminding('Description') = 'Состояние по инциденту изменилось!';
                        // ID инцидента, вызвавшего всё это
			Reminding('SubjectID') = Dataset('ID');
                        // привязка напоминалки к инциденту
			Reminding('SubjectTypeID') = '{8E742F80-1C1A-4657-8D46-F189F0640544}';
                        // получение адресата напоминалки
			var LinkedIncidentOwnerId = LinkedIncident('OwnerID');
			Reminding('ContactID') = LinkedIncidentOwnerId;
                        // создатель текущего инцидента. И напоминалки
			Reminding('CreatedByID') = Connector.CurrentUser.ContactID;
                        // время, когда выскочит уведомление. Да прямо сейчас!
			Reminding('RemindTime') = new Date(System.Now()).getVarDate();
			Reminding.Post();
 
	        LinkedIncident.GoToNext();
        }
    }	

Работает почти как надо. Одно НО: таки не отрабатывает проверка на состояние датасета: от вновьзанесённых связанных инцидентов также сыпятся уведомления.

Андрей, могу предположить, что на AfterPost у датасета уже состояние не инсерт, так как он уже записался. Может повесить это событие на BeforePost?

Андрей, Вам необходимо фиксировать состояние датасета ранее (не в AfterPost), например, в BeforePost.
Пример кода:

ds_IncidentScript.DatasetState = Dataset.State;

Затем в AfterPost проверять состояние:

if (!(ds_IncidentScript.DatasetState == dstInsert))

Точно! Так оно и оказалось!
Александр, спасибо за помощь!

Наталия, Вам тоже спасибо. Пока перекинул целиком весь фрагмент в BeforePost. Мои тесты прошли успешно. Выкатил изменения на рабочую базу, жду откликов пользователей.

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