145 lines
6.3 KiB
C#
145 lines
6.3 KiB
C#
using OptimaJet.Workflow.Core.Runtime;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Configuration;
|
|
using OptimaJet.Workflow.Core.Builder;
|
|
using System.Xml.Linq;
|
|
using OptimaJet.Workflow.Core.Parser;
|
|
using OptimaJet.Workflow.Core.Bus;
|
|
using System.Reflection;
|
|
using OptimaJet.Workflow.Core.Persistence;
|
|
using EnVisage;
|
|
using EnVisage.Code.WorkFlow;
|
|
|
|
namespace EnVisage.Code
|
|
{
|
|
public static class WorkFlowEngine
|
|
{
|
|
private static volatile WorkflowRuntime _runtime;
|
|
|
|
private static readonly object _sync = new object();
|
|
|
|
public static WorkflowRuntime Runtime(string connectionString)
|
|
{
|
|
|
|
if (_runtime == null)
|
|
{
|
|
lock (_sync)
|
|
{
|
|
if (_runtime == null)
|
|
{
|
|
|
|
if (ConfigurationManager.ConnectionStrings["DefaultConnection"] != null)
|
|
connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
|
|
|
|
var provider = new OptimaJet.Workflow.DbPersistence.MSSQLProvider(connectionString);
|
|
|
|
var builder = new WorkflowBuilder<XElement>(provider,
|
|
new XmlWorkflowParser(),
|
|
provider
|
|
).WithDefaultCache();
|
|
WorkflowRuntime.RegisterLicense("Nelnet-TmVsbmV0OjA4LjE4LjIwMTc6ZXlKTllYaE9kVzFpWlhKUFprRmpkR2wyYVhScFpYTWlPaTB4TENKTllYaE9kVzFpWlhKUFpsUnlZVzV6YVhScGIyNXpJam90TVN3aVRXRjRUblZ0WW1WeVQyWlRZMmhsYldWeklqb3RNU3dpVFdGNFRuVnRZbVZ5VDJaVWFISmxZV1J6SWpvdE1Td2lUV0Y0VG5WdFltVnlUMlpEYjIxdFlXNWtjeUk2TFRGOTpBYTJlL2hSTWZpQlhyZVduWGlaV2tRdXZ0bEt4Q3R3UFAzb2N6QkZwL0NJWU83cWFmaXRvcTUyVkwybm5EUFl0M3ZFVHBGVmpxaWM4azJWQXQwQVgzMjcxV0FCeno0dVpMMnYxcElaa2dkeTlHc0xQbHN5VTloNHRkeDNmT3JDN3Z0NXhWekR5eVRkUUtDMTN2NjZFeGNYUmJ6UXFLYTQwL3ZNTDdGUnU2Tm89");
|
|
_runtime = new WorkflowRuntime(new Guid("{8D38DB8F-F3D5-4F26-A989-4FDD40F32D9D}"))
|
|
// _runtime = new WorkflowRuntime(Guid.NewGuid())
|
|
.WithBuilder(builder)
|
|
.WithActionProvider(new EnVisage.Code.WorkflowActions())
|
|
.WithRuleProvider(new WorkflowRule())
|
|
.WithPersistenceProvider(provider)
|
|
.WithTimerManager(new TimerManager())
|
|
.WithBus(new NullBus())
|
|
.SwitchAutoUpdateSchemeBeforeGetAvailableCommandsOn()
|
|
.RegisterAssemblyForCodeActions(Assembly.GetExecutingAssembly())
|
|
.RegisterAssemblyForCodeActions(Assembly.GetAssembly(typeof(System.Data.Linq.DataContext)))
|
|
.Start();
|
|
|
|
_runtime.ProcessStatusChanged += _runtime_ProcessStatusChanged;
|
|
}
|
|
}
|
|
}
|
|
return _runtime;
|
|
}
|
|
|
|
static void _runtime_ProcessStatusChanged(object sender, ProcessStatusChangedEventArgs e)
|
|
{
|
|
if (e.NewStatus != ProcessStatus.Idled && e.NewStatus != ProcessStatus.Finalized)
|
|
return;
|
|
|
|
|
|
if (string.IsNullOrEmpty(e.SchemeCode))
|
|
return;
|
|
|
|
|
|
_runtime.PreExecuteFromCurrentActivity(e.ProcessId);
|
|
|
|
if (!string.IsNullOrEmpty(e.ProcessInstance.ExecutedTimer))
|
|
return;
|
|
if (string.IsNullOrEmpty(e.ProcessInstance.IdentityId))
|
|
return;
|
|
|
|
var p = (OptimaJet.Workflow.DbPersistence.MSSQLProvider) _runtime.PersistenceProvider;
|
|
using (var context = EnVisageEntities.PrevuEntity(p.ConnectionString, true))
|
|
{
|
|
try
|
|
{
|
|
var userid = Guid.Parse(e.ProcessInstance.IdentityId);
|
|
var processId = e.ProcessId;
|
|
var processIdStr = e.ProcessId.ToString();
|
|
var projectId = context.Scenarios.Where(x => x.Id == processId).Select(x => x.ParentId).FirstOrDefault();
|
|
if (!projectId.HasValue)
|
|
return;
|
|
var projectIdstr = projectId.Value.ToString();
|
|
var state = _runtime.GetCurrentState(processId);
|
|
var notificationsToRemove = context.Notifications.Where(x => (x.IdinLink == processId || x.IdinLink == projectId.Value
|
|
|| x.Link.Contains(projectIdstr) || x.Link.Contains(processIdStr)) && x.WorkFlowState != null &&
|
|
(x.WorkFlowState != state.Name || x.WorkFlowState != state.VisibleName) && x.ParentId != userid).ToList();
|
|
context.Notifications.RemoveRange(notificationsToRemove);
|
|
context.SaveChanges();
|
|
}catch(Exception clearNotificationEx)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#region Inbox
|
|
private static void FillInboxCallback(IAsyncResult ar)
|
|
{
|
|
|
|
}
|
|
|
|
private static void PreExecuteAndFillInbox(ProcessStatusChangedEventArgs e)
|
|
{
|
|
var processId = e.ProcessId;
|
|
var p = (OptimaJet.Workflow.DbPersistence.MSSQLProvider) _runtime.PersistenceProvider;
|
|
using (var context = EnVisageEntities.PrevuEntity(p.ConnectionString, true))
|
|
{
|
|
FillInbox(processId, context);
|
|
|
|
context.SaveChanges();
|
|
}
|
|
}
|
|
|
|
private static void FillInbox(Guid processId, EnVisageEntities context)
|
|
{
|
|
try
|
|
{
|
|
var newActors = Runtime(context.Database.Connection.ConnectionString).GetAllActorsForDirectCommandTransitions(processId);
|
|
foreach (var newActor in newActors)
|
|
{
|
|
var users = context.User2WorkFlowRole.Where(x => x.WorkFlowRole.RoleName == newActor).Select(x => x.AspNetUser.Id).ToList();
|
|
foreach (var user in users)
|
|
{
|
|
var newInboxItem = new WorkflowInbox() { Id = Guid.NewGuid(), IdentityId = new Guid(user), ProcessId = processId };
|
|
context.WorkflowInboxes.Add(newInboxItem);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception dd) { }
|
|
}
|
|
#endregion
|
|
}
|
|
} |