Добрый день, коллеги.
Так вышло, что бизнес-процессы игнорирует сигнал по добавлению пользователя (или вообще любой записи в таблицу SysAdminUnit).
Пользователь создается вручную.
У кого есть идеи, как все-таки запускать процесс при создании пользователя?
Нравится
Здравствуйте! Разве что через событийный слой
[EntityEventListener(SchemaName = "SysAdminUnit")] public class SysAdminUnitEntityEventListener : BaseEntityEventListener { public override void OnSaving(object sender, EntityBeforeEventArgs e) { base.OnSaving(sender, e) } public override void OnInserting(object sender, EntityBeforeEventArgs e) { base.OnInserting(sender, e); } public override void OnUpdating(object sender, EntityBeforeEventArgs e) { base.OnUpdating(sender, e); } public override void OnUpdated(object sender, EntityAfterEventArgs e) { base.OnUpdated(sender, e); } public override void OnInserted(object sender, EntityAfterEventArgs e) { base.OnInserted(sender, e); } }
Ну а там уже выбирайте при каких событиях Вам нужно обрабатывать про событийный слой прочтите данную статью
Так же БП можно запускать из серверного кода примерно следующее:
using Terrasoft.Core; using Terrasoft.Core.Process; using Terrasoft.Core.Process.Configuration; ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement"); //schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId); //Разные движки для интерпритируемых и компилироуемых БП bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema); if(canUseFlowEngine) { var flowEngine = new FlowEngine(UserConnection); var param = new Dictionary<string, string>(); param["LeadId"] = Entity.Id.ToString(); flowEngine.RunProcess(schema, param); } else { Process process = schema.CreateProcess(UserConnection); process.SetPropertyValue("LeadId", Entity.Id); process.Execute(UserConnection); }
Здравствуйте! Разве что через событийный слой
[EntityEventListener(SchemaName = "SysAdminUnit")] public class SysAdminUnitEntityEventListener : BaseEntityEventListener { public override void OnSaving(object sender, EntityBeforeEventArgs e) { base.OnSaving(sender, e) } public override void OnInserting(object sender, EntityBeforeEventArgs e) { base.OnInserting(sender, e); } public override void OnUpdating(object sender, EntityBeforeEventArgs e) { base.OnUpdating(sender, e); } public override void OnUpdated(object sender, EntityAfterEventArgs e) { base.OnUpdated(sender, e); } public override void OnInserted(object sender, EntityAfterEventArgs e) { base.OnInserted(sender, e); } }
Ну а там уже выбирайте при каких событиях Вам нужно обрабатывать про событийный слой прочтите данную статью
Так же БП можно запускать из серверного кода примерно следующее:
using Terrasoft.Core; using Terrasoft.Core.Process; using Terrasoft.Core.Process.Configuration; ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement"); //schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId); //Разные движки для интерпритируемых и компилироуемых БП bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema); if(canUseFlowEngine) { var flowEngine = new FlowEngine(UserConnection); var param = new Dictionary<string, string>(); param["LeadId"] = Entity.Id.ToString(); flowEngine.RunProcess(schema, param); } else { Process process = schema.CreateProcess(UserConnection); process.SetPropertyValue("LeadId", Entity.Id); process.Execute(UserConnection); }
Мне кажется, вопрос в другом.
При добавлении пользователя через интерфейс идёт обращение к веб-сервису AdministrationService и его методу UpdateOrCreateUser. В схеме AdministrationServiceUsers виден его код:
protected void SaveUser(object roleId) { bool isNew = false; object primaryColumnValue; changedValues.TryGetValue("Id", out primaryColumnValue); EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("VwSysAdminUnit"); Entity entity = entitySchema.CreateEntity(UserConnection); isNew = !entity.FetchFromDB(primaryColumnValue); if (isNew) { entity.SetDefColumnValues(); } foreach (KeyValuePair<string, object> item in changedValues) { EntitySchemaColumn column = entitySchema.Columns.GetByName(item.Key); object columnValue = item.Value; if ((column.DataValueType is DateTimeDataValueType) && (item.Value != null)) { columnValue = DataTypeUtilities.ValueAsType<DateTime>(item.Value); } entity.SetColumnValue(column.ColumnValueName, columnValue); } entity.Save(); if (isNew) { AddUserInRole(entity.PrimaryColumnValue, roleId); } }
То есть видно, что вставка идёт через механизмы ESQ (значит, события отработают), но в объект VwSysAdminUnit, а не SysAdminUnit. Если посмотреть в коде встроенного БП на VwSysAdminUnit в пакетах Base, Translation и WebitelCollaborations, там как раз успешно добавляют свои обработчики на вставку, сохранение и другие события:
То есть нужно будет либо в Custom сделать своё переопределение схемы со встроенным БП, либо сделать отдельный БП, запускающийся по сигналу вставки туда:
В любом случае нужно учитывать, что в этой view видны и пользователи, и роли.