An ABP module that helps define and track business processes.
-
Install the following NuGet packages. (see how)
- EasyAbp.ProcessManagement.Application
- EasyAbp.ProcessManagement.Application.Contracts
- EasyAbp.ProcessManagement.Domain
- EasyAbp.ProcessManagement.Domain.Shared
- EasyAbp.ProcessManagement.EntityFramework
- EasyAbp.ProcessManagement.HttpApi
- EasyAbp.ProcessManagement.HttpApi.Client
- EasyAbp.ProcessManagement.Web
-
Add
DependsOn(typeof(Abp.ProcessManagementXxxModule))
attribute to configure the module dependencies. (see how)
-
Define a process and states. For idempotency, stages can only transition from their father state.
Configure<ProcessManagementOptions>(options => { var definition = new ProcessDefinition("MyProcess", new LocalizableString("Process:MyProcess")) .AddState(new ProcessStateDefinition( name: "Ready", displayName: new LocalizableString("State:Ready"), fatherStateName: null, defaultStateFlag: ProcessStateFlag.Information)) .AddState(new ProcessStateDefinition( name: "Failed", displayName: new LocalizableString("State:Failed"), fatherStateName: "Ready", defaultStateFlag: ProcessStateFlag.Failure)) .AddState(new ProcessStateDefinition( name: "Succeeded", displayName: new LocalizableString("State:Succeeded"), fatherStateName: "Ready", defaultStateFlag: ProcessStateFlag.Success)); options.AddOrUpdateProcessDefinition(definition); });
-
Now you can create a process and update its state anytime, anywhere.
/* * Only a specific user can view this process. You can implement IUserGroupContributor yourself * to specify more than one user to view this process, e.g. OrganizationUnitUserGroupContributor. */ var groupKey = await _userIdUserGroupContributor.CreateGroupKeyAsync(adminUser!.Id.ToString()); // Create a process. var process1 = await _processManager.CreateAsync( new CreateProcessModel( processName: "MyProcess", correlationId: null, // If null, this value will be auto-set to the value of the Id of the Process entity. groupKey: groupKey ), Clock.Now); // When your process is moving forward. await _processManager.UpdateStateAsync(process1, new UpdateProcessStateModel( stateUpdateTime: Clock.Now, stateName: "Succeeded")); // Or add more information. await _processManager.UpdateStateAsync(process1, new UpdateProcessStateModel( stateUpdateTime: Clock.Now, stateName: "Succeeded", actionName: "Export is done!", stateFlag: ProcessStateFlag.Success, // If null, use the default value you defined. stateSummaryText: "Congratulations! Export successful."));
-
If you want, you can create user actions for states.
Configure<ProcessManagementWebOptions>(options => { options.Actions.Add(new ProcessStateActionDefinition( processName: "MyProcess", stateName: "Failed", displayName: new LocalizableString("Action:Ping"), tableOnClickCallbackCode: "window.alert('Pong')", // Not shown in process list page if null. offcanvasOnClickCallbackCode: "window.alert('Pong')", // Not shown in notifications offcanvas if null. visibleCheckCode: "abp.auth.isGranted('MyProject.MyProcess.Ping')")); });
- Use websocket to update notifications. #30
- Better process details modal.