...

Подписка на событие объекта

Тема в разделе "Разработчикам", создана пользователем alexfuse, 12 фев 2019.

  1. alexfuse

    alexfuse Member

    Подскажите, как можно подписаться на событие изменение ответственного в объекте Возможность?
     
  2. pushkarev

    pushkarev Active Member

    В базе знаний есть ряд статей с примерами и разборами разных случаев подписывания на события изменения объектов в системе, рекомендую с ними ознакомиться и сделать по аналогии:
    https://www.elma-bpm.ru/KB/article-5653.html
    https://www.elma-bpm.ru/KB/article-6103.html
    https://www.elma-bpm.ru/KB/article-6114.html
    https://www.elma-bpm.ru/KB/article-6183.html
    Пара рекомендаций:
    Код обработчика событий лучше всего делать в глобальном модуле.
    Без крайней необходимости не используйте методы: OnPreUpdate, OnPreUpdateCollection. А если используете, то будьте очень аккуратны, если допустить ошибку, то можно испортить базу и восстановиться можно будет только из резервной копии. Для вашей задачи подойдет метод OnPostUpdate.
     
  3. alexfuse

    alexfuse Member

    Да, я видел примеры. Проверка изменения статуса было, добавил проверку изменения ответственного. Все ли верно?
    Код:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using EleWise.ELMA.API;
    using EleWise.ELMA.CRM.Managers;
    using EleWise.ELMA.CRM.Models;
    using EleWise.ELMA.Common.ExtensionPoints;
    using EleWise.ELMA.Common.Models;
    using EleWise.ELMA.Common.Models.API;
    using EleWise.ELMA.ComponentModel;
    using EleWise.ELMA.ConfigurationModel;
    using EleWise.ELMA.Documents.Models;
    using EleWise.ELMA.Extensions;
    using EleWise.ELMA.Logging;
    using EleWise.ELMA.Model.Actions;
    using EleWise.ELMA.Model.Common;
    using EleWise.ELMA.Model.Entities;
    using EleWise.ELMA.Model.Events;
    using EleWise.ELMA.Model.Managers;
    using EleWise.ELMA.Model.Services;
    using EleWise.ELMA.Model.Types.Settings;
    using EleWise.ELMA.Runtime.Managers;
    using EleWise.ELMA.Runtime.NH.Listeners;
    using EleWise.ELMA.Security;
    using EleWise.ELMA.Security.Managers;
    using EleWise.ELMA.Security.Models;
    using EleWise.ELMA.Security.Services;
    using EleWise.ELMA.Services;
    using EleWise.ELMA.Workflow.Managers;
    using EleWise.ELMA.Workflow.Services;
    using NHibernate.Event;
    
    namespace EleWise.ELMA.CRM.Models.Scripts
    {
        /// <summary>
        /// Модуль сценариев объекта "Возможность"
        /// </summary>
        public class LeadScripts : EleWise.ELMA.Model.Scripts.Entities.EntityScriptModule<ILeadConfigExt>
        {
    
             [Component]
            public class ReSaveStatus : PostFlushEventListener
            {   
                // событие редактирования объекта/документа
                public override void  OnPostUpdate(PostUpdateEvent @event)
                {   
                    if (!(@event.Entity is ILeadConfigExt)) return;
                    var statusIndex = Array.IndexOf(@event.Persister.PropertyNames, "Status");
                     var responsible = Array.IndexOf(@event.Persister.PropertyNames, "Responsible");
                    var lead = @event.Entity as ILeadConfigExt;
                    if (((int)@event.OldState[statusIndex]) != ((int)@event.State[statusIndex]))
                    {
                            var messageTypeFind = WorkflowMessageTypeManager.Instance.Find("Name like 'Смена статуса Возможности%'").FirstOrDefault();
                            var webData = new EleWise.ELMA.Common.Models.WebData {
                                Items = new[] { new EleWise.ELMA.Common.Models.WebDataItem { Name = "IdLead", Value = string.Format("{0}", lead.Id) } }
                            };
                            var workflowMessageService = Locator.GetServiceNotNull<IWorkflowMessagingService>();
                            var result = workflowMessageService.SendMessage(messageTypeFind, webData);
    
                    }
                   
                    if ((int)@event.OldState[responsible] != (int)@event.State[responsible])
                    {
                        var messageTypeFind = WorkflowMessageTypeManager.Instance.Find("Name like 'Смена ответственного%'").FirstOrDefault();
                            var webData = new EleWise.ELMA.Common.Models.WebData {
                            Items = new[] { new EleWise.ELMA.Common.Models.WebDataItem { Name = "IdLead", Value = string.Format("{0}", lead.Id) } }
                            };
                            var workflowMessageService = Locator.GetServiceNotNull<IWorkflowMessagingService>();
                            var result = workflowMessageService.SendMessage(messageTypeFind, webData);
                    }
                           
                 }
            }
        }
       
    }
     
  4. pushkarev

    pushkarev Active Member

    В целом выглядит верно. Но лучше все таки обработчики делать в глобальном модуле, а не в скрипте объекта возможность. Так же лучше приводить переменные @event.OldState[responsible] к типу long, а не int (идентификаторы в элме имеют тип long), так же на всякий случай лучше делать проверки на null. messageType лучше брать по id, а не искать каждый раз по названию (это будет работать быстрее), но конечно могут возникнуть нюансы если будете переносить на другой сервер, может быть тут есть возможность загрузки по uid. Но это все вопросы стилистики и безопасности кода. Ошибок как таковых я не вижу.
     
  5. alexfuse

    alexfuse Member

    А как можно отслеживая статус возможности, если она была неквалифицированная и ее статус меняют на новая запустить новый процесс? т.е. как определить в объекте возможность что статус был неквалифицированная?
     
  6. pushkarev

    pushkarev Active Member

    Как посмотреть предыдущий статус возможности, в этом вопрос? Если да, то у вас в коде есть как раз пример @event.OldState, в которой можно посмотреть какой статус был перед изменением возможности. Либо я не правильно понял, что требуется.
     
  7. alexfuse

    alexfuse Member

    а в нем хранится значение (цифра 3) или название (Unqualified)?
    Нашел пример
    и могу ли я узнать какой пользователь сменил статус например так
    (User)AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>();
    PublicAPI.Portal.Security.User.GetCurrentUser();
     
    Последнее редактирование: 14 фев 2019
  8. alexfuse

    alexfuse Member

    как оказалось тут не надо вообще приводить к типам.
     

Поделиться: