示例#1
0
        public void CreateWorkflowInstance(WfWorkflow workflow)
        {
            int generatedId = Interlocked.Increment(ref memoryWorkflowInstanceSequenceGenerator);

            workflow.WfwId = generatedId;
            inMemoryWorkflowInstanceStore[generatedId] = workflow;
        }
示例#2
0
        public void AutoValidateNextActivities(WfWorkflow wfWorkflow, int wfActivityDefinitionId)
        {
            WfActivityDefinition activityDefinition = _workflowStorePlugin.ReadActivityDefinition(wfActivityDefinitionId);

            object obj = _itemStorePlugin.ReadItem((int)wfWorkflow.ItemId);
            int?   wfCurrentActivityDefinitionId = null;

            while (CanAutoValidateActivity(activityDefinition, obj))
            {
                WfActivity wfActivityCurrent = AutoValidateActivity(activityDefinition);
                wfCurrentActivityDefinitionId = wfActivityCurrent.WfadId;
                if (_workflowStorePlugin.HasNextActivity(wfActivityCurrent) == false)
                {
                    break;
                }
                activityDefinition = _workflowStorePlugin.FindNextActivity(wfActivityCurrent);
            }

            // Remove this workflow update ?
            if (wfCurrentActivityDefinitionId != null)
            {
                wfWorkflow.WfaId2 = wfCurrentActivityDefinitionId;
                _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);
            }
        }
示例#3
0
        //public async Task<List<WorkFlowLineDto>> GetAllLinesAsync()
        //{
        //    var dbLines = await databaseFixture.Db.WorkflowLine.FindAllAsync(m => m.IsDel == 0);
        //    return dbLines.Select(m => new WorkFlowLineDto
        //    {
        //        LineId = m.Id,
        //        Name = m.Name
        //    }).ToList();
        //}

        //public async Task<WorkFlowLineDto> GetLineAsync(Guid lineid)
        //{
        //    var line = await databaseFixture.Db.WorkflowLine.FindByIdAsync(lineid);
        //    return new WorkFlowLineDto
        //    {
        //        LineId = line.Id,
        //        Name = line.Name
        //    };
        //}

        /// <summary>
        /// new workflow version
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task <bool> NewVersionAsync(WorkFlowDetailDto dto)
        {
            using (var tran = databaseFixture.Db.BeginTransaction())
            {
                try
                {
                    //取出Enable==1 and FlowId=dto.FlowId 肯定存在,并且只能为一条,如果没有情况可能是新的版本正在修改中
                    WfWorkflow dbworkflow = await databaseFixture.Db.Workflow.FindAsync(m => m.Enable == 1 && m.FlowId == dto.FlowId);

                    WfWorkflow newworkflow = dbworkflow;

                    dbworkflow.Enable = 0;
                    dbworkflow.IsOld  = 1;
                    await databaseFixture.Db.Workflow.UpdateAsync(dbworkflow);

                    //new workflow
                    newworkflow.FlowName     = newworkflow.FlowName + "-NEW";
                    newworkflow.Enable       = 0;
                    newworkflow.CreateTime   = DateTime.Now.ToTimeStamp();
                    newworkflow.CreateUserId = dto.CreateUserId;
                    newworkflow.FlowVersion++;
                    newworkflow.FlowId = Guid.NewGuid();//重新创建FlowId 使用FlowCode判断流程几个版本
                    newworkflow.IsOld  = 0;
                    await databaseFixture.Db.Workflow.InsertAsync(newworkflow);

                    tran.Commit();
                    return(true);
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    return(false);
                }
            }
        }
示例#4
0
        public IList <WfActivity> FindActivitiesByWorkflowId(WfWorkflow wfWorkflow)
        {
            FilterCriteria filterCriteria = new FilterCriteria();

            filterCriteria.Equals(WfWorkflow.Cols.WFW_ID, wfWorkflow.WfwId);
            return(new List <WfActivity>(BrokerManager.GetBroker <WfActivity>().GetAllByCriteria(filterCriteria)));
        }
示例#5
0
 public void AddWorkflowsUpdateCurrentActivity(WfWorkflow wf)
 {
     WorkflowsUpdateCurrentActivity[wf.WfwId.Value] = new WfWorkflowUpdate()
     {
         WfwId = wf.WfwId, WfaId2 = wf.WfaId2
     };
 }
示例#6
0
 public void ResumeInstance(WfWorkflow wfWorkflow)
 {
     Debug.Assert(wfWorkflow != null);
     Debug.Assert(WfCodeStatusWorkflow.Pau.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be paused before resuming");
     //---
     wfWorkflow.WfsCode = WfCodeStatusWorkflow.Sta.ToString();
     _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);
 }
示例#7
0
 public void EndInstance(WfWorkflow wfWorkflow)
 {
     Debug.Assert(wfWorkflow != null);
     Debug.Assert(WfCodeStatusWorkflow.Sta.ToString().Equals(wfWorkflow.WfsCode) || WfCodeStatusWorkflow.Pau.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be started or paused before ending");
     //---
     wfWorkflow.WfsCode = WfCodeStatusWorkflow.End.ToString();
     _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);
 }
示例#8
0
 public void UpdateWorkflowInstance(WfWorkflow workflow)
 {
     Debug.Assert(workflow != null);
     Debug.Assert(workflow.WfwdId != null);
     Debug.Assert(inMemoryWorkflowInstanceStore.ContainsKey(workflow.WfwId), "This workflow cannot be updated : It does not exist in the store");
     //---
     inMemoryWorkflowInstanceStore[workflow.WfwId] = workflow;
 }
示例#9
0
        public WfActivity FindActivityByDefinitionWorkflow(WfWorkflow wfWorkflow, WfActivityDefinition wfActivityDefinition)
        {
            FilterCriteria filterCriteria = new FilterCriteria();

            filterCriteria.Equals(WfActivity.Cols.WFW_ID, wfWorkflow.WfwId.Value);
            filterCriteria.Equals(WfActivity.Cols.WFAD_ID, wfActivityDefinition.WfadId.Value);
            return(BrokerManager.GetBroker <WfActivity>().FindByCriteria(filterCriteria));
        }
示例#10
0
        public IList <WfDecision> FindDecisionsByWorkflowId(WfWorkflow wfWorkflow)
        {
            Debug.Assert(wfWorkflow != null);
            //--
            var cmd = GetSqlServerCommand("FindDecisionsByWorkflowId.sql");

            cmd.Parameters.AddWithValue(WfWorkflow.Cols.WFW_ID, wfWorkflow.WfwId);
            return(new List <WfDecision>(cmd.ReadList <WfDecision>()));
        }
示例#11
0
        public void SaveDecision(WfWorkflow wfWorkflow, WfDecision wfDecision)
        {
            Debug.Assert(WfCodeStatusWorkflow.Sta.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be started before saving decision");
            //---
            WfActivity currentActivity = _workflowStorePlugin.ReadActivity((int)wfWorkflow.WfaId2);

            // Attach decision to the activity
            wfDecision.WfaId = (int)currentActivity.WfaId;
            _workflowStorePlugin.CreateDecision(wfDecision);
        }
示例#12
0
        public IList <WfActivity> FindActivitiesByDefinitionId(WfWorkflow wfWorkflow, IList <int> wfadId)
        {
            Debug.Assert(wfWorkflow != null);
            Debug.Assert(wfadId != null);
            //--
            var cmd = GetSqlServerCommand("FindActivitiesByDefinitionId.sql");

            cmd.Parameters.AddInParameter(ACT_DEF_ID, wfadId);
            cmd.Parameters.AddWithValue(WfWorkflow.Cols.WFW_ID, wfWorkflow.WfwId);
            return(new List <WfActivity>(cmd.ReadList <WfActivity>()));
        }
        private WfActivity GetNewActivity(WfActivityDefinition activityDefinition, WfWorkflow wfWorkflow, bool isAuto, bool isValid)
        {
            WfActivity wfActivity = new WfActivity();

            wfActivity.CreationDate = DateTime.Now;
            wfActivity.WfadId       = activityDefinition.WfadId.Value;
            wfActivity.WfwId        = wfWorkflow.WfwId.Value;
            wfActivity.IsAuto       = isAuto;
            wfActivity.IsValid      = isValid;
            return(wfActivity);
        }
示例#14
0
        public WfActivity FindActivityByDefinitionWorkflow(WfWorkflow wfWorkflow, WfActivityDefinition wfActivityDefinition)
        {
            foreach (WfActivity wfActivity in inMemoryActivityStore.Values)
            {
                if (wfActivityDefinition.WfadId.Equals(wfActivity.WfadId))
                {
                    return(wfActivity);
                }
            }

            return(null);
        }
示例#15
0
        public IList <WfActivity> FindActivitiesByWorkflowId(WfWorkflow wfWorkflow)
        {
            Debug.Assert(wfWorkflow != null);
            //---
            IList <WfActivity> wfActivities = new List <WfActivity>();

            foreach (WfActivity wfActivity in inMemoryActivityStore.Values)
            {
                if (wfWorkflow.WfwId.Equals(wfActivity.WfwId))
                {
                    wfActivities.Add(wfActivity);
                }
            }

            return(wfActivities);
        }
示例#16
0
        public IList <WfActivity> FindActivitiesByDefinitionId(WfWorkflow wfWorkflow, IList <int> wfadIds)
        {
            Debug.Assert(wfWorkflow != null);
            Debug.Assert(wfadIds != null);
            //---
            IList <WfActivity> wfActivities = new List <WfActivity>();

            foreach (WfActivity wfActivity in inMemoryActivityStore.Values)
            {
                if (wfadIds.Contains(wfActivity.WfaId.Value) && wfWorkflow.WfwId.Equals(wfActivity.WfwId))
                {
                    wfActivities.Add(wfActivity);
                }
            }

            return(wfActivities);
        }
示例#17
0
        public void StartInstance(WfWorkflow wfWorkflow)
        {
            Debug.Assert(wfWorkflow == null);
            Debug.Assert(WfCodeStatusWorkflow.Sta.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be started before pausing");
            //---
            wfWorkflow.WfsCode = WfCodeStatusWorkflow.Sta.ToString();

            WfWorkflowDefinition wfWorkflowDefinition = _workflowStorePlugin.ReadWorkflowDefinition((int)wfWorkflow.WfwdId);

            WfActivity wfActivityCurrent = new WfActivity();

            wfActivityCurrent.CreationDate = new DateTime();
            wfActivityCurrent.WfadId       = (int)wfWorkflowDefinition.WfadId;
            _workflowStorePlugin.CreateActivity(wfActivityCurrent);
            wfWorkflow.WfaId2 = wfActivityCurrent.WfaId;
            _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);

            AutoValidateNextActivities(wfWorkflow, (int)wfWorkflowDefinition.WfadId);
        }
示例#18
0
        public WfWorkflow CreateWorkflowInstance(string definitionName, string user, bool userLogic, int item)
        {
            Debug.Assert(definitionName != null);
            Debug.Assert(user != null);
            //---
            WfWorkflowDefinition wfWorkflowDefinition = _workflowStorePlugin.ReadWorkflowDefinition(definitionName);
            WfWorkflow           wfWorkflow           = new WfWorkflow();

            wfWorkflow.CreationDate = new DateTime();
            wfWorkflow.ItemId       = item;
            wfWorkflow.WfsCode      = WfCodeStatusWorkflow.Cre.ToString();
            wfWorkflow.WfwdId       = wfWorkflowDefinition.WfwdId;
            wfWorkflow.WfaId2       = wfWorkflowDefinition.WfadId;
            wfWorkflow.UserLogic    = userLogic;
            wfWorkflow.User         = user;

            _workflowStorePlugin.CreateWorkflowInstance(wfWorkflow);

            return(wfWorkflow);
        }
示例#19
0
        public IList <WfDecision> FindDecisionsByWorkflowId(WfWorkflow wfWorkflow)
        {
            Debug.Assert(wfWorkflow != null);
            Debug.Assert(wfWorkflow.WfwId != null);
            //---

            IList <WfActivity> wfActivities = FindActivitiesByWorkflowId(wfWorkflow);

            IList <int> wfActivitiesId = wfActivities.Select <WfActivity, int>(a => a.WfaId.Value).ToList();

            IList <WfDecision> wfDecisions = new List <WfDecision>();

            foreach (WfDecision wfDecision in inMemoryDecisionStore.Values)
            {
                if (wfActivitiesId.Contains(wfDecision.WfaId))
                {
                    wfDecisions.Add(wfDecision);
                }
            }

            return(wfDecisions);
        }
示例#20
0
        public void CreateWorkflowInstance(WfWorkflow workflow)
        {
            int id = (int)BrokerManager.GetBroker <WfWorkflow>().Save(workflow);

            workflow.WfwId = id;
        }
示例#21
0
 public void UpdateWorkflowInstance(WfWorkflow workflow)
 {
     BrokerManager.GetBroker <WfWorkflow>().Save(workflow);
 }
        public void CustomRecalculation(IList <WfActivityDefinition> activityDefinitions, RuleConstants ruleConstants, WfWorkflow wf, IDictionary <int, List <RuleDefinition> > dicRules, IDictionary <int, List <RuleConditionDefinition> > dicConditions, IDictionary <int, List <SelectorDefinition> > dicSelectors, IDictionary <int, List <RuleFilterDefinition> > dicFilters, IDictionary <int, List <WfActivity> > dicActivities, IDictionary <int, List <WfDecision> > dicDecision, IDictionary <int, object> dicObjects, WfRecalculationOutput output)
        {
            object obj;

            dicObjects.TryGetValue(wf.ItemId.Value, out obj);

            if (obj == null)
            {
                // No item associated to this workflow.
                return;
            }

            List <WfActivity> allActivities;

            dicActivities.TryGetValue(wf.WfwId.Value, out allActivities);

            if (allActivities == null)
            {
                // No activity for this workflow.
                allActivities = new List <WfActivity>();
            }

            IDictionary <int, WfActivity> activities = allActivities.ToDictionary(a => a.WfadId);

            WfActivity currentActivity = allActivities.Where(a => a.WfaId.Equals(wf.WfaId2.Value)).FirstOrDefault();
            IList <WfActivityDefinition> nextActivityDefinitions;

            if (currentActivity != null)
            {
                nextActivityDefinitions = activityDefinitions.SkipWhile(ad => ad.WfadId.Equals(currentActivity.WfadId) == false).ToList();
            }
            else
            {
                nextActivityDefinitions = activityDefinitions;
            }

            RuleContext ruleContext = new RuleContext(obj, ruleConstants);

            foreach (WfActivityDefinition ad in nextActivityDefinitions)
            {
                WfActivity activity;
                activities.TryGetValue(ad.WfadId.Value, out activity);
                int actDefId = ad.WfadId.Value;

                bool isManual = _ruleManager.IsRuleValid(actDefId, ruleContext, dicRules, dicConditions);

                if (isManual)
                {
                    IList <AccountUser> accounts = _ruleManager.SelectAccounts(actDefId, ruleContext, dicSelectors, dicFilters);
                    isManual = accounts.Count > 0;
                }

                if (isManual)
                {
                    if (activity == null)
                    {
                        WfActivity wfActivity = GetNewActivity(ad, wf, false, false);
                        output.AddActivitiesCreateUpdateCurrentActivity(wfActivity);
                        break;
                    }

                    if (activity.IsValid == false)
                    {
                        wf.WfaId2 = activity.WfaId;
                        output.AddWorkflowsUpdateCurrentActivity(wf);
                        break;
                    }
                }
                else
                {
                    if (activity == null)
                    {
                        WfActivity wfActivity = GetNewActivity(ad, wf, true, false);
                        output.AddActivitiesCreate(wfActivity);
                    }
                    else
                    {
                        activity.IsAuto = true;
                        output.AddActivitiesUpdateIsAuto(activity);
                    }
                }
            }
        }
示例#23
0
 public List <WfActivity> GetActivities(WfWorkflow wfWorkflow)
 {
     ///TODO
     throw new NotImplementedException();
 }
示例#24
0
 public void SaveDecisionAndGoToNextActivity(WfWorkflow wfWorkflow, WfDecision wfDecision)
 {
     SaveDecisionAndGoToNextActivity(wfWorkflow, WfCodeTransition.Default.ToString(), wfDecision);
 }
示例#25
0
        public void SaveDecisionAndGoToNextActivity(WfWorkflow wfWorkflow, string transitionName, WfDecision wfDecision)
        {
            Debug.Assert(WfCodeStatusWorkflow.Sta.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be started before saving decision");
            //---
            WfActivity currentActivity = _workflowStorePlugin.ReadActivity((int)wfWorkflow.WfaId2);

            // Updating the decision
            SaveDecision(wfWorkflow, wfDecision);

            WfActivityDefinition currentActivityDefinition = _workflowStorePlugin.ReadActivityDefinition(currentActivity.WfadId);

            WfCodeMultiplicityDefinition wfCodeMultiplicityDefinition = (WfCodeMultiplicityDefinition)Enum.Parse(typeof(WfCodeMultiplicityDefinition), currentActivityDefinition.WfmdCode);

            bool canGoToNextActivity = false;

            if (wfCodeMultiplicityDefinition == WfCodeMultiplicityDefinition.Mul)
            {
                IList <WfDecision>  wfDecisions   = _workflowStorePlugin.FindAllDecisionByActivity(currentActivity);
                object              obj           = _itemStorePlugin.ReadItem((int)wfWorkflow.ItemId);
                RuleConstants       ruleConstants = _ruleManager.GetConstants((int)wfWorkflow.WfwdId);
                IList <AccountUser> accounts      = _ruleManager.SelectAccounts(currentActivity.WfadId, obj, ruleConstants);

                //TODO : better impl than O(n²)
                int match = 0;
                foreach (AccountUser account in accounts)
                {
                    foreach (WfDecision decision in wfDecisions)
                    {
                        if (account.Id.Equals(decision.User))
                        {
                            match++;
                            break;
                        }
                    }
                }

                if (match == accounts.Count)
                {
                    canGoToNextActivity = true;
                }
            }
            else
            {
                canGoToNextActivity = true;
            }

            if (canGoToNextActivity)
            {
                if (_workflowStorePlugin.HasNextActivity(currentActivity, transitionName))
                {
                    WfActivityDefinition nextActivityDefinition = _workflowStorePlugin.FindNextActivity(currentActivity, transitionName);

                    //Autovalidating next activities
                    AutoValidateNextActivities(wfWorkflow, (int)nextActivityDefinition.WfadId);

                    WfActivity           lastAutoValidateActivity      = _workflowStorePlugin.ReadActivity((int)wfWorkflow.WfaId2);
                    WfActivityDefinition nextActivityDefinitionPrepare = _workflowStorePlugin.FindNextActivity(lastAutoValidateActivity);

                    DateTime now = new DateTime();
                    // Creating the next activity to validate.
                    WfActivity nextActivity = new WfActivity();
                    nextActivity.CreationDate = now;
                    nextActivity.WfadId       = (int)nextActivityDefinitionPrepare.WfadId;
                    nextActivity.WfwId        = (int)wfWorkflow.WfwId;
                    _workflowStorePlugin.CreateActivity(nextActivity);

                    wfWorkflow.WfaId2 = nextActivity.WfaId;
                    _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);
                }
                else
                {
                    // No next activity to go. Ending the workflow
                    wfWorkflow.WfsCode = WfCodeStatusWorkflow.End.ToString();
                    _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow);
                }
            }
        }