From d31c2ab0c7d884c0a4a4c6607e15debdeb85de85 Mon Sep 17 00:00:00 2001 From: Behzad Alizadeh Date: Sat, 3 Jan 2026 15:09:40 +0330 Subject: [PATCH] Upfrade package to 1.1.0-preview.6 --- .../Caspian.WorkflowFramework.Package.csproj | 4 +- .../Contracts/IWorkflowService.cs | 7 ++ .../Services/WorkflowService.cs | 106 ++++++++++++++++++ NuGet.Config | 2 +- 4 files changed, 116 insertions(+), 3 deletions(-) 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