diff --git a/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj b/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj
index 43f5e33..0833230 100644
--- a/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj
+++ b/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj
@@ -5,7 +5,7 @@
enable
enable
Caspian.WorkflowFramework
- 1.1.0-preview.7
+ 1.1.0-preview.9
Digital banking team
Caspian
Caspian.WorkflowFramework
diff --git a/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs b/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs
index a57a111..9cefbfd 100644
--- a/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs
+++ b/Caspian.WorkflowFramework.Package/Models/WorkflowModel.cs
@@ -1,4 +1,9 @@
-using System.Text.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Caspian.WorkflowFramework.Models;
@@ -10,6 +15,14 @@ public class WorkflowModel
///
public string? InstanceId { get; set; }
+ ///
+ /// نوع نمونه
+ ///
+ /// exist, new, ...
+ ///
+ ///
+ public string? InstanceMode { get; set; } = "exist";
+
///
/// نام گردش کار
///
@@ -43,6 +56,11 @@ public class WorkflowModel
///
public string? NextPageUrl { get; set; }
+ ///
+ /// شماره صفحه
+ ///
+ public int? PageNumber { get; set; }
+
///
/// رویدادی که باید پس از سابمیت صفحه بعدی منتشر شود
///
diff --git a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
index 485ae1a..815383b 100644
--- a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
+++ b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
@@ -1,4 +1,7 @@
-using Caspian.WorkflowFramework.Contracts;
+using System.Diagnostics;
+using System.Dynamic;
+using System.Text.Json;
+using Caspian.WorkflowFramework.Contracts;
using Caspian.WorkflowFramework.Models;
using Caspian.WorkflowFramework.Utility;
using Elsa.Common.Entities;
@@ -13,77 +16,189 @@ using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using San.MongoLogger;
-using System.Diagnostics;
-using System.Dynamic;
-using System.Text.Json;
-namespace Caspian.WorkflowFramework.Services
+namespace Caspian.WorkflowFramework.Services;
+public class WorkflowService : IWorkflowService, ILoggable
{
- public class WorkflowService : IWorkflowService, ILoggable
+ #region Fields
+ private readonly IServiceProvider _serviceProvider;
+ private readonly IWorkflowRuntime _workflowRuntime;
+ private readonly IWorkflowDefinitionService _workflowDefinitionService;
+ private readonly IWorkflowInstanceVariableManager _workflowInstanceVariableManager;
+ private readonly IWorkflowInstanceManager _workflowInstanceManager;
+ private readonly IWorkflowInstanceStore _workflowInstanceStore;
+ private readonly IEventPublisher _eventPublisher;
+ private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
+ private readonly IMdbLogger _logger;
+ #endregion
+
+ #region Ctor
+ public WorkflowService(IServiceProvider serviceProvider,
+ IMdbLogger logger)
{
- #region Fields
- private readonly IServiceProvider _serviceProvider;
- private readonly IWorkflowRuntime _workflowRuntime;
- private readonly IWorkflowDefinitionService _workflowDefinitionService;
- private readonly IWorkflowInstanceVariableManager _workflowInstanceVariableManager;
- private readonly IWorkflowInstanceManager _workflowInstanceManager;
- private readonly IWorkflowInstanceStore _workflowInstanceStore;
- private readonly IEventPublisher _eventPublisher;
- private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
- private readonly IMdbLogger _logger;
- #endregion
+ _serviceProvider = serviceProvider;
+ _workflowRuntime = _serviceProvider.GetRequiredService();
+ _workflowDefinitionService = _serviceProvider.GetRequiredService();
+ _workflowInstanceVariableManager = _serviceProvider.GetRequiredService();
+ _workflowInstanceManager = _serviceProvider.GetRequiredService();
+ _workflowInstanceStore = _serviceProvider.GetRequiredService();
+ _eventPublisher = _serviceProvider.GetRequiredService();
+ _logger = logger;
+ }
+ #endregion
- #region Ctor
- public WorkflowService(IServiceProvider serviceProvider,
- IMdbLogger logger)
+ #region CreateAndExecuteAsync
+ ///
+ public async Task> CreateAndExecuteAsync(CreateAndExecuteWorkflowModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
{
- _serviceProvider = serviceProvider;
- _workflowRuntime = _serviceProvider.GetRequiredService();
- _workflowDefinitionService = _serviceProvider.GetRequiredService();
- _workflowInstanceVariableManager = _serviceProvider.GetRequiredService();
- _workflowInstanceManager = _serviceProvider.GetRequiredService();
- _workflowInstanceStore = _serviceProvider.GetRequiredService();
- _eventPublisher = _serviceProvider.GetRequiredService();
- _logger = logger;
- }
- #endregion
+ _logger.Log("Start of CreateAndExecuteAsync", input);
- #region CreateAndExecuteAsync
- ///
- public async Task> CreateAndExecuteAsync(CreateAndExecuteWorkflowModel input)
- {
- var sw = Stopwatch.StartNew();
- try
- {
- _logger.Log("Start of CreateAndExecuteAsync", input);
+ WorkflowResponse response;
- WorkflowResponse response;
+ var workflowClient = await _workflowRuntime.CreateClientAsync();
- var workflowClient = await _workflowRuntime.CreateClientAsync();
-
- var definition = await _workflowDefinitionService
- .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter()
- {
- Name = input.Name
- });
-
- if (definition == null)
+ var definition = await _workflowDefinitionService
+ .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter()
{
- var msg = $"Workflow '{input.Name}' defintion not found";
- response = new WorkflowResponse()
- {
- Status = 1,
- Message = msg,
- Data = null
- };
+ Name = input.Name
+ });
- sw.Stop();
+ if (definition == null)
+ {
+ var msg = $"Workflow '{input.Name}' defintion not found";
+ response = new WorkflowResponse()
+ {
+ Status = 1,
+ Message = msg,
+ Data = null
+ };
- _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
+ sw.Stop();
- return response;
- }
+ _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
+ return response;
+ }
+
+ var instanceInput = new Dictionary { ["UserId"] = input.UserId };
+ input.Version = VersionOptions.Published;
+ var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest
+ {
+ WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, input.Version),
+ Input = instanceInput,
+ ExternalUserId = input.UserId
+ });
+
+ var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty);
+
+ var variables = await _workflowInstanceVariableManager.GetVariablesAsync(result.WorkflowInstanceId);
+
+ // تبدیل به دیکشنری
+ var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
+
+ var workflowModel = dictionary.ConvertToWorkflowModel();
+ workflowModel.InstanceId = workflowClient.WorkflowInstanceId;
+ workflowModel.UserId = input.UserId;
+ workflowModel.InstanceMode = "exist";
+
+ response = new WorkflowResponse()
+ {
+ Status = 0,
+ Message = "Success",
+ Data = workflowModel
+ };
+
+ sw.Stop();
+
+ _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
+
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse()
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
+
+ sw.Stop();
+
+ _logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
+
+ return response;
+ }
+ }
+ #endregion
+
+ #region CreateOrGetInstanceAsync
+ ///
+ public async Task> CreateOrGetInstanceAsync(CreateAndExecuteWorkflowModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of CreateOrGetInstanceAsync", input);
+
+ WorkflowResponse response;
+
+ var workflowClient = await _workflowRuntime.CreateClientAsync();
+
+ var definition = await _workflowDefinitionService
+ .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter()
+ {
+ Name = input.Name
+ });
+
+ if (definition == null)
+ {
+ var msg = $"Workflow '{input.Name}' defintion not found";
+ response = new WorkflowResponse()
+ {
+ Status = 1,
+ Message = msg,
+ Data = null
+ };
+
+ sw.Stop();
+
+ _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
+
+ return response;
+ }
+
+ var instances = await _workflowInstanceStore.FindManyAsync(
+ new WorkflowInstanceFilter
+ {
+ ExternalUserId = input.UserId,
+ DefinitionId = definition.DefinitionId,
+ WorkflowStatus = WorkflowStatus.Running
+ },
+ new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
+ );
+
+ var runningWorkflowInstance = instances.FirstOrDefault();
+
+ //var runningWorkflowInstance = await _workflowInstanceManager
+ // .FindAsync(new WorkflowInstanceFilter()
+ // {
+ // ExternalUserId = input.UserId,
+ // DefinitionId = definition.DefinitionId,
+ // WorkflowStatus = WorkflowStatus.Running
+ // });
+
+ string workflowInstanceId = string.Empty;
+ if (runningWorkflowInstance != null)
+ {
+ workflowInstanceId = runningWorkflowInstance.Id;
+
+ }
+ else
+ {
var instanceInput = new Dictionary { ["UserId"] = input.UserId };
input.Version = VersionOptions.Published;
var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest
@@ -94,228 +209,73 @@ namespace Caspian.WorkflowFramework.Services
});
var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty);
-
- var variables = await _workflowInstanceVariableManager.GetVariablesAsync(result.WorkflowInstanceId);
-
- // تبدیل به دیکشنری
- var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
-
- var workflowModel = dictionary.ConvertToWorkflowModel();
- workflowModel.InstanceId = workflowClient.WorkflowInstanceId;
- workflowModel.UserId = input.UserId;
-
- response = new WorkflowResponse()
- {
- Status = 0,
- Message = "Success",
- Data = workflowModel
- };
-
- sw.Stop();
-
- _logger.Log("End of CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
-
- return response;
+ workflowInstanceId = result.WorkflowInstanceId;
}
- catch (Exception ex)
+
+ var id = workflowInstanceId;
+ var variables = await _workflowInstanceVariableManager
+ .GetVariablesAsync(id);
+
+ // تبدیل به دیکشنری
+ var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
+
+ var workflowModel = dictionary.ConvertToWorkflowModel();
+ workflowModel.InstanceId = workflowInstanceId;
+ workflowModel.UserId = input.UserId;
+ workflowModel.InstanceId = runningWorkflowInstance != null ? "exist" : "new";
+
+ response = new WorkflowResponse()
{
- var response = new WorkflowResponse()
- {
- Status = 100,
- Message = ex.Message,
- Data = null
- };
+ Status = 0,
+ Message = "Success",
+ Data = workflowModel
+ };
- sw.Stop();
+ sw.Stop();
- _logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
+ _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
- return response;
- }
+ return response;
}
- #endregion
-
- #region CreateOrGetInstanceAsync
- ///
- public async Task> CreateOrGetInstanceAsync(CreateAndExecuteWorkflowModel input)
+ catch (Exception ex)
{
- var sw = Stopwatch.StartNew();
- try
+ var response = new WorkflowResponse()
{
- _logger.Log("Start of CreateOrGetInstanceAsync", input);
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
- WorkflowResponse response;
+ sw.Stop();
- var workflowClient = await _workflowRuntime.CreateClientAsync();
+ _logger.Log("Exception occurs in CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
- var definition = await _workflowDefinitionService
- .FindWorkflowDefinitionAsync(new WorkflowDefinitionFilter()
- {
- Name = input.Name
- });
-
- if (definition == null)
- {
- var msg = $"Workflow '{input.Name}' defintion not found";
- response = new WorkflowResponse()
- {
- Status = 1,
- Message = msg,
- Data = null
- };
-
- sw.Stop();
-
- _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
-
- return response;
- }
-
- var instances = await _workflowInstanceStore.FindManyAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- DefinitionId = definition.DefinitionId,
- WorkflowStatus = WorkflowStatus.Running
- },
- new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
- );
-
- var runningWorkflowInstance = instances.FirstOrDefault();
-
- //var runningWorkflowInstance = await _workflowInstanceManager
- // .FindAsync(new WorkflowInstanceFilter()
- // {
- // ExternalUserId = input.UserId,
- // DefinitionId = definition.DefinitionId,
- // WorkflowStatus = WorkflowStatus.Running
- // });
-
- var workflowInstanceId = string.Empty;
- if (runningWorkflowInstance != null)
- {
- workflowInstanceId = runningWorkflowInstance.Id;
- }
- else
- {
- var instanceInput = new Dictionary { ["UserId"] = input.UserId };
- input.Version = VersionOptions.Published;
- var newInstance = await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest
- {
- WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, input.Version),
- Input = instanceInput,
- ExternalUserId = input.UserId
- });
-
- var result = await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty);
- workflowInstanceId = result.WorkflowInstanceId;
- }
-
- var id = workflowInstanceId;
- var variables = await _workflowInstanceVariableManager
- .GetVariablesAsync(id);
-
- // تبدیل به دیکشنری
- var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
-
- var workflowModel = dictionary.ConvertToWorkflowModel();
- workflowModel.InstanceId = workflowInstanceId;
- workflowModel.UserId = input.UserId;
-
- response = new WorkflowResponse()
- {
- Status = 0,
- Message = "Success",
- Data = workflowModel
- };
-
- sw.Stop();
-
- _logger.Log("End of CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds);
-
- return response;
- }
- catch (Exception ex)
- {
- var response = new WorkflowResponse()
- {
- Status = 100,
- Message = ex.Message,
- Data = null
- };
-
- sw.Stop();
-
- _logger.Log("Exception occurs in CreateOrGetInstanceAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
-
- return response;
- }
+ return response;
}
- #endregion
+ }
+ #endregion
- #region PublishEventAsync
- ///
- public async Task> PublishEventAsync(PublishEventModel input)
+ #region PublishEventAsync
+ ///
+ public async Task> PublishEventAsync(PublishEventModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
{
- var sw = Stopwatch.StartNew();
- try
+ _logger.Log("Start of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, input);
+
+ WorkflowResponse response;
+
+ var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId);
+
+ if (instance == null)
{
- _logger.Log("Start of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, input);
-
- WorkflowResponse response;
-
- var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId);
-
- if (instance == null)
- {
- var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
- response = new WorkflowResponse()
- {
- Status = 1,
- Message = msg,
- Data = null
- };
-
- sw.Stop();
-
- _logger.Log("End of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
-
- return response;
- }
-
- dynamic payload = null;
-
- if (input.EventData.ValueKind != JsonValueKind.Undefined &&
- input.EventData.ValueKind != JsonValueKind.Null)
- {
- var json = input.EventData.GetRawText();
-
- var settings = new JsonSerializerSettings
- {
- Converters = { new ExpandoObjectConverter() }
- };
-
- // تبدیل JSON به object داینامیک
- payload = JsonConvert.DeserializeObject(json, settings);
- }
-
- //await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, input.EventData, asynchronous: true);
- await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, payload);
-
- var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId);
-
- // تبدیل به دیکشنری
- var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
-
- var workflowModel = dictionary.ConvertToWorkflowModel();
- workflowModel.InstanceId = instance.Id;
- workflowModel.UserId = instance.ExternalUserId;
-
+ var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
response = new WorkflowResponse()
{
- Status = 0,
- Message = "Success",
- Data = workflowModel
+ Status = 1,
+ Message = msg,
+ Data = null
};
sw.Stop();
@@ -324,68 +284,88 @@ namespace Caspian.WorkflowFramework.Services
return response;
}
- catch (Exception ex)
+
+ dynamic payload = null;
+
+ if (input.EventData.ValueKind != JsonValueKind.Undefined &&
+ input.EventData.ValueKind != JsonValueKind.Null)
{
- var response = new WorkflowResponse()
+ var json = input.EventData.GetRawText();
+
+ var settings = new JsonSerializerSettings
{
- Status = 100,
- Message = ex.Message,
- Data = null
+ Converters = { new ExpandoObjectConverter() }
};
- sw.Stop();
-
- _logger.Log("Exception occurs in PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
-
- return response;
+ // تبدیل JSON به object داینامیک
+ payload = JsonConvert.DeserializeObject(json, settings);
}
- }
- #endregion
- #region InquiryStateAsync
- ///
- public async Task> InquiryStateAsync(InquiryStateModel input)
- {
- var sw = Stopwatch.StartNew();
- try
+ //await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, input.EventData, asynchronous: true);
+ await _eventPublisher.PublishAsync(input.EventName, null, input.WorkflowInstanceId, null, payload);
+
+ var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId);
+
+ // تبدیل به دیکشنری
+ var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
+
+ var workflowModel = dictionary.ConvertToWorkflowModel();
+ workflowModel.InstanceId = instance.Id;
+ workflowModel.UserId = instance.ExternalUserId;
+ workflowModel.InstanceMode = "exist";
+
+ response = new WorkflowResponse()
{
- _logger.Log("Start of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, input);
+ Status = 0,
+ Message = "Success",
+ Data = workflowModel
+ };
- WorkflowResponse response;
+ sw.Stop();
- var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId);
+ _logger.Log("End of PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
- if (instance == null)
- {
- var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
- response = new WorkflowResponse()
- {
- Status = 1,
- Message = msg,
- Data = null
- };
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse()
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
- sw.Stop();
+ sw.Stop();
- _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
+ _logger.Log("Exception occurs in PublishEventAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
- return response;
- }
+ return response;
+ }
+ }
+ #endregion
- var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId);
+ #region InquiryStateAsync
+ ///
+ public async Task> InquiryStateAsync(InquiryStateModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, input);
- // تبدیل به دیکشنری
- var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
+ WorkflowResponse response;
- var workflowModel = dictionary.ConvertToWorkflowModel();
- workflowModel.InstanceId = instance.Id;
- workflowModel.UserId = instance.ExternalUserId;
+ var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId);
+ if (instance == null)
+ {
+ var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
response = new WorkflowResponse()
{
- Status = 0,
- Message = "Success",
- Data = workflowModel
+ Status = 1,
+ Message = msg,
+ Data = null
};
sw.Stop();
@@ -394,328 +374,353 @@ namespace Caspian.WorkflowFramework.Services
return response;
}
- catch (Exception ex)
+
+ var variables = await _workflowInstanceVariableManager.GetVariablesAsync(input.WorkflowInstanceId);
+
+ // تبدیل به دیکشنری
+ var dictionary = variables.ToDictionary(a => a.Variable.Name, a => a.Value);
+
+ var workflowModel = dictionary.ConvertToWorkflowModel();
+ workflowModel.InstanceId = instance.Id;
+ workflowModel.UserId = instance.ExternalUserId;
+ workflowModel.InstanceMode = "exist";
+
+ response = new WorkflowResponse()
{
- var response = new WorkflowResponse()
- {
- Status = 100,
- Message = ex.Message,
- Data = null
- };
+ Status = 0,
+ Message = "Success",
+ Data = workflowModel
+ };
- sw.Stop();
+ sw.Stop();
- _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
+ _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
- return response;
- }
+ return response;
}
- #endregion
-
- #region GetActiveInstancesAsync
- public async Task>> GetActiveInstancesAsync(GetActiveInstancesModel input)
+ catch (Exception ex)
{
- var sw = Stopwatch.StartNew();
- try
+ var response = new WorkflowResponse()
{
- _logger.Log("Start of GetActiveInstancesAsync", input);
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
- var instances = await _workflowInstanceStore.FindManyAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- WorkflowStatus = WorkflowStatus.Running
- });
+ sw.Stop();
- var result = new List();
+ _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
- foreach (var instance in instances)
- {
- var variables = await _workflowInstanceVariableManager.GetVariablesAsync(instance.Id);
- var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value);
-
- var model = dict.ConvertToWorkflowModel();
- model.InstanceId = instance.Id;
- model.UserId = instance.ExternalUserId;
-
- result.Add(model);
- }
-
- var response = new WorkflowResponse>
- {
- Status = 0,
- Message = "Success",
- Data = result
- };
-
- sw.Stop();
- _logger.Log("End of GetActiveInstancesAsync", response, sw.ElapsedMilliseconds);
- return response;
- }
- catch (Exception ex)
- {
- var response = new WorkflowResponse>
- {
- Status = 100,
- Message = ex.Message,
- Data = null
- };
-
- sw.Stop();
- _logger.Log("Exception in GetActiveInstancesAsync", response, sw.ElapsedMilliseconds, ex);
- return response;
- }
+ return response;
}
- #endregion
+ }
+ #endregion
- #region GetActiveInstanceIdsAsync
- public async Task>> GetActiveInstanceIdsAsync(GetActiveInstancesModel input)
+ #region GetActiveInstancesAsync
+ public async Task>> GetActiveInstancesAsync(GetActiveInstancesModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
{
- var sw = Stopwatch.StartNew();
- try
+ _logger.Log("Start of GetActiveInstancesAsync", input);
+
+ var instances = await _workflowInstanceStore.FindManyAsync(
+ new WorkflowInstanceFilter
+ {
+ ExternalUserId = input.UserId,
+ WorkflowStatus = WorkflowStatus.Running
+ });
+
+ var result = new List();
+
+ foreach (var instance in instances)
{
- _logger.Log("Start of GetActiveInstanceIdsAsync", input);
-
- var instances = await _workflowInstanceStore.FindManyAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- WorkflowStatus = WorkflowStatus.Running
- });
-
- var instanceIds = instances.Select(i => i.Id).ToList();
-
- var response = new WorkflowResponse>
- {
- Status = 0,
- Message = "Success",
- Data = instanceIds
- };
-
- sw.Stop();
- _logger.Log("End of GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds);
- return response;
- }
- catch (Exception ex)
- {
- var response = new WorkflowResponse>
- {
- Status = 100,
- Message = ex.Message,
- Data = null
- };
-
- sw.Stop();
- _logger.Log("Exception in GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds, ex);
- return response;
- }
- }
- #endregion
-
- #region GetLatestActiveInstanceAsync
- public async Task> GetLatestActiveInstanceAsync(GetLatestActiveInstanceModel input)
- {
- var sw = Stopwatch.StartNew();
- try
- {
- _logger.Log("Start of GetLatestActiveInstanceAsync", input);
-
- var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync(
- new WorkflowDefinitionFilter { Name = input.WorkflowName });
-
- if (definition == null)
- {
- return new WorkflowResponse
- {
- Status = 1,
- Message = $"Workflow '{input.WorkflowName}' not found",
- Data = null
- };
- }
-
- var instances = await _workflowInstanceStore.FindManyAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- DefinitionId = definition.DefinitionId,
- WorkflowStatus = WorkflowStatus.Running
- },
- new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
- );
-
- var latest = instances.FirstOrDefault();
-
- if (latest == null)
- {
- return new WorkflowResponse
- {
- Status = 1,
- Message = "No active workflow instance found",
- Data = null
- };
- }
-
- var variables = await _workflowInstanceVariableManager.GetVariablesAsync(latest.Id);
+ var variables = await _workflowInstanceVariableManager.GetVariablesAsync(instance.Id);
var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value);
var model = dict.ConvertToWorkflowModel();
- model.InstanceId = latest.Id;
- model.UserId = latest.ExternalUserId;
+ model.InstanceId = instance.Id;
+ model.UserId = instance.ExternalUserId;
+ model.InstanceMode = "exist";
- var response = new WorkflowResponse
- {
- Status = 0,
- Message = "Success",
- Data = model
- };
-
- sw.Stop();
- _logger.Log("End of GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds);
- return response;
+ result.Add(model);
}
- catch (Exception ex)
+
+ var response = new WorkflowResponse>
{
- var response = new WorkflowResponse
+ Status = 0,
+ Message = "Success",
+ Data = result
+ };
+
+ sw.Stop();
+ _logger.Log("End of GetActiveInstancesAsync", response, sw.ElapsedMilliseconds);
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse>
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
+
+ sw.Stop();
+ _logger.Log("Exception in GetActiveInstancesAsync", response, sw.ElapsedMilliseconds, ex);
+ return response;
+ }
+ }
+ #endregion
+
+ #region GetActiveInstanceIdsAsync
+ public async Task>> GetActiveInstanceIdsAsync(GetActiveInstancesModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of GetActiveInstanceIdsAsync", input);
+
+ var instances = await _workflowInstanceStore.FindManyAsync(
+ new WorkflowInstanceFilter
{
- Status = 100,
- Message = ex.Message,
+ ExternalUserId = input.UserId,
+ WorkflowStatus = WorkflowStatus.Running
+ });
+
+ var instanceIds = instances.Select(i => i.Id).ToList();
+
+ var response = new WorkflowResponse>
+ {
+ Status = 0,
+ Message = "Success",
+ Data = instanceIds
+ };
+
+ sw.Stop();
+ _logger.Log("End of GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds);
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse>
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
+
+ sw.Stop();
+ _logger.Log("Exception in GetActiveInstanceIdsAsync", response, sw.ElapsedMilliseconds, ex);
+ return response;
+ }
+ }
+ #endregion
+
+ #region GetLatestActiveInstanceAsync
+ public async Task> GetLatestActiveInstanceAsync(GetLatestActiveInstanceModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of GetLatestActiveInstanceAsync", input);
+
+ var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync(
+ new WorkflowDefinitionFilter { Name = input.WorkflowName });
+
+ if (definition == null)
+ {
+ return new WorkflowResponse
+ {
+ Status = 1,
+ Message = $"Workflow '{input.WorkflowName}' not found",
Data = null
};
-
- sw.Stop();
- _logger.Log("Exception in GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds, ex);
- return response;
}
- }
- #endregion
- #region GetLatestActiveInstanceIdAsync
- public async Task> GetLatestActiveInstanceIdAsync(GetLatestActiveInstanceModel input)
- {
- var sw = Stopwatch.StartNew();
- try
+ var instances = await _workflowInstanceStore.FindManyAsync(
+ new WorkflowInstanceFilter
+ {
+ ExternalUserId = input.UserId,
+ DefinitionId = definition.DefinitionId,
+ WorkflowStatus = WorkflowStatus.Running
+ },
+ new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
+ );
+
+ var latest = instances.FirstOrDefault();
+
+ if (latest == null)
{
- _logger.Log("Start of GetLatestActiveInstanceIdAsync", input);
-
- var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync(
- new WorkflowDefinitionFilter { Name = input.WorkflowName });
-
- if (definition == null)
+ return new WorkflowResponse
{
- return new WorkflowResponse
- {
- Status = 1,
- Message = $"Workflow '{input.WorkflowName}' not found",
- Data = null
- };
- }
-
- var instances = await _workflowInstanceStore.FindManyAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- DefinitionId = definition.DefinitionId,
- WorkflowStatus = WorkflowStatus.Running
- },
- new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
- );
-
- var latest = instances.FirstOrDefault();
-
- if (latest == null)
- {
- return new WorkflowResponse
- {
- Status = 1,
- Message = "No active workflow instance found",
- Data = null
- };
- }
-
- var response = new WorkflowResponse
- {
- Status = 0,
- Message = "Success",
- Data = latest.Id
- };
-
- sw.Stop();
- _logger.Log("End of GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds);
- return response;
- }
- catch (Exception ex)
- {
- var response = new WorkflowResponse
- {
- Status = 100,
- Message = ex.Message,
+ Status = 1,
+ Message = "No active workflow instance found",
Data = null
};
-
- sw.Stop();
- _logger.Log("Exception in GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds, ex);
- return response;
}
+
+ var variables = await _workflowInstanceVariableManager.GetVariablesAsync(latest.Id);
+ var dict = variables.ToDictionary(x => x.Variable.Name, x => x.Value);
+
+ var model = dict.ConvertToWorkflowModel();
+ model.InstanceId = latest.Id;
+ model.UserId = latest.ExternalUserId;
+ model.InstanceMode = "exist";
+
+ var response = new WorkflowResponse
+ {
+ Status = 0,
+ Message = "Success",
+ Data = model
+ };
+
+ sw.Stop();
+ _logger.Log("End of GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds);
+ return response;
}
- #endregion
-
- #region CancelInstanceAsync
- public async Task> CancelInstanceAsync(CancelWorkflowInstanceModel input)
+ catch (Exception ex)
{
- var sw = Stopwatch.StartNew();
- try
+ var response = new WorkflowResponse
{
- _logger.Log("Start of CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, input);
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
- // پیدا کردن instance
- var instance = await _workflowInstanceStore.FindAsync(
- new WorkflowInstanceFilter
- {
- ExternalUserId = input.UserId,
- WorkflowStatus = WorkflowStatus.Running
- });
+ sw.Stop();
+ _logger.Log("Exception in GetLatestActiveInstanceAsync", response, sw.ElapsedMilliseconds, ex);
+ return response;
+ }
+ }
+ #endregion
- if (instance == null)
+ #region GetLatestActiveInstanceIdAsync
+ public async Task> GetLatestActiveInstanceIdAsync(GetLatestActiveInstanceModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of GetLatestActiveInstanceIdAsync", input);
+
+ var definition = await _workflowDefinitionService.FindWorkflowDefinitionAsync(
+ new WorkflowDefinitionFilter { Name = input.WorkflowName });
+
+ if (definition == null)
+ {
+ return new WorkflowResponse
{
- return new WorkflowResponse
- {
- Status = 1,
- Message = "Workflow instance not found",
- Data = false
- };
- }
-
- // ایجاد client روی workflow instance موردنظر
- var client = await _workflowRuntime.CreateClientAsync(instance.Id);
-
- // لغو workflow
- await client.CancelAsync();
-
- var response = new WorkflowResponse
- {
- Status = 0,
- Message = "Success",
- Data = true
+ Status = 1,
+ Message = $"Workflow '{input.WorkflowName}' not found",
+ Data = null
};
-
- sw.Stop();
- _logger.Log("End of CancelInstanceAsync", WFInstanceId: instance.Id, response, sw.ElapsedMilliseconds);
- return response;
}
- catch (Exception ex)
- {
- var response = new WorkflowResponse
+
+ var instances = await _workflowInstanceStore.FindManyAsync(
+ new WorkflowInstanceFilter
{
- Status = 100,
- Message = ex.Message,
+ ExternalUserId = input.UserId,
+ DefinitionId = definition.DefinitionId,
+ WorkflowStatus = WorkflowStatus.Running
+ },
+ new WorkflowInstanceOrder(x => x.UpdatedAt!, OrderDirection.Descending)
+ );
+
+ var latest = instances.FirstOrDefault();
+
+ if (latest == null)
+ {
+ return new WorkflowResponse
+ {
+ Status = 1,
+ Message = "No active workflow instance found",
+ Data = null
+ };
+ }
+
+ var response = new WorkflowResponse
+ {
+ Status = 0,
+ Message = "Success",
+ Data = latest.Id
+ };
+
+ sw.Stop();
+ _logger.Log("End of GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds);
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = null
+ };
+
+ sw.Stop();
+ _logger.Log("Exception in GetLatestActiveInstanceIdAsync", response, sw.ElapsedMilliseconds, ex);
+ return response;
+ }
+ }
+ #endregion
+
+ #region CancelInstanceAsync
+ public async Task> CancelInstanceAsync(CancelWorkflowInstanceModel input)
+ {
+ var sw = Stopwatch.StartNew();
+ try
+ {
+ _logger.Log("Start of CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, input);
+
+ // پیدا کردن instance
+ var instance = await _workflowInstanceStore.FindAsync(
+ new WorkflowInstanceFilter
+ {
+ ExternalUserId = input.UserId,
+ WorkflowStatus = WorkflowStatus.Running
+ });
+
+ if (instance == null)
+ {
+ return new WorkflowResponse
+ {
+ Status = 1,
+ Message = "Workflow instance not found",
Data = false
};
-
- sw.Stop();
- _logger.Log("Exception in CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
- return response;
}
+
+ // ایجاد client روی workflow instance موردنظر
+ var client = await _workflowRuntime.CreateClientAsync(instance.Id);
+
+ // لغو workflow
+ await client.CancelAsync();
+
+ var response = new WorkflowResponse
+ {
+ Status = 0,
+ Message = "Success",
+ Data = true
+ };
+
+ sw.Stop();
+ _logger.Log("End of CancelInstanceAsync", WFInstanceId: instance.Id, response, sw.ElapsedMilliseconds);
+ return response;
+ }
+ catch (Exception ex)
+ {
+ var response = new WorkflowResponse
+ {
+ Status = 100,
+ Message = ex.Message,
+ Data = false
+ };
+
+ sw.Stop();
+ _logger.Log("Exception in CancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
+ return response;
}
- #endregion
}
-}
+ #endregion
+}
\ No newline at end of file
diff --git a/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs b/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs
index cb472ab..7a205f4 100644
--- a/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs
+++ b/Caspian.WorkflowFramework.Package/Utility/ConversionExtensions.cs
@@ -23,6 +23,10 @@ namespace Caspian.WorkflowFramework.Utility
? dictionary[nameof(workflowModel.InstanceId)]?.ToString()
: null;
+ workflowModel.InstanceMode = dictionary.ContainsKey(nameof(workflowModel.InstanceMode))
+ ? dictionary[nameof(workflowModel.InstanceMode)]?.ToString()
+ : null;
+
workflowModel.Name = dictionary.ContainsKey(nameof(workflowModel.Name))
? dictionary[nameof(workflowModel.Name)]?.ToString()
: null;
@@ -101,6 +105,10 @@ namespace Caspian.WorkflowFramework.Utility
? dictionary[nameof(workflowModel.NextPageUrl)]?.ToString()
: null;
+ workflowModel.PageNumber = dictionary.ContainsKey(nameof(workflowModel.PageNumber))
+ ? int.TryParse(dictionary[nameof(workflowModel.PageNumber)]?.ToString(), out var pageNumber) ? pageNumber : (int?)null
+ : null;
+
workflowModel.NextPageEventName = dictionary.ContainsKey(nameof(workflowModel.NextPageEventName))
? dictionary[nameof(workflowModel.NextPageEventName)]?.ToString()
: null;