public void CreateWorkflowInstance(WfWorkflow workflow) { int generatedId = Interlocked.Increment(ref memoryWorkflowInstanceSequenceGenerator); workflow.WfwId = generatedId; inMemoryWorkflowInstanceStore[generatedId] = workflow; }
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); } }
//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); } } }
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))); }
public void AddWorkflowsUpdateCurrentActivity(WfWorkflow wf) { WorkflowsUpdateCurrentActivity[wf.WfwId.Value] = new WfWorkflowUpdate() { WfwId = wf.WfwId, WfaId2 = wf.WfaId2 }; }
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); }
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); }
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; }
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)); }
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>())); }
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); }
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); }
public WfActivity FindActivityByDefinitionWorkflow(WfWorkflow wfWorkflow, WfActivityDefinition wfActivityDefinition) { foreach (WfActivity wfActivity in inMemoryActivityStore.Values) { if (wfActivityDefinition.WfadId.Equals(wfActivity.WfadId)) { return(wfActivity); } } return(null); }
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); }
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); }
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); }
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); }
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); }
public void CreateWorkflowInstance(WfWorkflow workflow) { int id = (int)BrokerManager.GetBroker <WfWorkflow>().Save(workflow); workflow.WfwId = id; }
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); } } } }
public List <WfActivity> GetActivities(WfWorkflow wfWorkflow) { ///TODO throw new NotImplementedException(); }
public void SaveDecisionAndGoToNextActivity(WfWorkflow wfWorkflow, WfDecision wfDecision) { SaveDecisionAndGoToNextActivity(wfWorkflow, WfCodeTransition.Default.ToString(), wfDecision); }
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); } } }