Ejemplo n.º 1
0
        public static string Cooperation(WorkflowContext context, ExecutingContext executeContext)
        {
            string           resultTo        = String.Empty;
            Node             current         = context.Current;
            AbstractWorkflow workflowService = WorkflowGlobalServiceProvider.Resolve <AbstractWorkflow>();

            IWorkflowCooperationService workflowCooperationService = workflowService.NodeService.WorkflowCooperationService;
            IStrategyService            strategyService            = (IStrategyService)Utils.CreateInstance(current.Assistant);
            string instanceID = context.Instance.InstanceID;

            workflowService.NodeService.WorkflowCooperationService.Persistent(new WorkflowCooperation
            {
                NodeID       = current.NID,
                InstanceID   = context.Instance.InstanceID,
                TransitionID = context.TransitionID,
                CreateTime   = DateTime.Now
            });

            IList <WorkflowCooperation> records = workflowCooperationService.Query(instanceID).Where(e => e.NodeID == current.NID).ToList();

            executeContext.Result = strategyService.Check(records);
            if (executeContext.Result)
            {
                IWorkflowCooperationDecision workflowCooperationDecision = (IWorkflowCooperationDecision)Utils.CreateInstance(current.Cooperation);
                resultTo = workflowCooperationDecision.Execute(records);
                workflowService.NodeService.WorkflowCooperationService.Delete(instanceID, current.NID);
            }
            else
            {
                workflowService.Actions.ForEach(pluin => pluin.ActionExecute(executeContext));
            }
            return(resultTo);
        }
Ejemplo n.º 2
0
        internal static IDbConnection CreateWorkflowConnection()
        {
            SmartflowConfiguration config =
                WorkflowGlobalServiceProvider.Resolve <ISmartflowConfigurationService>().GetConfiguration();

            return(DbFactory.CreateConnection(config.ProviderName, config.ConnectionString));
        }
Ejemplo n.º 3
0
        protected void Application_Start(object sender, EventArgs e)
        {
            //注册全局的动作 即每跳转一个节点,都会执行动作。
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(PendingAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(RecordAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(FormAction));

            //注册局部动作即跳转到特定节点中执行的动作
            WorkflowGlobalServiceProvider.RegisterPartService(new EmptyAction());



            NinjectDependencyResolver dependencyResolver = new NinjectDependencyResolver();


            dependencyResolver.Register <IBridgeService, BridgeService>();
            dependencyResolver.Register <IQuery <IList <Category> >, CategoryService>();
            dependencyResolver.Register <IPendingService, PendingService>();
            dependencyResolver.Register <IQuery <IList <Record>, string>, RecordService>();
            dependencyResolver.Register <IQuery <IList <Constraint> >, ConstraintService>();
            dependencyResolver.Register <AbstractBridgeService, BaseBridgeService>();
            dependencyResolver.Register <IActorService, ActorService>();

            GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;

            GlobalConfiguration.Configuration.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional });
        }
Ejemplo n.º 4
0
        public void ActionExecute(ExecutingContext executingContext)
        {
            var current = executingContext.To;

            if (current.NodeType != WorkflowNodeCategory.Decision)
            {
                IWorkflowNodeService workflowNodeService = WorkflowGlobalServiceProvider.Resolve <IWorkflowNodeService>();
                workflowNodeService.Execute(current);
            }
        }
Ejemplo n.º 5
0
        public JsonResult QueryAction()
        {
            IList <dynamic> types = new List <dynamic>();

            foreach (IWorkflowAction action in WorkflowGlobalServiceProvider.QueryActions())
            {
                Type type = action.GetType();
                types.Add(new {
                    id   = type.FullName,
                    name = type.Name
                });
            }
            return(Json(types));
        }
Ejemplo n.º 6
0
        protected void Application_Start()
        {
            //注册全局的动作 即每跳转一个节点,都会执行动作。
            WorkflowGlobalServiceProvider.RegisterGlobalService(new PendingAction());
            WorkflowGlobalServiceProvider.RegisterGlobalService(new RecordAction());

            //注册局部动作 即跳转到特定节点中执行的动作
            WorkflowGlobalServiceProvider.RegisterPartService(new DefaultAction());
            WorkflowGlobalServiceProvider.RegisterPartService(new TestAction());

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
Ejemplo n.º 7
0
        public void Jump(WorkflowContext context)
        {
            string       instanceID        = context.Instance.InstanceID;
            Node         current           = context.Current;
            Transition   currentTransition = WorkflowGlobalServiceProvider.Resolve <IWorkflowTransitionService>().GetTransition(context.TransitionID);
            IList <Node> nodes             = workflowService.NodeService.Query(instanceID);
            Node         to = nodes.FirstOrDefault(e => e.ID == currentTransition.Destination);

            this.Invoke(to, currentTransition, new ExecutingContext
            {
                From      = current,
                To        = to,
                Direction = WorkflowOpertaion.Go,
                Instance  = context.Instance,
                Data      = context.Data,
                Message   = context.Message,
                Result    = context.Result
            }, context);
        }
Ejemplo n.º 8
0
        protected void Application_Start()
        {
            //优先放置在最前面
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(SmartflowConfigurationService));

            //注册全局的动作 即每跳转一个节点,都会执行动作。
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(PendingAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(RecordAction));

            //注册局部动作 即跳转到特定节点中执行的动作
            WorkflowGlobalServiceProvider.RegisterPartService(new DefaultAction());
            WorkflowGlobalServiceProvider.RegisterPartService(new TestAction());

            //自定义协办服务
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(SmartWorkflowCooperation));

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
Ejemplo n.º 9
0
        protected void Application_Start(object sender, EventArgs e)
        {
            var config = GlobalConfiguration.Configuration;

            config.Filters.Add(new ArgumentCheckAttribute());

            NinjectDependencyResolver dependencyResolver = new NinjectDependencyResolver();

            dependencyResolver.Register <ISummaryService, SummaryService>();
            dependencyResolver.Register <IBridgeService, BridgeService>();
            dependencyResolver.Register <IQuery <IList <Category> >, CategoryService>();
            dependencyResolver.Register <IPendingService, PendingService>();
            dependencyResolver.Register <IQuery <List <Record>, string>, RecordService>();
            dependencyResolver.Register <IQuery <IList <Constraint> >, ConstraintService>();
            dependencyResolver.Register <AbstractBridgeService, BaseBridgeService>();
            dependencyResolver.Register <IOrganizationService, OrganizationService>();
            dependencyResolver.Register <IActorService, ActorService>();

            GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;

            //注册全局的动作 即每跳转一个节点,都会执行动作。
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(PendingAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(RecordAction));

            //抄送动作
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(CarbonCopyAction));

            //注册局部动作 即跳转到特定节点中执行的动作
            WorkflowGlobalServiceProvider.RegisterPartService(new EmptyAction());

            //config.Routes.MapHttpRoute(
            //       name: "DefaultApi",
            //       routeTemplate: "api/{controller}/{id}",
            //       defaults: new { id = RouteParameter.Optional });

            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional });
        }
Ejemplo n.º 10
0
        protected void Application_Start(object sender, EventArgs e)
        {
            var config = GlobalConfiguration.Configuration;

            //注册全局的动作 即每跳转一个节点,都会执行动作。
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(PendingAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(RecordAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(FormAction));

            //注册局部动作 即跳转到特定节点中执行的动作
            WorkflowGlobalServiceProvider.RegisterPartService(new TestAction());

            //config.Routes.MapHttpRoute(
            //       name: "DefaultApi",
            //       routeTemplate: "api/{controller}/{id}",
            //       defaults: new { id = RouteParameter.Optional });

            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional });
        }
Ejemplo n.º 11
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(e =>
            {
                e.Filters.Add(typeof(ApiControllerException));
                e.Filters.Add(typeof(ArgumentCheckAttribute));
            })
            .AddNewtonsoftJson(option =>
            {
                option.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
                // 忽略循环引用
                option.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                // 设置时间格式
                option.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                // 如字段为null值,该字段不会返回到前端
                // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
            });

            services.AddTransient <ISummaryService, SummaryService>();
            services.AddTransient <IBridgeService, BridgeService>();
            services.AddTransient <IQuery <IList <Category> >, CategoryService>();
            services.AddTransient <IPendingService, PendingService>();
            services.AddTransient <IRecordService, RecordService>();
            services.AddTransient <IQuery <IList <Constraint> >, ConstraintService>();
            services.AddTransient <AbstractBridgeService, BaseBridgeService>();
            services.AddTransient <IOrganizationService, OrganizationService>();
            services.AddTransient <IActorService, ActorService>();

            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(PendingAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(RecordAction));
            WorkflowGlobalServiceProvider.RegisterGlobalService(typeof(CarbonCopyAction));
            WorkflowGlobalServiceProvider.RegisterPartService(new EmptyAction());

            services.AddAutoMapper((mapper) => mapper.AddProfile(typeof(SmartflowProfile)));
            XmlConfigurator.Configure(LogManager.CreateRepository(GlobalObjectService.Configuration.GetSection("Logging:Program").Value), new FileInfo("log4net.config"));
            services.AddHibernate(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml"));
        }
Ejemplo n.º 12
0
        private void Invoke(Node to, Transition selectTransition, ExecutingContext executeContext, WorkflowContext context)
        {
            string instanceID = context.Instance.InstanceID;
            string actorID    = context.ActorID;

            workflowService.InstanceService.Jump(selectTransition.Origin, selectTransition.Destination, instanceID, new WorkflowProcess()
            {
                RelationshipID = executeContext.From.NID,
                ActorID        = actorID,
                Origin         = executeContext.From.ID,
                Destination    = executeContext.To.ID,
                TransitionID   = selectTransition.NID,
                InstanceID     = executeContext.Instance.InstanceID,
                NodeType       = executeContext.From.NodeType,
                Direction      = WorkflowOpertaion.Go
            }, workflowService.ProcessService);

            workflowService.Actions.ForEach(pluin => pluin.ActionExecute(executeContext));
            if (to.NodeType == WorkflowNodeCategory.End)
            {
                workflowService.InstanceService.Transfer(WorkflowInstanceState.End, instanceID);
            }
            else if (to.NodeType == WorkflowNodeCategory.Decision)
            {
                Transition transition = workflowService.NodeService.GetTransition(to);
                if (transition == null)
                {
                    return;
                }
                Node nc = workflowService.NodeService.Query(instanceID).Where(e => e.ID == transition.Origin).FirstOrDefault();
                Jump(new WorkflowContext()
                {
                    Instance     = WorkflowInstance.GetInstance(instanceID),
                    TransitionID = transition.NID,
                    Data         = context.Data,
                    Message      = "系统流转",
                    ActorID      = context.ActorID,
                    Current      = nc
                });
            }
            else if (to.NodeType == WorkflowNodeCategory.Fork)
            {
                foreach (Transition transition in to.Transitions)
                {
                    Jump(new WorkflowContext()
                    {
                        Instance     = WorkflowInstance.GetInstance(instanceID),
                        TransitionID = transition.NID,
                        Data         = context.Data,
                        Message      = "系统流转",
                        ActorID      = context.ActorID,
                        Current      = executeContext.To
                    });
                }
            }
            else if (to.NodeType == WorkflowNodeCategory.Merge)
            {
                IList <Transition> transitions =
                    WorkflowGlobalServiceProvider.Resolve <IWorkflowTransitionService>().Query(instanceID);
                int transitonCount = transitions.Count(e => e.Destination == to.ID);
                var newInstance    = WorkflowInstance.GetInstance(instanceID);
                int mergeCount     = WorkflowGlobalServiceProvider.Resolve <IWorkflowLinkService>().GetLink(to.ID, instanceID);

                if (transitonCount == mergeCount)
                {
                    foreach (Transition transition in to.Transitions)
                    {
                        Jump(new WorkflowContext()
                        {
                            Instance     = WorkflowInstance.GetInstance(instanceID),
                            TransitionID = transition.NID,
                            Data         = context.Data,
                            Message      = "系统流转",
                            ActorID      = context.ActorID,
                            Current      = executeContext.To
                        });
                    }
                }
            }
        }