diff --git a/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj b/Caspian.WorkflowFramework.Package/Caspian.WorkflowFramework.Package.csproj
index d3caca4..6a69900 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.4
+ 1.1.0-preview.6
Digital banking team
Caspian
Caspian.WorkflowFramework
@@ -72,7 +72,7 @@
-
+
diff --git a/Caspian.WorkflowFramework.Package/Contracts/IWorkflowService.cs b/Caspian.WorkflowFramework.Package/Contracts/IWorkflowService.cs
index 5ee1e50..8b5cc83 100644
--- a/Caspian.WorkflowFramework.Package/Contracts/IWorkflowService.cs
+++ b/Caspian.WorkflowFramework.Package/Contracts/IWorkflowService.cs
@@ -12,6 +12,13 @@ namespace Caspian.WorkflowFramework.Contracts
/// Create a new workflow instance and executes it and waits for it to complete or reach a suspend point.
Task> CreateAndExecuteAsync(CreateAndExecuteWorkflowModel input);
+ ///
+ /// Create and get a last workflow running instance.
+ ///
+ ///
+ ///
+ Task> CreateOrGetInstanceAsync(CreateAndExecuteWorkflowModel input);
+
///
/// Publishes the specified event.
///
diff --git a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
index 4feca20..1603bdf 100644
--- a/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
+++ b/Caspian.WorkflowFramework.Package/Services/WorkflowService.cs
@@ -2,6 +2,7 @@
using Caspian.WorkflowFramework.Models;
using Caspian.WorkflowFramework.Utility;
using Elsa.Common.Models;
+using Elsa.Workflows;
using Elsa.Workflows.Management;
using Elsa.Workflows.Management.Filters;
using Elsa.Workflows.Models;
@@ -130,6 +131,111 @@ namespace Caspian.WorkflowFramework.Services
}
#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 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 variables = await _workflowInstanceVariableManager
+ .GetVariablesAsync(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 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;
+ }
+ }
+ #endregion
+
#region PublishEventAsync
///
public async Task> PublishEventAsync(PublishEventModel input)
diff --git a/NuGet.Config b/NuGet.Config
index b571a09..61151b6 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -7,6 +7,6 @@
-
+
\ No newline at end of file