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); }
internal ProcessEngine(ProcessInstanceCacheFactory runtimeContext, SysProcess process) { this._context = runtimeContext.Context; this._process = process; this._piCacheFactory = runtimeContext; this._manager = this._piCacheFactory.Manager; this._pi = null; }
public ProcessRemindHandlerBase(ProcessInstanceCacheFactory cache, SysProcessInstance pi, SysActivityInstance ai, UseTimeType useTime, SysWorkItem wi = null, int?result = new int?()) { this.creator = new RemindTemplateModelCreator(cache, pi, ai, useTime, wi, result); this._piCacheFactory = cache; this._context = cache.Context; this._manager = cache.Manager; this.InitRemindList(); }
/// <summary> /// 加载表单实例涉及的表单流程审核意见 /// </summary> private void LoadProcessApproveHistory() { ProcessInstanceCacheFactory piCache = new ProcessInstanceCacheFactory(this.DataHelper); var piList = this.DataHelper.Set <SysProcessInstance>().Where(p => p.FormInstanceId == this.FormInstanceId).OrderBy(p => p.StartTime).ToList(); var source = piList.Select(p => piCache.GetProcessInstanceCache(p.ProcessInstanceId)).ToList(); this.rProcess.DataSource = source; this.rProcess.DataBind(); }
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 void RejectApproveWorkItem(int workItemId, string approveComment, long nextActivityId) { try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcessInstance processInstanceCacheByWorkItem = runtimeContext.GetProcessInstanceCacheByWorkItem(workItemId); new ProcessEngine(runtimeContext, processInstanceCacheByWorkItem).RejectApproveWorkItem(workItemId, approveComment, nextActivityId); } catch (Exception exception) { AppLogHelper.Error(string.Format("完成【签核流程】的工作项[{0}]失败", workItemId), exception); throw exception; } }
public void CompleteApproveWorkItem(int workItemId, ApproveResultEnum approveResult, string approveComment, List <IApproveUser> nextApproveUserList, bool addUser = false, int?addUserId = new int?()) { try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcessInstance processInstanceCacheByWorkItem = runtimeContext.GetProcessInstanceCacheByWorkItem(workItemId); new ProcessEngine(runtimeContext, processInstanceCacheByWorkItem).CompleteApproveWorkItem(workItemId, approveResult, approveComment, nextApproveUserList, addUser, addUserId); } catch (Exception exception) { AppLogHelper.Error(string.Format("完成【签核流程】的工作项[{0}]失败", workItemId), exception); throw exception; } }
public void CancelProcess(int processInstanceId) { try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcessInstance processInstanceCache = runtimeContext.GetProcessInstanceCache(processInstanceId); new ProcessEngine(runtimeContext, processInstanceCache).CancelProcess(processInstanceId); } catch (Exception exception) { AppLogHelper.Error(string.Format("撤消流程实例[{0}]失败", processInstanceId), exception); throw; } }
public void CompleteWorkItemSelf(int workItemId) { try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(this._context); SysProcessInstance processInstanceCacheByWorkItem = runtimeContext.GetProcessInstanceCacheByWorkItem(workItemId); new ProcessEngine(runtimeContext, processInstanceCacheByWorkItem).CompleteWorkItemSelf(workItemId); } catch (Exception exception) { AppLogHelper.Error(string.Format("完成【普通流程】的工作项,仅完成自身[{0}]失败", workItemId), exception); throw exception; } }
public RemindTemplateModelCreator(ProcessInstanceCacheFactory cache, SysProcessInstance pi, SysActivityInstance ai, UseTimeType useTime, SysWorkItem wi = null, int?result = new int?()) { this._pi = pi; this._ai = ai; this._useTime = useTime; if (wi != null) { this._wi = wi; this._wiOwnerId = wi.OwnerId; } if (result.HasValue) { this._resultType = (ProcessTemplateResultType)result.Value; } this.serverHost = WebConfigAppSettings.GetServerHost(); this._piCacheFactory = cache; }
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); }
/// <summary> /// 查询流程实体数据 /// </summary> /// <param name="processInstanceId"></param> /// <returns></returns> public WfWorkflowInstanceData GetWorkflowInstance(int processInstanceId) { using (BizDataContext context = new BizDataContext()) { var piCache = new ProcessInstanceCacheFactory(context); //实例信息 SysProcessInstance pi = piCache.GetProcessInstanceCache(processInstanceId); SysProcess process = pi.Process; //定义信息 WfWorkflowInstanceData data = new WfWorkflowInstanceData(); data.Process = process.ConvertTo <WfProcess>(); if (data.Process.TemplateId != null) { data.Process.ProcessTemplate = Convert.ToBase64String(data.Process.TemplateId); data.Process.TemplateId = null; } data.ActivityList = process.Activities.ConvertTo <WfActivity>(); data.TransitionList = process.Transitions.ConvertTo <WfTransition>(); data.ProcessInstance = pi.ConvertTo <WfProcessInstance>(); data.ActivityInstanceList = pi.ActivityInstances.ConvertTo <WfActivityInstance>(); //加载活动实体信息 foreach (var ai in data.ActivityInstanceList) { LoadActivityEntityData(context, process, ai, data); } //连接线实例,这里表中少了个字段ProcessInstanceId,所以只能用这种方式来获取 data.TransitionInstanceList = new List <WfTransitionInstance>(); foreach (var ai in pi.ActivityInstances) { var tempList = ai.FromTransitionInstances.ConvertTo <WfTransitionInstance>(); data.TransitionInstanceList = data.TransitionInstanceList.Union(tempList).ToList(); } piCache.ClearCache(processInstanceId); return(data); } }
private void CheckTimeOut() { using (BizDataContext context = new BizDataContext(true)) { ParameterExpression expression; ProcessInstanceCacheFactory factory = new ProcessInstanceCacheFactory(context); List <int> list = new List <int>(); List <SysWorkItem> list2 = context.Where <SysWorkItem>( Expression.Lambda <Func <SysWorkItem, bool> >( Expression.AndAlso(Expression.AndAlso( Expression.NotEqual(Expression.Property( expression = Expression.Parameter(typeof(SysWorkItem), "p"), (typeof(SysWorkItem).GetProperty("DeadLine"))), Expression.Convert(Expression.Constant(null, typeof(DateTime?)), typeof(DateTime?)), false, (typeof(DateTime).GetMethod("Now"))), Expression.Equal(Expression.Property(expression, typeof(SysWorkItem).GetProperty("")), Expression.Convert(Expression.Constant(0, typeof(int)), typeof(int?)))), Expression.GreaterThan(Expression.Convert(Expression.Property(null, typeof(DateTime).GetMethod("Now")), typeof(DateTime?)), Expression.Property(expression, typeof(SysWorkItem).GetProperty("DeadLine")), false, typeof(SysWorkItem).GetMethod("Now"))), new ParameterExpression[] { expression })).ToList <SysWorkItem>(); if (list2.Count > 0) { foreach (SysWorkItem item in list2) { SysWorkItem item2; SysProcessInstance processInstanceCacheByWorkItem = factory.GetProcessInstanceCacheByWorkItem(item.WorkItemId, out item2); if (!list.Contains(processInstanceCacheByWorkItem.ProcessInstanceId)) { list.Add(processInstanceCacheByWorkItem.ProcessInstanceId); } factory.Manager.ExecutePython(processInstanceCacheByWorkItem, item2.ActivityInstance.Activity.TimeOutScript); item2.Status = 3; item2.EndTime = new DateTime?(DateTime.Now); factory.UpdateWorkItemBaseState(item2); factory.Context.Update(item2); } } foreach (int num in list) { factory.ClearCache(num); } } }
public WorkItemWrapper(ProcessInstanceCacheFactory cache, SysWorkItem work_item, SysProcessInstance pi) { this._piCacheFactory = cache; this.WorkItem = work_item; bool?isAdded = work_item.IsAdded; this.IsAdd = isAdded.HasValue ? isAdded.GetValueOrDefault() : false; bool?isProxy = work_item.IsProxy; this.IsProxy = isProxy.HasValue ? isProxy.GetValueOrDefault() : false; int?status = work_item.Status; this.IsCompleted = (status.HasValue ? status.GetValueOrDefault() : 0) != 0; this.ApproveResult = null; if (work_item.Status == 1) { this.ApproveResult = new bool?(this.IsPass(work_item, pi)); } }
public ProcessRemindHandler(ProcessInstanceCacheFactory cache, SysProcessInstance pi, SysActivityInstance ai, ProcessRemindUseTimeType useTime) : base(cache, pi, ai, (UseTimeType)useTime, null, null) { }
internal ProcessEngine(ProcessInstanceCacheFactory runtimeContext, SysProcessInstance processInstance, SysWorkItem currentWorkItem) : this(runtimeContext, processInstance) { this._wi = currentWorkItem; }
public ActivityRemindHandler(ProcessInstanceCacheFactory cache, SysProcessInstance pi, SysActivityInstance ai, ActivityRemindUseTimeType useTime, SysWorkItem wi = null, int?result = new int?()) : base(cache, pi, ai, (UseTimeType)useTime, wi, result) { }
public List <IUser> GetParticipantUsers(long activityId, int?processInstanceId = new int?(), int?activityInstanctId = new int?()) { Func <SysActivityInstance, bool> predicate = null; Func <SysActivityInstance, bool> func3 = null; List <IUser> list3; try { SysActivity activity; int? nullable = processInstanceId; if ((nullable.HasValue ? nullable.GetValueOrDefault() : -1) <= 0) { processInstanceId = null; } int?nullable2 = activityInstanctId; if ((nullable2.HasValue ? nullable2.GetValueOrDefault() : -1) <= 0) { activityInstanctId = null; } List <IUser> users = new List <IUser>(); SysProcess processCacheByActivity = this._processCache.GetProcessCacheByActivity(activityId, out activity); SysProcessInstance pi = null; SysActivityInstance ai = null; if (processInstanceId.HasValue) { pi = new ProcessInstanceCacheFactory(this._context).GetProcessInstanceCache(processInstanceId.Value); if (pi == null) { throw new ApplicationException(string.Format("流程实例ID:{0}不正确", processInstanceId)); } if (activityInstanctId.HasValue) { if (predicate == null) { predicate = p => p.ActivityInstanceId == activityInstanctId.Value; } ai = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(predicate); if (ai == null) { throw new ApplicationException(string.Format("活动实例ID:{0}不正确", activityInstanctId)); } } else { if (func3 == null) { func3 = delegate(SysActivityInstance p) { long?nullable1 = p.ActivityId; long num = activityId; return((nullable1.GetValueOrDefault() == num) && nullable1.HasValue); }; } ai = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(func3); } } using (IEnumerator <SysActivityParticipant> enumerator = activity.ActivityParticipants.GetEnumerator()) { while (enumerator.MoveNext()) { Func <SysProcessParticipant, bool> func = null; SysActivityParticipant activity_part = enumerator.Current; if (func == null) { func = p => p.ParticipantId == activity_part.ParticipantId.Value; } SysProcessParticipant part = processCacheByActivity.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func); if (part == null) { throw new ApplicationException("参与人为空"); } int? wiOwnerId = null; List <IUser> collection = ParticipantHelper.GetUsers(this._context, part, pi, ai, wiOwnerId); users.AddRange(collection); } } RemoveRepeatedUsers(users); list3 = users; } catch (Exception exception) { AppLogHelper.Error(string.Format("GetParticipantUsers,activityId=[{0}]失败", activityId), exception); throw exception; } return(list3); }
internal EntityData LoadFullWithEntity(SysEntity entity, int object_id, ProcessInstanceCacheFactory piCacheFactory) { EntityData data = null; Type tableType = TableCache.GetTableType(entity.EntityName); object obj2 = this.context.FindById(tableType, new object[] { object_id }); if (obj2 != null) { data = ObjectToEntityData(obj2, entity); } if (data != null) { EntityCache cache = new EntityCache(this); using (IEnumerator <SysField> enumerator = entity.Fields.GetEnumerator()) { while (enumerator.MoveNext()) { Func <SysEnumItem, bool> predicate = null; SysField p = enumerator.Current; if (p.DataType == 12) { if ((p.RefEntity != null) && (data[p.FieldName] != null)) { string displayFieldName = p.RefEntity.GetDisplayFieldName(); EntityData da = cache.GetObject(p.RefEntity, (int)data[p.FieldName]); if (da == null) { throw new ApplicationException(string.Format("[{0}]-[{1}]的引用字段[{2}]有值[{3}],但是对应的[{4}]不存在", new object[] { entity.EntityName, object_id, p.FieldName, data[p.FieldName], p.RefEntity.EntityName })); } if (da.ContainsKey(displayFieldName)) { da[p.FieldName] = data[displayFieldName]; } } } else { if (p.DataType == 13) { if (((p.RefEnum != null) && (p.RefEnum.EnumItems != null)) && (data[p.FieldName] != null)) { if (predicate == null) { predicate = delegate(SysEnumItem i) { int?itemValue = i.ItemValue; int num = (int)data[p.FieldName]; return((itemValue.GetValueOrDefault() == num) && itemValue.HasValue); }; } SysEnumItem item = p.RefEnum.EnumItems.FirstOrDefault <SysEnumItem>(predicate); if (item != null) { data[p.FieldName] = item.DisplayText; } } continue; } if (p.DataType == 11) { if (data[p.FieldName].ToInt() == 0) { data[p.FieldName] = "否"; } else { data[p.FieldName] = "是"; } continue; } if ((p.DataType == 15) && (data[p.FieldName] != null)) { string[] source = data[p.FieldName].ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (source.Count <string>() != 2) { throw new ApplicationException(string.Format("[{0}]中[entity_id]或者[object_id]缺失", data[p.FieldName])); } long entityId = source[0].ToLong(); int num2 = source[1].ToInt(); SysEntity entityCache = piCacheFactory.PCacheFactory.GetEntityCache(entityId); if (entityCache != null) { string key = entityCache.GetDisplayFieldName(); EntityData data2 = cache.GetObject(entityCache, num2); if (data2 == null) { throw new ApplicationException(string.Format("[{0}]-[{1}]的引用字段[{2}]有值[{3}],但是对应的[{4}]不存在", new object[] { entity.EntityName, num2, p.FieldName, data[p.FieldName], entityCache.EntityName })); } if (data2.ContainsKey(key)) { data[p.FieldName] = data2[key]; } } } } } } } return(data); }
public static void HandleMessage(SysWorkflowMessage msg, string connectionStringOrName) { if (string.IsNullOrWhiteSpace(connectionStringOrName)) { connectionStringOrName = DataContext.BizConnectionStringDefault; } try { Console.WriteLine("开始处理消息ID:{0},类型:{1}", msg.MessageId, msg.MessageType); using (TransactionScope scope = new TransactionScope()) { using (BizDataContext context = new BizDataContext(connectionStringOrName, true)) { if (LockMessage(msg, context)) { try { ProcessInstanceCacheFactory runtimeContext = new ProcessInstanceCacheFactory(context); SysProcessInstance processInstance = null; SysWorkItem item = null; switch (msg.MessageType) { case WorkflowMessageTypeEnum.StartingProcess: processInstance = runtimeContext.GetProcessInstanceCache(msg.ProcessInstanceId); break; case WorkflowMessageTypeEnum.ExecutingActivity: throw new Exception(string.Format("暂时不支持ExecutingActivity类型的消息", new object[0])); case WorkflowMessageTypeEnum.CompletingWorkItem: case WorkflowMessageTypeEnum.CompletingApproveWorkItem: processInstance = runtimeContext.GetProcessInstanceCacheByWorkItem(msg.WorkItemId, out item); break; default: throw new Exception(string.Format(string.Format("暂时不支持{0}类型的消息", msg.MessageType), new object[0])); } ProcessEngine engine = new ProcessEngine(runtimeContext, processInstance, item); msg.MessageType.CreateHandler(engine).ProcessMessage(msg); if (!CompleteMessage(msg, context)) { AppLogHelper.Information("完成工作流消息时更新行数为0: MessageId={0}", new object[] { msg.MessageId }); } scope.Complete(); return; } catch (Exception exception) { AppLogHelper.Error(exception, "处理工作流消息失败1: MessageId={0}", new object[] { msg.MessageId }); throw new MessageHandleException(exception); } } AppLogHelper.Information("锁定工作流消息时更新行数为0: MessageId={0}", new object[] { msg.MessageId }); } } } catch (MessageHandleException exception2) { ProcessError(msg, exception2.InnerException, connectionStringOrName); } catch (Exception exception3) { AppLogHelper.Error(exception3, "处理工作流消息失败2: MessageId={0}", new object[] { msg.MessageId }); ProcessError(msg, exception3, connectionStringOrName); } }