Вызов бизнес-процесса из бизнес-процесса

Коллеги, добрый день!
Не удается вызвать бизнес-процесс из С# кода.
Из сценария пользователя в бизнес-процессе происходит вызов другого бизнес-процесса. Код бизнес-процесса следующий

var userConnection = GetUserConnection>("UserConnection");
var caseStatusNew = "AE5F2F10-F46B-1410-FD9A-0050BA5D6C38";
var caseStatusInWork = "7E9F1204-F46B-1410-FB9A-0050BA5D6C38";
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())     {
            Select caseDeadlineResponseSelect = new Select(userConnection).
                Column("Case", "id").As("CaseId").
                From("Case").
                Where("Case", "StatusId").IsEqual(Column.Parameter(caseStatusNew)) as Select;
                using (var dr = caseDeadlineResponseSelect.ExecuteReader(dbExecutor)) {
                        while (dr.Read())
                        {
                                var caseId = dr.GetColumnValue("CaseId").ToString();
                                var utils = new TestUtils();
                                        utils.SendReminding(Guid.Parse(caseId.ToString()));
                                        Update updateCase = new Update(userConnection, "Case").
                                                Set("NrbSentDeadlineResponse", Column.Parameter(true)).
                                                Where("Id").IsEqual(Column.Parameter(caseId)) as Update;
                                        updateCase.Execute();
                        }
                }
   }
   return true;

Для вызова бизнес-процесса был реализован отдельный модуль исходного кода, со следующим наполнением:
namespace Terrasoft.Configuration.UsrUtilities
{
        using System;
        using Core;
        using Common;
        using System.Web;
        using Core.Process;

        public class TestUtils
        {
                private UserConnection _userConnection;
                public UserConnection userConnection
                {
                        get
                        {
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                var appConnection = (AppConnection)HttpContext.Current.Application["AppConnection"];
                                _userConnection = appConnection.SystemUserConnection;
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                return null;
                        }
                        set
                        {
                                _userConnection = value;
                        }
                }

                private void Authenticate()
                {
                        if (userConnection == null)
                        {
                                throw new System.Security.Authentication.AuthenticationException();
                        }
                }
                public TestUtils()
                {
                        Authenticate();
                }

                public void SendReminding(Guid caseId)
                {
                        var processSchemaManager = (ProcessSchemaManager) userConnection.GetSchemaManager(@"ProcessSchemaManager");

                        var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");
                        var process = processSchema.CreateProcess(_userConnection);

                        process.SetPropertyValue(@"CaseId", caseId);
                        process.Execute(_userConnection);
                }
        }
}

Сохранение и компиляция кода происходит успешно. Но при вызове данного бизнес-процесса в журнале процесса, данный процесс отображается с ошибкой:
System.NotImplementedException: Метод или операция не реализована. в Terrasoft.Core.Process.ProcessSchema.CreateProcess(UserConnection userConnection) в Terrasoft.Configuration.NrbUtilities.NorbitUtils.SendReminding(Guid caseId) в Terrasoft.Core.Process.NrbCheckTimingMethodsWrapper.ScriptTask2Execute(ProcessExecutingContext context) в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Нравится

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

Странно. А можете потестить вот так:

namespace Terrasoft.Configuration.UsrUtilities
{
	using System;
	using Core;
	using Common;
	using System.Web;
	using Core.Process;
 
	public static class TestUtils
	{
		public static void SendReminding(Guid caseId, UserConnection user)
		{
			var processSchemaManager = (ProcessSchemaManager)user.GetSchemaManager(@"ProcessSchemaManager");
 
			var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");
			var process = processSchema.CreateProcess(user);
 
			process.SetPropertyValue(@"CaseId", caseId);
			process.Execute(user);
		}
	}
}

В бп:

using Terrasoft.Configuration.UsrUtilities

Вызов:

TestUtils.SendReminding(Guid.Parse(caseId.ToString()), userConnection);

"Варфоломеев Данила" написал:

Странно. А можете потестить вот так:

namespace Terrasoft.Configuration.UsrUtilities

{

        using System;

        using Core;

        using Common;

        using System.Web;

        using Core.Process;



        public static class TestUtils

        {

                public static void SendReminding(Guid caseId, UserConnection user)

                {

                        var processSchemaManager = (ProcessSchemaManager)user.GetSchemaManager(@"ProcessSchemaManager");



                        var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");

                        var process = processSchema.CreateProcess(user);



                        process.SetPropertyValue(@"CaseId", caseId);

                        process.Execute(user);

                }

        }

}

В бп:

using Terrasoft.Configuration.UsrUtilities

Вызов:

TestUtils.SendReminding(Guid.Parse(caseId.ToString()), userConnection);

Ошибка осталась в том же виде.

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.

Пример кода для запуска БП из скрипт таска:

var userConnection = Get<UserConnection>("UserConnection");
var manager = userConnection.ProcessSchemaManager;
var processSchema =  (ProcessSchema)manager.FindInstanceByName("SyncExchangeActivitiesProcess");
if (processSchema == null) 
{
	return true;
}
var moduleProcess = processSchema.CreateProcess(userConnection);
moduleProcess.Execute(userConnection);
return true;

"Мотков Илья" написал:

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.


Ваша реализация преполагает вообще не вызывать процесс, если процесс не является объектов класса ProcessSchema. Но это неправильно, БП должен запускаться, а не игнорироваться.
Я нашел данное решение:

	var processSchema = manager.GetInstanceByName("NrbSendDeadlineEmail");
	var flowEngine = new FlowEngine(userConnection);
	Dictionary<string, string> parameter = new Dictionary<string, string>();
	parameter.Add("Case", caseId.ToString());
	flowEngine.RunProcess(processSchema, parameter);

На данный момент, процесс запускает другой процесс, но не более 1 экземпляра, после чего отображает ошибку:

System.Data.SqlClient.SqlException (0x80131904): New transaction is not allowed because there are other threads running in the session

Если вопрос все ещё актуален, могу предложить обходной путь через планировщик.

string userName = Get<string>("ManagerUserName"); //- Имя пользователя
var userConnection = Get<UserConnection>("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя группы
string jobProcessName = "MyBusinessProcess"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
 
IDictionary<string, object> parameters = new Dictionary<string, object>();
parameters["ContactNum"] = Get<string>("ContactNum");
parameters["ManagerNum"] = Get<string>("ManagerNum");
parameters["Direction"] = Get<string>("Direction");
 
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
AppScheduler.ScheduleImmediateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userName, parameters);
return true;
using Terrasoft.Core.Scheduler
using Quartz.Impl
using Quartz
using Quartz.Impl.Triggers

"Мотков Илья" написал:

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.

Пример кода для запуска БП из скрипт таска:

var userConnection = Get<UserConnection>("UserConnection");

var manager = userConnection.ProcessSchemaManager;

var processSchema =  (ProcessSchema)manager.FindInstanceByName("SyncExchangeActivitiesProcess");

if (processSchema == null)

{

        return true;

}

var moduleProcess = processSchema.CreateProcess(userConnection);

moduleProcess.Execute(userConnection);

return true;


7.10.1 проверено и не работает. Никаких ошибок нет, но не инициирует запуск передаваемого БП.

Проверил на 7.10.1 Отработали оба процесса. Столкнулся и с System.NotImplementedException. Ошибка возникает если вызываемый бизнес процесс не содержит элементов, требующих компиляции и решается установленным чекбоксом "Компилировать".

Вам же необходимо провести отладку, скорей всего условие processSchema == null выполняется и происходит выход из ScriptTask.

Мотков Илья, спасибо но всё же облегчило бы жизнь если хоть где нибудь было указано что второй (вызываемый) БП должен быть обязательно компилируемым.

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