EnVisageOnline/Main/Source/EnVisage/Code/WorkFlowEngine/WorkFlowEngine.cs

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
}
}