public string GetWorkItemDisplayText(SysWorkItem wi, SysProcessInstance pi, SysActivityInstance ai) { string str6; try { SysActivity activity = ai.Activity; if (activity == null) { throw new ApplicationException(string.Format("活动实例:{0}找不到对应活动", ai.ActivityInstanceId)); } SysProcess process = pi.Process; if (process == null) { throw new ApplicationException(string.Format("活动:{0}找不到对应流程", activity.ActivityId)); } string activityName = activity.ActivityName; string processName = process.ProcessName; if (process.ProcessCategory == 2) { return(string.Format("[{0}][{1}]{2}", processName, activityName, pi.FormInstance.FormTitle)); } EntityCache cache = new EntityCache(this._manager); SysEntity processEntity = process.ProcessEntity; string objectDisplayName = cache.GetObjectDisplayName(processEntity, wi.RelativeObjectId.Value); str6 = string.Format("[{0}][{1}]{2}", processName, activityName, objectDisplayName); } catch (Exception exception) { throw exception; } return(str6); }
public List <SysActivity> GetNextActivityList(string processName) { List <SysActivity> list2; try { List <SysActivity> list = new List <SysActivity>(); SysProcess processCache = this._processCache.GetProcessCache(processName); if (processCache == null) { throw new ApplicationException(string.Format("流程名称[{0}]不正确", processName)); } SysActivity activity = processCache.Activities.FirstOrDefault <SysActivity>(p => p.ActivityType == 1); if (activity != null) { list = (from p in activity.FromTransitions select p.PostActivity).ToList <SysActivity>(); } list2 = list; } catch (Exception exception) { AppLogHelper.Error(string.Format("GetNextActivityList,processName=[{0}]失败", processName), exception); throw exception; } return(list2); }
public int StartProcess(string processName, int startUserId, int relativeObjectId) { int num2; try { int num; ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcess processCache = runtimeContext.PCacheFactory.GetProcessCache(processName); ProcessEngine engine = new ProcessEngine(runtimeContext, processCache); if (processCache.ProcessCategory == 2) { num = engine.StartFormProcess(startUserId, relativeObjectId); } else { num = engine.StartProcess(startUserId, relativeObjectId); } num2 = num; } catch (Exception exception) { AppLogHelper.Error(string.Format("启动流程[{0}], obj={1}失败", processName, relativeObjectId), exception); throw exception; } return(num2); }
private SysProcessInstance LoadProcessInstance(int processInstanceId) { SysProcessInstance pi = this._context.FindById <SysProcessInstance>(new object[] { processInstanceId }); if (pi == null) { throw new ApplicationException("流程实例ID不正确"); } if (pi.FormInstanceId.HasValue) { pi.FormInstance = this._context.FindById <SysFormInstance>(new object[] { pi.FormInstanceId }); if (pi.FormInstance == null) { throw new ApplicationException("流程实例关联表单实例不存在"); } } SysProcess processCache = this._processCache.GetProcessCache(pi.ProcessId.Value); pi.Process = processCache; string condition = string.Format("ProcessInstanceId = {0}", pi.ProcessInstanceId); pi.ActivityInstances = this._context.Where <SysActivityInstance>(condition, new DbParameter[0]); foreach (SysActivityInstance instance2 in pi.ActivityInstances) { this.LoadActivityInstance(instance2, pi, processCache); } return(pi); }
private List <SysEvent> parseSequence(EventContext[] any) { List <SysEvent> sequence = new List <SysEvent>(); foreach (EventContext i in any) { if (i.process() != null) { // event is process such as proc() SysProcess proc = (SysProcess)VisitProcess(i.process()); sequence.Add(proc); } else if (i.channel() != null) { // event is channel input or output SysChannel channel = null; if ((i.channel().channelOutput() != null) && (i.channel().channelOutput().ID() != null)) { channel = new SysChannel(i.channel().ID().GetText(), SysChannel.Type.Output); channel.Parameters.Add(i.channel().channelOutput().ID().GetText()); } else if ((i.channel().channelInput() != null) && (i.channel().channelInput().ID() != null)) { channel = new SysChannel(i.channel().ID().GetText(), SysChannel.Type.Input); channel.Parameters.Add(i.channel().channelInput().ID().GetText()); } sequence.Add(channel); } } return(sequence); }
/// <summary> /// 初始化 /// </summary> private void Initialize() { long?id = QueryString <long?>("id"); SysProcess process = this.DataHelper.FindById <SysProcess>(id); if (process != null) { this.ProcessId = id.Value; if (!string.IsNullOrEmpty(process.ProcessName)) { if (!string.IsNullOrEmpty(process.ProcessVersion)) { BindAndValidateData(process); } else { AddError(new Exception("流程版本内部错误,请重建流程")); } } else { AddError(new Exception("流程名称为空,请返回第一步配置")); } } else { AddError(new Exception("流程不存在")); } this.btnPublish.Visible = errorList.Count == 0; this.gcError.DataSource = errorList; this.gcError.DataBind(); }
public override void Execute(Queue <WorkflowMessage> queue) { this.JustCompleteCurrentAI(); SysActivity activity = this.AI.Activity; SysProcess process = activity.Process; if (activity.ActivityType == 3) { this.CompleteNormalActivity(queue, process, activity); } else if (activity.ActivityType == 1) { this.CompleteStartActivity(queue, process, activity); } else if (activity.ActivityType == 2) { this.CompleteDecisionActivity(queue, process, activity); } else if (activity.ActivityType == 4) { this.CompleteEndActivity(queue, process, activity); } else { if (activity.ActivityType != 6) { throw new ApplicationException("未知的活动类型"); } this.CompleteApproveActivity(queue, process, activity); } }
private void CompleteNormalActivity(Queue <WorkflowMessage> queue, SysProcess process, SysActivity activity) { if (activity.ExecType == 0) { new ActivityRemindHandler(base.PICacheFactory, base.PI, this.AI, ActivityRemindUseTimeType.ActivityEnd, null, null).Execute(); } List <SysTransition> trans = process.Transitions.Where <SysTransition>(delegate(SysTransition t) { long?preActivityId = t.PreActivityId; long activityId = activity.ActivityId; return((preActivityId.GetValueOrDefault() == activityId) && preActivityId.HasValue); }).ToList <SysTransition>(); if (trans.Count <= 0) { throw new ApplicationException("没有后续的转换条件"); } SysTransition nextTransition = this.GetNextTransition(trans); if (nextTransition == null) { throw new ApplicationException("所有后续连接线均不满足条件,流程无法继续"); } SysActivityInstance ai = this.CreatePostAcitivtyInstance(base.PI, nextTransition); WorkflowMessage item = base.Engine.NewActivityInstanceCreatedMessage(ai); queue.Enqueue(item); }
/// <summary> /// 初始化 /// </summary> private void Initialize() { long?id = QueryString <long?>("id"); SysProcess process = this.DataHelper.FindById <SysProcess>(id); if (process != null) { this.ProcessId = id.Value; this.lblProcessName.Text = process.ProcessName; SysEntity processEntity = GetEntity(process.EntityId); if (processEntity == null) { throw new Exception("流程实体为空"); } this.lblProcessEntity.Text = processEntity.DisplayText; //hc.Text用于回发 //hc.Value记录当前选中的活动,由前台选中某活动,或调用后台SelectActivity方法更新 this.hc.Text = this.ClientScript.GetPostBackEventReference(this.hc, "select"); this.hcSave.Text = this.ClientScript.GetPostBackEventReference(this.hc, "partSave"); AddHiddenAndFirstActivity(); BindDropDown(); } else { throw new Exception("参数不正确"); } }
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { //加载数据 if (!string.IsNullOrEmpty(Request.QueryString["id"])) { long ProcessId = long.Parse(Request.QueryString["id"]); using (BizDataContext context = new BizDataContext()) { SysProcess process = context.FindById <SysProcess>(ProcessId); if (process != null) { this.lblProcessName.Text = process.ProcessName; this.lblProcessDescription.Text = process.ProcessDescription; this.lblStatus.Text = EnumHelper.GetDescription(typeof(ProcessState), process.ProcessStatus.Value); this.gcProcessProxy.DataSource = context.Where <SysProcessProxy>(p => p.ProcessId == ProcessId).ToList(); this.gcProcessProxy.DataBind(); } } this.btnAdd.PostBackUrl = "~/SystemManagement/ProcessProxyAdd.aspx?ProcessId=" + Request.QueryString["id"]; } } }
/// <summary> /// 初始化 /// </summary> private void Initialize() { long?id = QueryString <long?>("id"); SysProcess process = this.DataHelper.FindById <SysProcess>(id); if (process != null && process.FormId != null) { this.ProcessId = id.Value; this.FormId = process.FormId.Value; //hc.Text用于回发 //hc.Value记录当前选中的活动,由前台选中某活动,或调用后台SelectActivity方法更新 this.hc.Text = this.ClientScript.GetPostBackEventReference(this.hc, "select"); //选中第一个活动 var a = this.DataHelper.Set <SysActivity>() .Where(p => p.ProcessId == this.ProcessId && p.ActivityType == (int)ActivityType.Approve) .OrderBy(p => p.DisplayOrder).FirstOrDefault(); SelectActivity(a); } else { throw new Exception("参数不正确"); } }
internal ProcessEngine(ProcessInstanceCacheFactory runtimeContext, SysProcess process) { this._context = runtimeContext.Context; this._process = process; this._piCacheFactory = runtimeContext; this._manager = this._piCacheFactory.Manager; this._pi = null; }
private void LoadProcessParticipant(SysProcessParticipant pp, SysProcess p) { pp.Process = p; pp.Param_Participant = p.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(i => i.ParticipantId == pp.Param_ParticipantId); string condition = string.Format("participantId = {0}", pp.ParticipantId); pp.ActivityParticipants = this._context.Where <SysActivityParticipant>(condition, new DbParameter[0]); }
public override object GetValue(SysExpression expr, EntityCache cache, ExpressionCache expr_cache, SysProcessInstance pi, SysActivityInstance ai) { SysProcess process = pi.Process; if (process.ProcessEntity == null) { throw new ApplicationException("流程实体为空"); } SysOneMoreRelation relation = expr.Relation; if (relation == null) { throw new ApplicationException("表达式的关系为空"); } if (!relation.ChildEntityId.HasValue) { throw new ApplicationException("表达式的子实体为空"); } if (!process.EntityId.HasValue) { throw new ApplicationException("流程的实体为空"); } if (expr.Relation.ChildEntityId.Value != process.EntityId.Value) { throw new ApplicationException("不正确的关系"); } if (!relation.ParentEntityId.HasValue) { throw new ApplicationException("关系的父实体为空"); } if (!relation.ChildFieldId.HasValue) { throw new ApplicationException("关系的ChildFieldId为空"); } long local1 = relation.ChildFieldId.Value; if (relation.ChildField == null) { throw new ApplicationException("关系的对应字段为空"); } SysEntity processEntity = pi.Process.ProcessEntity; int objectId = pi.ObjectId; EntityData data = cache.GetObject(processEntity, objectId); SysEntity parentEntity = relation.ParentEntity; if (data.ContainsKey(relation.ChildField.FieldName)) { int num2 = Convert.ToInt32(data[relation.ChildField.FieldName]); if (num2 != 0) { object obj2 = cache.GetObject(parentEntity, num2)[expr.Field.FieldName]; expr_cache.Add(expr, obj2); return(obj2); } } throw new ApplicationException(string.Format("计算表达式时需要字段{0},但其未赋值或为空", relation.ChildField.FieldName)); }
private SysProcess GetStartUsedProcessByName(string processName) { SysProcess process = this._context.FirstOrDefault <SysProcess>(i => (i.ProcessName == processName) && (i.ProcessStatus == 1)); if (process == null) { throw new ApplicationException(string.Format("找不到名称为[{0}]的已启用流程", processName)); } return(process); }
private SysProcess LoadProcess(long processId) { SysProcess p = this._context.FindById <SysProcess>(new object[] { processId }); if (p == null) { throw new ApplicationException("流程ID不正确"); } if (p.EntityId.HasValue) { p.ProcessEntity = this.GetEntityCache(p.EntityId.Value); } if (p.ActivityEntityId.HasValue) { p.ActivityEntity = this.GetEntityCache(p.ActivityEntityId.Value); } if (p.FormId.HasValue) { p.Form = this._context.FindById <SysForm>(new object[] { p.FormId }); } string condition = string.Format("processId = {0}", processId); p.Activities = this._context.Where <SysActivity>(condition, new DbParameter[0]); p.ProcessProxies = this._context.Where <SysProcessProxy>(condition, new DbParameter[0]); p.ProcessParticipants = this._context.Where <SysProcessParticipant>(condition, new DbParameter[0]); p.ProcessReminds = this._context.Where <SysProcessRemind>(condition, new DbParameter[0]); p.Expressions = this._context.Where <SysExpression>(condition, new DbParameter[0]); p.Transitions = this._context.Where <SysTransition>(condition, new DbParameter[0]); foreach (SysActivity activity in p.Activities) { this.LoadActivity(activity, p); } foreach (SysProcessProxy proxy in p.ProcessProxies) { proxy.Process = p; } foreach (SysProcessParticipant participant in p.ProcessParticipants) { this.LoadProcessParticipant(participant, p); } foreach (SysProcessRemind remind in p.ProcessReminds) { this.LoadProcessRemind(remind, p); } foreach (SysExpression expression in p.Expressions) { this.LoadExpression(expression, p); } foreach (SysTransition transition in p.Transitions) { LoadTransition(transition, p); } return(p); }
internal ProcessEngine(ProcessInstanceCacheFactory runtimeContext, SysProcessInstance processInstance) { if (processInstance.Process == null) { processInstance.Process = runtimeContext.PCacheFactory.GetProcessCache(processInstance.ProcessId.Value); } this._context = runtimeContext.Context; this._process = processInstance.Process; this._piCacheFactory = runtimeContext; this._manager = this._piCacheFactory.Manager; this._pi = processInstance; }
public int StartProcessAsync(string processName, int startUserId, int relativeObjectId, List <IApproveUser> nextApproveUserList) { SysProcess processCache = this._processCache.GetProcessCache(processName); if (processCache == null) { string errorInfo = string.Format("未找到流程name={0}", processName); AppLogHelper.Error(startUserId, errorInfo, relativeObjectId.ToString()); throw new ApplicationException(errorInfo); } return(this.StartProcessAsync(processCache, startUserId, relativeObjectId, nextApproveUserList)); }
private static void LoadTransition(SysTransition t, SysProcess p) { t.Process = p; t.PreActivity = p.Activities.FirstOrDefault <SysActivity>(i => i.ActivityId == t.PreActivityId); t.PostActivity = p.Activities.FirstOrDefault <SysActivity>(i => i.ActivityId == t.PostActivityId); t.Expression = p.Expressions.FirstOrDefault <SysExpression>(i => i.ExpressionId == t.ExpressionId); t.Expressions = p.Expressions.Where <SysExpression>(delegate(SysExpression i) { long?transitionId = i.TransitionId; long num = t.TransitionId; return((transitionId.GetValueOrDefault() == num) && transitionId.HasValue); }).ToList <SysExpression>(); }
private int StartProcessAsync(SysProcess process, int startUserId, int relativeObjectId, List <IApproveUser> nextApproveUserList) { int num3; try { int num = this._context.GetNextIdentity_Int(false); SysProcessInstance instance = new SysProcessInstance { StartTime = new DateTime?(DateTime.Now), InstanceStatus = 0, ObjectId = relativeObjectId, ProcessId = new long?(process.ProcessId), ProcessInstanceId = num, StartUserId = new int?(startUserId) }; if (process.ProcessCategory == 2) { instance.FormInstanceId = new int?(relativeObjectId); T_User user = this._context.FindById <T_User>(new object[] { startUserId }); if (user != null) { T_Department department = this._context.FindById <T_Department>(new object[] { user.Department_ID }); if (department != null) { instance.StartDeptId = new int?(department.Department_ID); } } } int num2 = this._context.GetNextIdentity_Int(false); SysWorkflowMessage msg = new SysWorkflowMessage { ProcessId = process.ProcessId, ProcessInstanceId = num, CreateTime = DateTime.Now, MessageId = num2, MessageType = WorkflowMessageTypeEnum.StartingProcess, OperationUserId = startUserId, State = SysWorkflowMessageStateEnum.Inited }; if ((nextApproveUserList != null) && (nextApproveUserList.Count > 0)) { msg.NextApproveUserList.AddRange(nextApproveUserList); } this.SaveWorkflowMessage(msg); this._context.Insert(instance); num3 = num; } catch (Exception exception) { AppLogHelper.Error(startUserId, exception, "启动流程[{0}]失败, 流程id={1}, 对象id={2}", new object[] { process.ProcessId, process.ProcessName, relativeObjectId }); throw; } return(num3); }
public int StartProcessAsync(long processId, int startUserId, int relativeObjectId) { SysProcess processCache = this._processCache.GetProcessCache(processId); if (processCache == null) { string errorInfo = string.Format("未找到流程,id={0}", processId); AppLogHelper.Error(startUserId, errorInfo, relativeObjectId.ToString()); throw new ApplicationException(errorInfo); } return(this.StartProcessAsync(processCache, startUserId, relativeObjectId, null)); }
private void LoadExpression(SysExpression e, SysProcess p) { e.Process = p; e.Activity = p.Activities.FirstOrDefault <SysActivity>(i => i.ActivityId == e.ActivityId); if (e.FieldId.HasValue) { e.Field = this.GetFieldCache(e.FieldId.Value); } if (e.RelationId.HasValue) { e.Relation = this.GetRelationCache(e.RelationId.Value); } }
public override object GetValue(SysExpression expr, EntityCache cache, ExpressionCache expr_cache, SysProcessInstance pi, SysActivityInstance ai) { SysProcess process = pi.Process; SysEntity activityEntity = process.ActivityEntity; if (activityEntity == null) { throw new ApplicationException("活动实体为空"); } SysOneMoreRelation relation = expr.Relation; if (relation == null) { throw new ApplicationException("表达式的关系为空"); } if (!relation.ChildEntityId.HasValue) { throw new ApplicationException("表达式的子实体为空"); } if (!process.ActivityEntityId.HasValue) { throw new ApplicationException("活动的实体为空"); } if (expr.Relation.ChildEntityId.Value != process.ActivityEntityId.Value) { throw new ApplicationException("不正确的关系"); } if (!relation.ParentEntityId.HasValue) { throw new ApplicationException("关系的父实体为空"); } if (!relation.ChildFieldId.HasValue) { throw new ApplicationException("关系的ChildFieldId为空"); } long local1 = relation.ChildFieldId.Value; if (relation.ChildField == null) { throw new ApplicationException("关系的对应字段为空"); } int activityInstanceId = ai.ActivityInstanceId; EntityData data = cache.GetObject(activityEntity, activityInstanceId); SysEntity parentEntity = relation.ParentEntity; int num2 = Convert.ToInt32(data[relation.ChildField.FieldName]); object obj2 = cache.GetObject(parentEntity, num2)[expr.Field.FieldName]; expr_cache.Add(expr, obj2); return(obj2); }
/// <summary> /// 初始化 /// </summary> private void Initialize() { var formList = this.DataHelper.Set <SysForm>().Where(p => p.State == (int)FormState.StartUsed).ToList(); this.ddlForm.DataSource = formList; this.ddlForm.DataBind(); long?id = QueryString <long?>("id"); if (id == null) { this.txtProcessName.SetValue(null); this.ddlForm.SetValue(null); this.ProcessId = this.DataHelper.GetNextIdentity(); } else { SysProcess process = this.DataHelper.FindById <SysProcess>(id); if (process != null) { //不是“新增”状态,需要复制一份 if (process.ProcessStatus != (int)ProcessState.Created) { FormProcessPublishHelper helper = new FormProcessPublishHelper(process); SysProcess newProcess = helper.CopyProcess(); this.ProcessId = newProcess.ProcessId; this.txtProcessName.Text = newProcess.ProcessName; this.ddlForm.SetValue(newProcess.FormId); } else { this.ProcessId = id.Value; this.txtProcessName.Text = process.ProcessName; this.ddlForm.SetValue(process.FormId); } } else { throw new Exception("参数不正确"); } } this.hc.Value = this.ProcessId.ToString(); this.hc.Text = this.ClientScript.GetPostBackEventReference(this.hc, "refresh"); BindGrid(); BindDropDown(); }
/// <summary> /// 启用活动 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnStart_Click(object sender, EventArgs e) { try { long? processId = (sender as LinkButton).CommandArgument.ToLongNullable(); SysProcess process = this.DataHelper.FindById <SysProcess>(processId); FormProcessPublishHelper helper = new FormProcessPublishHelper(process); helper.StartProcess(); BindGrid(); } catch (Exception ex) { this.AjaxAlert(ex); } }
/// <summary> /// 发布 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnPublish_Click(object sender, EventArgs e) { try { SysProcess process = this.DataHelper.FindById <SysProcess>(this.ProcessId); FormProcessPublishHelper helper = new FormProcessPublishHelper(process); helper.Publish(); this.AjaxAlertAndRedirect("发布成功", "FormProcessQuery.aspx"); } catch (Exception ex) { this.AjaxAlertAndEnableButton(ex); } }
public int StartProcess(string processName, int startUserId, int relativeObjectId, List <IApproveUser> nextApproveUserList) { int num2; try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcess processCache = runtimeContext.PCacheFactory.GetProcessCache(processName); num2 = new ProcessEngine(runtimeContext, processCache).StartProcess(startUserId, relativeObjectId, nextApproveUserList); } catch (Exception exception) { AppLogHelper.Error(string.Format("启动流程[{0}], obj={1}失败", processName, relativeObjectId), exception); throw exception; } return(num2); }
public SysProcess GetProcessCacheByActivity(long activityId, out SysActivity activity) { Func <SysActivity, bool> predicate = null; SysActivity activity2 = this._context.FindById <SysActivity>(new object[] { activityId }); if ((activity2 == null) || !activity2.ProcessId.HasValue) { throw new ApplicationException("活动ID不正确"); } SysProcess processCache = this.GetProcessCache(activity2.ProcessId.Value); if (predicate == null) { predicate = p => p.ActivityId == activityId; } activity = processCache.Activities.FirstOrDefault <SysActivity>(predicate); return(processCache); }
private void ExecuteForAuto(SysActivity activity, SysProcess process) { foreach (SysActivityOperation operation in (from a in activity.ActivityOperations.Where <SysActivityOperation>(delegate(SysActivityOperation p) { long?activityId = p.ActivityId; long num = activity.ActivityId; return((activityId.GetValueOrDefault() == num) && activityId.HasValue); }) orderby a.OperationId select a).ToList <SysActivityOperation>()) { if (operation.OperationType != 2) { throw new ApplicationException("目前只支持Python脚本"); } base.Manager.ExecutePython(base.PI, operation.JScriptText); } }
public override void Execute(Queue <WorkflowMessage> queue) { SysActivity activity = this.AI.Activity; SysProcess process = activity.Process; if (((activity.ActivityType == 3) || (activity.ActivityType == 1)) || (activity.ActivityType == 6)) { if (activity.ExecType == 0) { new ActivityRemindHandler(base.PICacheFactory, base.PI, this.AI, ActivityRemindUseTimeType.ActivityStart, null, null).Execute(); this.ExecuteForManual(activity, process, queue); } else { if (activity.ExecType != 1) { throw new ApplicationException("未知的活动执行类型"); } base.Manager.ExecutePython(base.PI, activity.JScriptText); this.ExecuteForAuto(activity, process); WorkflowMessage item = base.Engine.NewCompleteActivityMessage(this.AI); queue.Enqueue(item); } } else if (activity.ActivityType == 2) { this.CopyActivityInstanceData(); this.CalDecisionValue(); WorkflowMessage message2 = base.Engine.NewCompleteActivityMessage(this.AI); queue.Enqueue(message2); } else { if (activity.ActivityType != 4) { throw new ApplicationException("未知活动类型"); } base.Manager.ExecutePython(base.PI, activity.JScriptText); this.ExecuteForAuto(activity, process); WorkflowMessage message3 = base.Engine.NewCompleteActivityMessage(this.AI); queue.Enqueue(message3); } }