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