18 changed files with 213 additions and 49 deletions
@ -0,0 +1,18 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using System.Linq; |
|||
|
|||
namespace LINGYUN.Abp.WorkflowCore.Persistence.EntityFrameworkCore |
|||
{ |
|||
public static class EfCoreRepositoryExtensions |
|||
{ |
|||
public static IQueryable<PersistedWorkflow> IncludeIf( |
|||
this IQueryable<PersistedWorkflow> quertable, |
|||
bool includeDetails = true) |
|||
{ |
|||
return !includeDetails ? quertable : |
|||
quertable |
|||
.Include(x => x.ExecutionPointers) |
|||
.ThenInclude(p => p.ExtensionAttributes); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using WorkflowCore.Interface; |
|||
using WorkflowCore.Models; |
|||
|
|||
namespace LINGYUN.Abp.WorkflowCore.Persistence |
|||
{ |
|||
public class AbpWorkflowPurger : IWorkflowPurger |
|||
{ |
|||
private readonly IWorkflowRepository _workflowRepository; |
|||
|
|||
public AbpWorkflowPurger( |
|||
IWorkflowRepository workflowRepository) |
|||
{ |
|||
_workflowRepository = workflowRepository; |
|||
} |
|||
|
|||
public virtual async Task PurgeWorkflows(WorkflowStatus status, DateTime olderThan) |
|||
{ |
|||
var olderThanUtc = olderThan.ToUniversalTime(); |
|||
|
|||
var workflows = await _workflowRepository |
|||
.GetOlderListAsync(status, olderThanUtc, includeDetails: true); |
|||
|
|||
await _workflowRepository.DeleteManyAsync(workflows); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace LINGYUN.Abp.WorkflowManagement |
|||
{ |
|||
public interface IWorkflowRegistryManager |
|||
{ |
|||
Task RegisterAsync(CancellationToken cancellationToken = default); |
|||
} |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace LINGYUN.Abp.WorkflowManagement |
|||
{ |
|||
public class WorkflowRegistryManager : IWorkflowRegistryManager, ITransientDependency |
|||
{ |
|||
private readonly WorkflowManager _workflowManager; |
|||
|
|||
private readonly IWorkflowRepository _workflowRepository; |
|||
private readonly IStepNodeRepository _stepNodeRepository; |
|||
private readonly ICompensateNodeRepository _compensateNodeRepository; |
|||
|
|||
public WorkflowRegistryManager( |
|||
WorkflowManager workflowManager, |
|||
IWorkflowRepository workflowRepository, |
|||
IStepNodeRepository stepNodeRepository, |
|||
ICompensateNodeRepository compensateNodeRepository) |
|||
{ |
|||
_workflowManager = workflowManager; |
|||
_workflowRepository = workflowRepository; |
|||
_stepNodeRepository = stepNodeRepository; |
|||
_compensateNodeRepository = compensateNodeRepository; |
|||
} |
|||
|
|||
public virtual async Task RegisterAsync(CancellationToken cancellationToken = default) |
|||
{ |
|||
// TODO: 多租户如何注册?
|
|||
|
|||
var workflows = await _workflowRepository |
|||
.GetListAsync(x => x.IsEnabled, cancellationToken: cancellationToken); |
|||
|
|||
foreach (var workflow in workflows) |
|||
{ |
|||
if (!_workflowManager.IsRegistered(workflow)) |
|||
{ |
|||
var stepNodes = await _stepNodeRepository |
|||
.GetAllChildrenWithWorkflowAsync(workflow.Id, cancellationToken: cancellationToken); |
|||
var compensateNodes = await _compensateNodeRepository |
|||
.GetAllChildrenWithWorkflowAsync(workflow.Id, cancellationToken: cancellationToken); |
|||
|
|||
_workflowManager.Register(workflow, stepNodes, compensateNodes); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue