示例#1
0
        public virtual ActionResult Update(WFRunInstance entity)
        {
            entity.LastUpdatedTime = DateTime.Now;
            OperationResult or = WFRunInstanceService.Update(entity);

            return(this.JsonFormat(or));
        }
 /// <summary>
 /// 实例化任务参数
 /// </summary>
 /// <param name="rStep">运行步骤</param>
 /// <param name="wfInfo">流程实例信息</param>
 /// <param name="runInstance">流程运行实例</param>
 /// <param name="user">当今节点用户</param>
 public WFTaskArgs(WFRunStep rStep, WFInfo wfInfo, WFRunInstance runInstance, User user) :
     this()
 {
     RStep       = rStep;
     Info        = wfInfo;
     RunInstance = runInstance;
     NowUser     = user;
 }
        /// <summary>
        /// 创建流程
        /// 第一次启动流程
        /// </summary>
        /// <param name="designId">流程设计Id</param>
        /// <param name="mainId">实体唯一标识Id</param>
        /// <param name="userId">用户Id</param>
        /// <returns>放回流程实例</returns>
        private WFRunInstance CreateInstance(String dJson, String mainId, Guid userId)
        {
            OperationResult or = new OperationResult(OperationResultType.Error);

            // 获取当前流程运行实例
            WFRunInstance runInstance = new WFRunInstance
            {
                MainId     = mainId,
                UserId     = userId,
                DesignJSON = dJson
            };

            WFRunInstanceService.Insert(runInstance, false);

            return(runInstance);
        }
        /// <summary>
        /// 创建流程
        /// 第一次启动流程
        /// </summary>
        /// <param name="designId">流程设计Id</param>
        /// <param name="mainId">实体唯一标识Id</param>
        /// <param name="userId">用户Id</param>
        /// <returns>放回流程实例</returns>
        private WFRunInstance CreateInstance(String dJson, String mainId, Guid userId)
        {
            OperationResult or = new OperationResult(OperationResultType.Error);

            // 获取当前流程运行实例
            WFRunInstance runInstance = new WFRunInstance
            {
                Id         = Guid.NewGuid(),
                MainId     = mainId,
                UserId     = userId,
                DesignJSON = dJson
            };

            WFRunInstanceRepository.Insert(runInstance);

            return(runInstance);
        }
        /// <summary>
        /// 流程任务处理
        /// </summary>
        /// <param name="stepId">流程步骤Id</param>
        /// <returns>返回操作结果</returns>
        public OperationResult ActionTask(Guid stepId)
        {
            OperationResult or  = new OperationResult(OperationResultType.Error);
            String          msg = String.Empty;

            if (this.NowUser.IsNullOrEmpty())
            {
                msg = "流程启动者未空.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }

            if (this.MainId.IsNullOrEmpty())
            {
                msg = "流程无主题依赖.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            // 获取当前流程运行实例
            List <WFRunInstance> instances   = WFRunInstanceService.Entities.Where(c => c.MainId == MainId).ToList();
            WFRunInstance        runInstance = instances.FirstOrDefault();

            if (runInstance.IsNullOrEmpty())
            {
                msg = "该流程不存在!";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }

            // 当前流程实例对应步骤信息
            List <WFRunStep> rSteps = WFRunStepService.Entities.Where(c => c.InstanceId == runInstance.Id).OrderByDescending(c => c.Sort).ToList();

            // 上去步骤
            WFRunStep rStep = rSteps.FirstOrDefault(c => c.Id == stepId && c.Status == 0);

            if (rStep.IsNullOrEmpty())
            {
                msg = "该步骤已过期或无效!";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            // 获取当前实例
            WFInfo      wfInfo = this.GetWFInstall(runInstance.DesignJSON);
            List <Line> lines  = wfInfo.Lines.Where(c => c.FromID == rStep.SId).ToList();

            // 声明下一步骤默认处理者Id和名称
            String rId = String.Empty;

            foreach (Line line in lines)
            {
                Step   toStep = wfInfo.Steps.Where(c => c.Id == line.ToID).FirstOrDefault();
                String id     = toStep.DefaultUser;
                rId = rId.IsNullOrEmpty() ? id : rId + ";" + id;

                WFRunStep item = new WFRunStep
                {
                    Id          = Guid.NewGuid(),
                    ParentId    = rStep.Id,
                    SId         = toStep.Id,
                    Name        = toStep.Name,
                    FormUrl     = toStep.FormUrl,
                    FormId      = toStep.FormId.GetGuid(),
                    InstanceId  = runInstance.Id,
                    SenderId    = NowUser.Id,
                    SenderTime  = DateTime.Now,
                    ReceiveTime = DateTime.Now,
                    ReceiveId   = id,
                    Status      = 0,
                    Sort        = (rSteps.Count == 0 ? 1 : rSteps.Count) + 1
                };
                rSteps.Add(item);
                if (!CreateStep.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(item, wfInfo, runInstance, NowUser);
                    CreateStep(args);
                }
                //tasks.Add(this.CreateTask(item, user, mainId, wfInfo.Name));
            }
            // 标记当前步骤完成
            rStep.Status = 2;
            rSteps.Add(rStep);

            if (!CreateStep.IsNullOrEmpty())
            {
                WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                CreateStep(args);
            }
            or = WFRunStepService.AddOrUpdate(c => new { c.Id }, rSteps);
            if (or.ResultType == OperationResultType.Success)
            {
                or = new OperationResult(OperationResultType.Success, "任务处理完成", true);
                if (!WFComplete.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                    WFComplete(args);
                }
            }
            else
            {
                or = new OperationResult(OperationResultType.QueryNull, "任务处理失败", false);
            }
            return(or);
        }
        /// <summary>
        /// 根据指定参数启动流程
        /// 根据指定步骤Id查询数据为空,则创建一个新流程
        /// </summary>
        /// <returns>返回操作结果</returns>
        public OperationResult Execute()
        {
            OperationResult or  = new OperationResult(OperationResultType.Error);
            String          msg = String.Empty;

            if (this.DesignId.IsNullOrEmpty())
            {
                msg = "流程设计Id为空.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            if (this.MainId.IsNullOrEmpty())
            {
                msg = "流程无主题依赖.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            if (this.NowUser.IsNullOrEmpty())
            {
                msg = "流程启动者不能为空.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            // 声明流程实例
            WFInfo wfInfo = new WFInfo();
            // 获取当前流程运行实例
            List <WFRunInstance> instances   = WFRunInstanceService.Entities.Where(c => c.MainId == this.MainId).ToList();
            WFRunInstance        runInstance = instances.FirstOrDefault();

            // 如果流程实例不存在,这创建流程实例
            if (runInstance.IsNullOrEmpty())
            {
                or = WFModelService.GetByKey(this.DesignId);
                WFModel design = or.AppendData as WFModel;
                if (!or.IsNullOrEmpty())
                {
                    // 实例当前流程设计
                    wfInfo      = this.GetWFInstall(design.DesignJSON);
                    runInstance = this.CreateInstance(design.DesignJSON, this.MainId, this.NowUser.Id);
                }
                else
                {
                    msg = "流程模型未找到!";
                    return(new OperationResult(OperationResultType.QueryNull, msg));
                }
            }
            else
            {
                // 实例当前流程设计
                wfInfo = this.GetWFInstall(runInstance.DesignJSON);
            }

            // 获取指定实体对应运行步骤信息
            List <WFRunStep> rSteps = WFRunStepService.Entities.Where(c => c.InstanceId == runInstance.Id).OrderByDescending(c => c.Sort).ToList();
            // 获得当前运行步骤
            WFRunStep rStep   = rSteps.FirstOrDefault();
            Boolean   isFirst = false;

            // 判断步骤是否为空,如果为空则为第一次启动流程,并创建一个新步骤信息
            if (rStep.IsNullOrEmpty())
            {
                // 流程当前步骤
                Step step = wfInfo.Steps.Where(c => c.Id == wfInfo.FirstStepID).FirstOrDefault();
                rStep = new WFRunStep
                {
                    ParentId   = Guid.Empty,
                    SId        = step.Id,
                    FormId     = step.FormId.GetGuid(),
                    Name       = step.Name,
                    FormUrl    = step.FormUrl,
                    InstanceId = runInstance.Id,
                    SenderId   = this.NowUser.Id,
                    SenderTime = DateTime.Now,
                    Status     = 2,
                    Sort       = 1
                };
                isFirst = true;
            }

            // 获取当前步骤下一步路线
            List <Line> lines = wfInfo.Lines.Where(c => c.FromID == rStep.SId).ToList();

            // 判断当前步骤是否为空
            if (lines.IsNullOrEmpty() || lines.Count == 0)
            {
                msg = "流程设计中连线存在问题.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }

            // 声明下一步骤默认处理者Id和名称
            String rId = String.Empty;

            foreach (Line line in lines)
            {
                Boolean isTrue = false;
                // 判断连线是否满足规则
                if (!line.Expression.IsNullOrEmpty())
                {
                    isTrue = LineWhere(line.Expression, wfInfo.DBTableName);
                }

                if (!line.TSql.IsNullOrEmpty())
                {
                    //or = WFModelService.Context.
                    SqlParameter s = new SqlParameter("@mainId", SqlDbType.UniqueIdentifier)
                    {
                        Value = "00000000-0000-0000-0000-000000000001".GetGuid()
                    };
                    Int32 result = WFModelService.DB.SqlQuery <Int32>(line.TSql, s).FirstOrDefault();
                    isTrue = result > 0 ? true : false;

                    //if (or.ResultType == OperationResultType.Success)
                    //{
                    //    or.AppendData
                    //    isTrue = true;
                    //}
                }
                //Boolean isTrue = true;
                if (isTrue)
                {
                    // 连线下一步骤
                    Step toStep = wfInfo.Steps.Where(c => c.Id == line.ToID).FirstOrDefault();

                    String id = toStep.DefaultUser;
                    rId = rId.IsNullOrEmpty() ? id : rId + ";" + id;

                    WFRunStep item = new WFRunStep
                    {
                        Id         = Guid.NewGuid(),
                        ParentId   = rStep.SId,
                        SId        = toStep.Id,
                        Name       = toStep.Name,
                        FormUrl    = toStep.FormUrl,
                        InstanceId = runInstance.Id,
                        FormId     = toStep.FormId.GetGuid(),
                        SenderId   = NowUser.Id,
                        SenderTime = DateTime.Now,
                        ReceiveId  = id,
                        Status     = 0,
                        Sort       = (rSteps.Count == 0 ? 1 : rSteps.Count) + 1
                    };
                    rSteps.Add(item);
                    //or = this.Insert(item);

                    if (!CreateStep.IsNullOrEmpty())
                    {
                        WFTaskArgs args = new WFTaskArgs(item, wfInfo, runInstance, NowUser);
                        CreateStep(args);
                    }
                }
            }

            // 第一次创建流程
            if (isFirst)
            {
                rStep.ReceiveId = rId;
                rSteps.Add(rStep);

                if (!CreateStep.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                    CreateStep(args);
                }
            }
            or = WFRunStepService.AddOrUpdate(c => new { c.Id }, rSteps);
            if (or.ResultType == OperationResultType.Success)
            {
                or = new OperationResult(OperationResultType.Success, "流程启动成功", true);
                if (!WFComplete.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                    WFComplete(args);
                }
            }
            else
            {
                or = new OperationResult(OperationResultType.QueryNull, "流程启动失败", false);
            }

            return(or);
        }
        /// <summary>
        /// 根据指定参数启动流程
        /// 根据指定步骤Id查询数据为空,则创建一个新流程
        /// </summary>
        /// <returns>返回操作结果</returns>
        public OperationResult Execute()
        {
            OperationResult or  = new OperationResult(OperationResultType.Error);
            String          msg = String.Empty;

            if (this.DesignId.IsNullOrEmpty())
            {
                msg = "流程设计Id为空.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            if (this.MainId.IsNullOrEmpty())
            {
                msg = "流程无主题依赖.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            if (this.NowUser.IsNullOrEmpty())
            {
                msg = "流程启动者未空.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }
            // 声明流程实例
            WFInfo wfInfo = new WFInfo();
            // 获取当前流程运行实例
            List <WFRunInstance> instances   = WFRunInstanceRepository.Entities.Where(c => c.MainId == this.MainId).ToList();
            WFRunInstance        runInstance = instances.FirstOrDefault();

            // 如果流程实例不存在,这创建流程实例
            if (runInstance.IsNullOrEmpty())
            {
                WFDesign design = WFDesignRepository.GetByKey(this.DesignId);
                // 实例当前流程设计
                wfInfo      = this.GetWFInstall(design.DesignJSON);
                runInstance = this.CreateInstance(design.DesignJSON, this.MainId, this.NowUser.Id);
            }
            else
            {
                // 实例当前流程设计
                wfInfo = this.GetWFInstall(runInstance.DesignJSON);
            }

            // 获取指定实体对应运行步骤信息
            List <WFRunStep> rSteps = WFRunStepRepository.Entities.Where(c => c.InstanceId == runInstance.Id).OrderByDescending(c => c.Sort).ToList();
            // 获得当前运行步骤
            WFRunStep rStep   = rSteps.FirstOrDefault();
            Boolean   isFirst = false;

            // 判断步骤是否为空,如果为空则为第一次启动流程,并创建一个新步骤信息
            if (rStep.IsNullOrEmpty())
            {
                // 流程当前步骤
                Step step = wfInfo.Steps.Where(c => c.Id == wfInfo.FirstStepID).FirstOrDefault();
                rStep = new WFRunStep
                {
                    ParentId   = Guid.Empty,
                    SId        = step.Id,
                    Name       = step.Name,
                    FormUrl    = step.FormUrl,
                    InstanceId = runInstance.Id,
                    SenderId   = this.NowUser.Id,
                    Status     = 2,
                    Sort       = 1
                };
                isFirst = true;
            }

            // 获取当前步骤下一步路线
            List <Line> lines = wfInfo.Lines.Where(c => c.FromID == rStep.SId).ToList();

            // 判断当前步骤是否为空
            if (lines.IsNullOrEmpty() || lines.Count == 0)
            {
                msg = "流程设计中连线存在问题.";
                return(new OperationResult(OperationResultType.QueryNull, msg));
            }

            // 声明下一步骤默认处理者Id和名称
            String rId = String.Empty;

            foreach (Line line in lines)
            {
                Step toStep = wfInfo.Steps.Where(c => c.Id == line.ToID).FirstOrDefault();

                String id = toStep.DefaultUser;
                rId = rId.IsNullOrEmpty() ? id : rId + ";" + id;

                WFRunStep item = new WFRunStep
                {
                    Id         = Guid.NewGuid(),
                    ParentId   = rStep.SId,
                    SId        = toStep.Id,
                    Name       = toStep.Name,
                    FormUrl    = toStep.FormUrl,
                    InstanceId = runInstance.Id,
                    SenderId   = NowUser.Id,
                    ReceiveId  = id,
                    Status     = 0,
                    Sort       = (rSteps.Count == 0 ? 1 : rSteps.Count) + 1
                };
                rSteps.Add(item);
                //or = this.Insert(item);

                if (!CreateStep.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(item, wfInfo, runInstance, NowUser);
                    CreateStep(args);
                }
            }

            // 第一次创建流程
            if (isFirst)
            {
                rStep.ReceiveId = rId;
                rSteps.Add(rStep);

                if (!CreateStep.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                    CreateStep(args);
                }
            }
            if (WFRunStepRepository.AddOrUpdate(c => new { c.Id }, rSteps.ToArray()).Equals(0))
            {
                or = new OperationResult(OperationResultType.QueryNull, "流程启动失败", false);
            }
            else
            {
                or = new OperationResult(OperationResultType.Success, "流程启动成功", true);
                if (!WFComplete.IsNullOrEmpty())
                {
                    WFTaskArgs args = new WFTaskArgs(rStep, wfInfo, runInstance, NowUser);
                    WFComplete(args);
                }
            }

            return(or);
        }
示例#8
0
        public virtual ActionResult Add(WFRunInstance entity)
        {
            OperationResult or = WFRunInstanceService.Insert(entity);

            return(this.JsonFormat(or));
        }