Добрый день, коллеги.
Так вышло, что бизнес-процессы игнорирует сигнал по добавлению пользователя (или вообще любой записи в таблицу 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 видны и пользователи, и роли.