Service. Запуск процесса при получении письма по существующему инциденту

Добрый день!

Не получается запустить процесс при получении письма по существующему инциденту.

При получении письма по инциденту запускается процесс «Incoming email registration process».
Если создается новый инцидент, то срабатывает сигнал на добавление активности с заполненным полем Case.
Однако если письмо привязывается к существующему инциденту, то сигнал на изменение поля Case в активности не срабатывает.
В самом процессе происходит вызов функции:

        var helper = ClassFactory.GetIncidentRegistrationFromEmailHelper>(
                new ConstructorArgument("userConnection", userConnection));
        helper.RegisterIncident(activityId);

В классе IncidentRegistrationFromEmailHelper одинаковое действие для новых и существующих инцидентов:

public virtual void RegisterCase(Entity emailEntity) {
var email = new Email(this, emailEntity);
        if (email.IsJunk && !CreateCasesFromJunkEmails) {
                return;
        }
        Entity caseEntity = GetCase(email);
        if (caseEntity == null) {
                caseEntity = CreateNewCaseByEmail(email);
                var copyEntityRightsParams = new SysEntityRightsHelper.CopyEntityRightsParams(emailEntity.SchemaName,
                emailEntity.PrimaryColumnValue, caseEntity.SchemaName, caseEntity.PrimaryColumnValue);
SysEntityRightsHelper.CopyEntityAdministrateByRecordsRights(UserConnection, copyEntityRightsParams);
        }
        emailEntity.SetColumnValue("CaseId", caseEntity.GetTypedColumnValueGuid>("Id"));
        emailEntity.SetColumnValue("IsNeedProcess", false);
        emailEntity.Save();
}

Если же письмо вручную привязать к инциденту, то сигнал ожидаемо срабатывает нормально.

В чем может быть причина такого поведения и как вызвать свой процесс при получении письма по существующему инциденту?

test process

Нравится

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

Добрый день, Владимир!
Вы можете выполнить настройку стартовых сигналов процесса, как это сделано в базовом процессе "Запуск процесса Переоткрытие обращения и отправка email сообщения ответственному о новом комментарии" в версии продукта 7.10.1

Причина указанного Вами поведения в том, что в новых версиях продукта могут уже создаваться активности со связкой с обращением, то есть "Изменение записи" не произойдет.

Вот пример, как можно поступить (Во вложении).

Оптимальный Вариант - это просмотреть вживую, для этого Вы можете очень быстро получить триал для тестирования https://www.terrasoft.ru/trial/bpmonline

Добрый день, Михаил!

"Михайленко Михаил" написал:Причина указанного Вами поведения в том, что в новых версиях продукта могут уже создаваться активности со связкой с обращением, то есть "Изменение записи" не произойдет.

Да, в моем рабочем процессе есть обработка обоих сигналов. И на добавление записи срабатывает, а на изменение - нет.
А в случае связи письма с существующим обращением не приходит сигнал о добавлении записи с заполненным Case, но и не приходит сигнал о заполнении поля Case.

Кстати, проверил - процесс Run process: Reopen case and notify assignee on receiving an answer regarding the case тоже иногда (пока не обнаружили системности) не запускается в этих случаях.
Я проверю еще на чистой триальной версии, но есть подозрение, что AutoEmailRelation может заполнять поле Case "по-тихому"

Пока выглядит так, что когда срабатывает правило связывания, то происходит установка поля Case и при этом сохранении события отключаются, потому и не стартует процесс.
Как это обойти?

public void ProceedRelation(Entity entity) {
			IEnumerable<IRuleRelationModel> rulesForEntity = GetRulesForEntity(entity.Schema.UId);
			bool isContactSearchSuccessfull = false;
			bool isOtherRelation = false;
			foreach (IRuleRelationModel rule in rulesForEntity) {
				if (GetCanRunRule(rule, isContactSearchSuccessfull)) {
					Guid columnUId = rule.EntitySchemaColumnUId;
					string columnName = entity.Schema.Columns.GetByUId(columnUId).Name;
					string columnValue = entity.GetTypedColumnValue<string>(columnName);
					MatchCollection matches = rule.GetMatches(columnValue);
					if (matches.Count > 0) {
						IEnumerable<Pair> extendedRelations = rule.GetEntityExtendedRelations(matches, _userConnection);
						if(extendedRelations.Count() > 0) {
							foreach(Pair relationValue in extendedRelations) {
								var relationColumn = entity.Schema.Columns.GetByUId((Guid)relationValue.First);
								Guid relationColumnValue = entity.GetTypedColumnValue<Guid>(relationColumn);
								if (relationColumnValue == Guid.Empty) {
									entity.SetColumnValue(relationColumn, (Guid)relationValue.Second);
									TryAutoCompleteContactOrAccount(entity, relationColumn, (Guid)relationValue.Second);
									if (rule.EntitySchemaSearchUId == AutoEmailRelationConst.ContactCommunicationSchemaUId) {
										isContactSearchSuccessfull = true;
									}
									if (rule.EntitySchemaSearchUId != AutoEmailRelationConst.AccountCommunicationSchemaUId &&
											rule.EntitySchemaSearchUId != AutoEmailRelationConst.ContactCommunicationSchemaUId) {
										isOtherRelation = true;
									}
								}
							}
							entity.Save(false);
						}
					}
				}
			}
			SetEntityProcessed(entity, isOtherRelation);
 
		}

Так же протестировали на другой сущности Problems (на которой не было доработок) – аналогичная ситуация. Когда происходит автоматическое связывание, не стартует процесс на добавление/изменение записи.

Добрый день, Владимир!
На сколько я понял симптомы описанной Вами проблемы, то данное исправление мы делали в версии продукта 7.10.1.

На процессе "Регистрация обращения по входящему письму" в методах данного процесса необходимо изменить код на указанный во вложении (можно выполнить изменение в замещенном процессе, базовый исправиться во время обновления). Это должно решить проблему срабатывания привязки по сигналам.

Спасибо, Михаил.

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

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