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