Exemple #1
0
        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);
        }
Exemple #2
0
 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();
        }
Exemple #5
0
 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;
 }
Exemple #6
0
 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;
     }
 }
Exemple #7
0
 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;
     }
 }
Exemple #8
0
 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;
     }
 }
Exemple #9
0
 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;
 }
Exemple #11
0
        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);
            }
        }
Exemple #13
0
 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);
         }
     }
 }
Exemple #14
0
        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)
 {
 }
Exemple #16
0
 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)
 {
 }
Exemple #18
0
        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);
            }
        }