Пример #1
0
        public override NodeReturn Run(FlowContent flowContent)
        {
            NodeReturn ret = new NodeReturn();

            if (flowContent.CurrentNodeKey.Split(',').Contains(this.NodeKey))
            {
                ret.isOver = true;
            }
            else
            {
                ret.isOver = false;
                WF_Instance   node = instanceBll.getByID(flowContent.CurrentInstanceID);
                List <string> user = new List <string>();
                if (node.ApplyUserCode != node.WriterUserCode)
                {
                    user.Add(node.ApplyUserCode);
                    user.Add(node.WriterUserCode);
                }
                else
                {
                    user.Add(node.WriterUserCode);
                }
                ret.ToDoUserList = user;
            }
            return(ret);
        }
Пример #2
0
 public static Common.Business.WF_Instance Fetch(WF_Instance data)
 {
     Common.Business.WF_Instance item = (Common.Business.WF_Instance)Activator.CreateInstance(typeof(Common.Business.WF_Instance));
     //using (ObjectFactory.BypassPropertyChecks(item))
     {
         item.Client       = data.Client;
         item.WorkflowId   = data.WorkflowId;
         item.ItemId       = data.ItemId;
         item.BarCode      = data.BarCode;
         item.CurrentState = data.CurrentState;
         item.FromState    = data.FromState;
         item.ActivityId   = data.ActivityId;
         item.Suggestion   = data.Suggestion;
         item.CheckReason  = data.CheckReason;
         item.Submitter    = data.Submitter;
         item.SubmitDate   = data.SubmitDate;
         item.TimeStamp    = data.TimeStamp;
         item.CreatedUser  = data.CreatedUser;
         item.CreatedDate  = data.CreatedDate;
         item.ChangedUser  = data.ChangedUser;
         item.ChangedDate  = data.ChangedDate;
     }
     ObjectFactory.MarkAsChild(item);
     ObjectFactory.MarkOld(item);
     return(item);
 }
Пример #3
0
        public static int Reopen(string todoUserCode, int instanceID, int isShow, int prevID, string taskName, int todotype, FlowNode node, string nodeKey, string currenUserCode)
        {
            WF_ToDo         todo     = new WF_ToDo();
            WF_Instance     instance = instanceBll.getByID(instanceID);
            WF_TemplateNode tmpNode  = nodebll.getByNodeKey(instance.TmpKey, nodeKey);

            //todo  插入批号
            todo.Batch            = -1;
            todo.CreateTime       = DateTime.Now;
            todo.CreateUserCode   = currenUserCode;
            todo.InstanceID       = instanceID;
            todo.IsDelete         = 0;
            todo.IsShow           = isShow;
            todo.Nodekey          = nodeKey;
            todo.PrevID           = prevID;
            todo.ResponseUserCode = todoUserCode;
            todo.State            = (int)TodoState.UnDo;
            todo.ToDoName         = taskName;
            todo.TodoType         = todotype;
            todo.UpdateTime       = DateTime.Now;
            todo.UpdateUserCode   = currenUserCode;
            todo.URL = tmpNode.URL;
            int todoid = todobll.save(todo);

            return(todoid);
        }
Пример #4
0
 public bool update(WF_Instance entity)
 {
     using (IDbConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["wfdb"].ToString()))
     {
         conn.Open();
         return(conn.Update <WF_Instance>(entity));
     }
 }
Пример #5
0
 public int save(WF_Instance entity)
 {
     using (IDbConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["wfdb"].ToString()))
     {
         conn.Open();
         int id = conn.Insert <WF_Instance>(entity);
         return(id);
     }
 }
Пример #6
0
        public ActionResult Add(WF_Instance wfInstance, int id, int flowTo)
        {
            var currentUserId = 1;

            // 1. Add the new data into workflow-instance
            wfInstance.DelFlag      = (short)DelFlagEnum.Normal;
            wfInstance.StartTime    = DateTime.Now;
            wfInstance.FilePath     = string.Empty;
            wfInstance.SenderId     = currentUserId;
            wfInstance.Level        = 0;
            wfInstance.Status       = (short)WF_InstanceEnum.Processing;
            wfInstance.WFInstanceId = Guid.Empty;
            wfInstance.WF_TempId    = id;
            WF_InstanceService.Add(wfInstance);

            // 2. Start the workflow
            var wfApp = WorkflowApplicationHelper.CreateWorkflowApp(new FinanceActivity(), null);

            wfInstance.WFInstanceId = wfApp.Id;     // save the workflow id
            WF_InstanceService.Update(wfInstance);

            // 3. Add two new procedures to the workflow procedure
            // The first produce handler is self
            WF_Procedure startProcedure = new WF_Procedure();

            startProcedure.WF_InstanceId    = wfInstance.Id;
            startProcedure.SubTime          = DateTime.Now;
            startProcedure.ProcedureName    = "Submit the approval table";
            startProcedure.IsEndProcedure   = false;
            startProcedure.IsStartProcedure = true;
            startProcedure.HandleBy         = currentUserId;
            startProcedure.ProcessComment   = "submit approval";
            startProcedure.ProcessResult    = "pass";
            startProcedure.ProcessStatus    = (short)WF_InstanceEnum.Processing;
            WF_ProcedureService.Add(startProcedure);

            // Initial the next procedure handler
            WF_Procedure nextProcedure = new WF_Procedure();

            nextProcedure.WF_InstanceId  = wfInstance.Id;
            nextProcedure.SubTime        = DateTime.Now;
            nextProcedure.ProcessTime    = DateTime.Now;
            nextProcedure.ProcessComment = string.Empty;

            nextProcedure.IsEndProcedure   = false;
            nextProcedure.IsStartProcedure = false;
            nextProcedure.HandleBy         = flowTo;

            nextProcedure.ProcessResult = "";
            nextProcedure.ProcessStatus = (short)WF_InstanceEnum.Unprocess;
            WF_ProcedureService.Add(nextProcedure);
            return(RedirectToAction("showMyCheck"));
        }
Пример #7
0
        public ActionResult Add(WF_Instance instance, int id, int flowTo)
        {
            var currentUserId = LoginUser.Id;

            //在工作流实例表添加一条数据
            instance.DelFlag      = this.delFlagNormal;
            instance.StartTime    = DateTime.Now;
            instance.FilePath     = string.Empty;
            instance.StartBy      = currentUserId;
            instance.Level        = 0;
            instance.Status       = (short)Wei.OA.Model.Enum.WF_InstanceEnum.Processing;
            instance.WFInstanceId = Guid.Empty;
            instance.WF_TempId    = id;
            WF_InstanceService.Add(instance);
            //启动工作流
            var wfApp = WorkflowApplictionHelper.CreateWorkflowApp(new FinancialActivity(), null); //可以通过反射,更灵活的添加不同的activity

            instance.WFInstanceId = wfApp.Id;
            WF_InstanceService.Update(instance);
            //在步骤表中添加两个步骤,一个当前已经处理完的步骤
            WF_Step startStep = new WF_Step();

            startStep.WF_InstanceId  = instance.Id;
            startStep.SubTime        = DateTime.Now;
            startStep.StepName       = "提交审批表单";
            startStep.IsEndStep      = false;
            startStep.IsStartStep    = true;
            startStep.ProcessBy      = currentUserId;
            startStep.ProcessComment = "提交申请";
            startStep.ProcessResult  = "通过";
            startStep.ProcessTime    = DateTime.Now;
            startStep.StepStatus     = (short)Wei.OA.Model.Enum.WFStepEnum.Processed;

            WF_StepService.Add(startStep);

            //下一步谁审批的步骤
            WF_Step nextStep = new WF_Step();

            nextStep.WF_InstanceId  = instance.Id;
            nextStep.SubTime        = DateTime.Now;
            nextStep.ProcessTime    = DateTime.Now;
            nextStep.ProcessComment = String.Empty;
            nextStep.IsEndStep      = false;
            nextStep.IsStartStep    = false;
            nextStep.ProcessBy      = flowTo;
            nextStep.ProcessResult  = "";
            nextStep.StepName       = "";
            nextStep.StepStatus     = (short)Wei.OA.Model.Enum.WFStepEnum.UnProcess;
            WF_StepService.Add(nextStep);
            return(RedirectToAction("ShowMyCheck"));
        }
Пример #8
0
        private int InsertInstance(int instanceState, string formID, string createUserCode, string writerUserCode, string applyUserCode)
        {
            WF_Instance instance = new WF_Instance();

            instance.ApplyUserCode  = applyUserCode;
            instance.CreateTime     = DateTime.Now;
            instance.CreateUserCode = createUserCode;
            instance.FormID         = formID;
            instance.IsDelete       = (int)IsDelete.UnDelete;
            instance.State          = instanceState;
            instance.TmpKey         = this.Tmpkey;
            instance.UpdateTime     = DateTime.Now;
            instance.UpdateUserCode = createUserCode;
            instance.WriterUserCode = writerUserCode;
            return(instancebll.save(instance));
        }
Пример #9
0
        public override NodeReturn Run(FlowContent flowContent)
        {
            this.RunEndFlowEvent(flowContent);
            WF_Instance instance = instancebll.getByID(flowContent.CurrentInstanceID);

            if (instance != null)
            {
                instance.State          = (int)Common.InstanceState.End;
                instance.UpdateTime     = DateTime.Now;
                instance.UpdateUserCode = flowContent.CurrenUserCode;
                instancebll.update(instance);
            }
            NodeReturn ret = new NodeReturn();

            ret.isOver = true;
            return(ret);
        }
Пример #10
0
        public static Flow getFlowByTodo(int todoid, string currenUserCode)
        {
            WF_ToDo     todo     = todobll.getByID(todoid);
            WF_Instance instance = instancebll.getByID(todo.InstanceID);
            WF_Template tmp      = tmpbll.getByKey(instance.TmpKey);

            Flow flo = GetFlowByTmpKey(tmp.key);

            flo.Tmpkey         = instance.TmpKey;
            flo.FormName       = tmp.TmpName;
            flo.CurrenUserCode = currenUserCode;
            flo.ApplyUserCode  = instance.ApplyUserCode;
            flo.FormID         = instance.FormID;
            flo.InstanceID     = instance.ID;
            flo.InstanceState  = instance.State;
            flo.TodoID         = todoid;
            flo.WriterUserCode = instance.WriterUserCode;

            flo.Init();
            return(flo);
        }
Пример #11
0
 public int save(WF_Instance entity)
 {
     return(dao.save(entity));
 }
        public ActionResult Add(WF_Instance instance, int id, int flowTo)
        {
            var CurrentUserId = LoginUser.ID;

            //1->在工作流实例表中添加一条数据
            instance.DelFlag   = DelFlag;
            instance.StartTime = DateTime.Now;
            instance.FilePath  = string.Empty;

            instance.StartBy   = CurrentUserId; //当前用户 也就是发起人
            instance.Level     = 0;             //紧急程度
            instance.Status    = (short)WF_InstanceEnum.Processing;
            instance.WF_TempID = id;

            //WF_TempBLL.Add(instance);
            WF_InstanceBLL.Add(instance);


            //2->在步骤表里面添加两条步骤
            //2->1 一个当前已处理的步骤
            WF_Step startStep = new WF_Step();

            startStep.WF_InstanceID  = instance.ID;
            startStep.SubTime        = DateTime.Now;
            startStep.StepName       = "提交申请表单";
            startStep.IsEndStep      = false;
            startStep.IsStartStep    = true;
            startStep.ProcessBy      = CurrentUserId;
            startStep.ProcessContent = "提交申请";
            startStep.ProcessResult  = "通过";
            startStep.ProcessTime    = DateTime.Now;
            startStep.StepStaus      = (short)WFStepEnum.Processed;
            WF_StepBLL.Add(startStep);

            //2->2 下一步谁审批的步骤 。项目经理审批
            WF_Step nextStep = new WF_Step();

            nextStep.WF_InstanceID  = instance.ID;
            nextStep.SubTime        = DateTime.Now;
            nextStep.ProcessTime    = DateTime.Now;
            nextStep.ProcessContent = string.Empty;

            nextStep.IsStartStep = false;
            nextStep.IsEndStep   = false;
            nextStep.ProcessBy   = flowTo;

            nextStep.ProcessResult = "";
            nextStep.StepName      = "";
            nextStep.StepStaus     = (short)WFStepEnum.UnProecess;
            WF_StepBLL.Add(nextStep);

            //3->启动工作流
            //根据流程类型 来初始化对应流程 spring 实现
            //通过容器创建一个对象 依赖注入只能在子类中实现
            // IApplicationContext ctx = ContextRegistry.GetContext();
            var wftemp = WF_TempBLL.GetEntities(u => u.ID == id).FirstOrDefault();
            //Activity activityType = ctx.GetObject(wftemp.ActityType.Split('.')[3]) as Activity;

            var wfApp = WorkflowApplicationHelper.CreateWorkflowApp(
                //new FincallActivity(),
                Assembly.Load("HeiMa8.OA.WorkFlow").CreateInstance(wftemp.ActityType) as Activity,
                null);

            instance.WFInstanceId = wfApp.Id;
            WF_InstanceBLL.Update(instance);


            return(Content("ok"));
        }
Пример #13
0
        public ActionResult StartWorkflow(WF_Instance wF_Instance)
        {
            //将流程列表中添加数据
            wF_Instance.ApplicationId = Convert.ToInt32(Guid.Empty);
            wF_Instance.Result        = 0 + "";
            wF_Instance.StartedBy     = loginUser.id.ToString();
            wF_Instance.Status        = 0 + "";
            wF_Instance.SubTime       = DateTime.Now;
            wF_Instance.WF_TempID     = int.Parse(Request["hiddenTempId"]);
            WF_InstanceService.AddEntity(wF_Instance);
            //然后启动流程
            var dict = new Dictionary <string, object> {
                { "TempBookMarkName", "总监审批" }
            };

            Guid guid = Guid.Empty;

            WorkflowApplicationHelper.CreateWorkflow(new FincalActivity(), dict, out guid);

            wF_Instance.ApplicationId = Convert.ToInt32(guid);

            //保存步骤
            WF_StepInfo stepInfo = new WF_StepInfo();

            stepInfo.ChildStepID   = 0;
            stepInfo.Comment       = "开始进行财务审批";
            stepInfo.DelFlag       = 0;
            stepInfo.IsProcessed   = true;
            stepInfo.IsStartStep   = true;
            stepInfo.IsEndStep     = false;
            stepInfo.ProcessBy     = loginUser.id;
            stepInfo.ParentStepID  = 0;
            stepInfo.ParentStepID  = 0;
            stepInfo.ProcessTime   = DateTime.Now;
            stepInfo.Remark        = "开始财务审批";
            stepInfo.StepName      = "第一步";
            stepInfo.StepResult    = 1 + "";
            stepInfo.SubTime       = DateTime.Now;
            stepInfo.Title         = "开始财务审批";
            stepInfo.WF_InstanceID = wF_Instance.ID;

            WF_StepInfoService.AddEntity(stepInfo);

            //保存步骤
            WF_StepInfo masterStepInfo = new WF_StepInfo();

            masterStepInfo.ChildStepID   = 0;
            masterStepInfo.Comment       = "总监开始进行财务审批";
            masterStepInfo.DelFlag       = 0;
            masterStepInfo.IsProcessed   = false;
            masterStepInfo.IsStartStep   = false;
            masterStepInfo.IsEndStep     = false;
            masterStepInfo.ProcessBy     = int.Parse(Request["FlowTo"]);
            masterStepInfo.ParentStepID  = 0;
            masterStepInfo.ParentStepID  = 0;
            masterStepInfo.ProcessTime   = DateTime.Now;
            masterStepInfo.Remark        = "总监开始财务审批";
            masterStepInfo.StepName      = "总监审批";
            masterStepInfo.StepResult    = 1 + "";
            masterStepInfo.SubTime       = DateTime.Now;
            masterStepInfo.Title         = "开始财务审批";
            masterStepInfo.WF_InstanceID = wF_Instance.ID;

            WF_StepInfoService.AddEntity(masterStepInfo);

            return(Content("ok"));
        }
        public ActionResult Add(WF_Instance instance, int id, int flowTo)
        {
            var currentUserId = LoginUser.ID;

            //在工作流实例表添加一条数据:
            instance.DelFlag   = delflagNormal;
            instance.StartTime = DateTime.Now;
            instance.FilePath  = string.Empty;

            instance.StartBy      = currentUserId;
            instance.Level        = 0;
            instance.Status       = (short)Heima8.OA.Model.Enum.WF_InstanceEnum.Processing;
            instance.WFInstanceId = Guid.Empty;
            instance.WF_TempID    = id;
            WF_InstanceService.Add(instance);
            //第二点:启动工作流
            //1、获得工作流类型
            var temp     = GetWfTemp(instance);
            var activity = WorkflowFactory.GetActivity(temp.ActityType);
            WorkflowApplication wfApp = null;

            //2、家具产品对应的逻辑
            if (activity is ProductFlow)
            {
                //家具逻辑中,设计之后数控和小锯是二选一
                var designRole =
                    RoleInfoService.GetEntities(r => r.DelFlag == delflagNormal && r.RoleName.Contains("设计"))
                    .FirstOrDefault();
                string flowToKeyWord = GetRoleHelper.GetFlowToRoleKeyWord(designRole, id);
                wfApp = WorkflowApplicationHelper.CreateWorkflowApp(activity,
                                                                    new Dictionary <string, object>()
                {
                    { "AfterDesignFlowTo", flowToKeyWord }
                });
            }//else if{ 其他工作流的逻辑}
            else
            {//没有对应的工作流提前结束
                return(RedirectToAction("ShowMyCheck"));
            }

            instance.WFInstanceId = wfApp.Id;
            WF_InstanceService.Update(instance);

            //第三点:在步骤表里面添加两条步骤。一个当前已经处理的完成步骤。
            WF_Step startStep = new WF_Step();

            startStep.WF_InstanceID  = instance.ID;
            startStep.SubTime        = DateTime.Now;
            startStep.StepName       = "提交审批表单";
            startStep.IsEndStep      = false;
            startStep.IsStartStep    = true;
            startStep.ProcessBy      = currentUserId;
            startStep.PorcessComment = "提交申请";
            startStep.ProcessResult  = "通过";
            startStep.ProcessTime    = DateTime.Now;
//            startStep.StepName = "提交审批表单";
            startStep.StepStatus = (short)Heima8.OA.Model.Enum.WFStepEnum.Processed;


            WF_StepService.Add(startStep);

            //二个步骤:下一步谁审批的步骤。  项目经理审批
            WF_Step nextStep = new WF_Step();

            nextStep.WF_InstanceID  = instance.ID;
            nextStep.SubTime        = DateTime.Now;
            nextStep.ProcessTime    = DateTime.Now;
            nextStep.PorcessComment = string.Empty;

            nextStep.IsEndStep   = false;
            nextStep.IsStartStep = false;
            nextStep.ProcessBy   = flowTo;

            nextStep.ProcessResult = "";

            nextStep.StepName   = "";
            nextStep.StepStatus = (short)Heima8.OA.Model.Enum.WFStepEnum.UnProecess;
            WF_StepService.Add(nextStep);
            return(RedirectToAction("ShowMyCheck"));
        }
 WF_Temp GetWfTemp(WF_Instance instance)
 {
     return(WF_TempService.GetEntities(t => t.DelFlag == delflagNormal && t.ID == instance.WF_TempID).FirstOrDefault());
 }
Пример #16
0
        /// <summary>
        /// 待办处理操作
        /// </summary>
        /// <param name="vallist">流程实例变量</param>
        /// <param name="todoID">待办id</param>
        /// <param name="operationUserCode">操作人工号 </param>
        /// <param name="operationType">操作类型</param>
        public void Operation(Dictionary <string, string> vallist, int todoID, string operationUserCode, Operation operationType, string common = null, string toNodeKey = null, string todoUserCode = null)
        {
            //禁止流程启动
            if (operationType == Common.Operation.Start)
            {
                throw new Exception("不能执行流程启动操作");
            }
            WF_ToDo     todo     = todobll.getByID(todoID);
            WF_Instance instance = instancebll.getByID(todo.InstanceID);

            if (instance.State != (int)Common.InstanceState.Enable)
            {
                throw new Exception("当前流程实例状态不是启用状态");
            }
            if (todo.ResponseUserCode != operationUserCode)
            {
                List <WF_Agent> agentlist = agentBll.getAgentByOrg(todo.ResponseUserCode);
                if (agentlist == null || agentlist.Count == 0 || agentlist.Where(p => p.AgentUserCode == operationUserCode).Count() == 0)
                {
                    throw new Exception("当前操作人不是待办责任人,也不是待办责任人的代理人");
                }
            }
            if (todo.State != (int)Common.TodoState.UnDo)
            {
                throw new Exception("当前待办已经被处理了");
            }
            FlowContent flowcontent = new FlowContent();

            flowcontent.CurrenUserCode    = operationUserCode;
            flowcontent.TmpKey            = this.Tmpkey;
            flowcontent.CurrentInstanceID = todo.InstanceID;
            flowcontent.OperationType     = (int)Common.Operation.Start;
            flowcontent.TaskName          = todo.ToDoName;
            flowcontent.InstanceState     = instance.State;
            flowcontent.CurrentNodeKey    = todo.Nodekey;
            flowcontent.OperationType     = (int)operationType;
            flowcontent.CurrentTodoID     = todo.ID.ToString();
            flowcontent.FormID            = instance.FormID;

            if (this.beforOperation != null)
            {
                this.beforOperation(flowcontent);
            }
            FlowNode node = NodeFactory.getFlowNode(instance.TmpKey, todo.Nodekey, this.endFlow);

            // 处理 同意
            if (operationType == Common.Operation.Agree)
            {
                this.Apply(vallist, todoID, operationUserCode, operationType, common, flowcontent, node);
            }
            //todo 处理 撤回
            //if (operationType == Common.Operation.CallBack)
            //{
            //this.Apply(vallist, todoID, operationUserCode, operationType, common, flowcontent, node);
            //}
            // 处理 流程跳转
            if (operationType == Common.Operation.GoTo)
            {
                this.GoTo(vallist, todoID, operationUserCode, operationType, common, flowcontent, node, toNodeKey);
            }
            //todo 处理 传阅
            //if (operationType == Common.Operation.Read)
            //{
            //    this.Apply(vallist, todoID, operationUserCode, operationType, common, flowcontent, node);
            //}
            // 处理 驳回
            if (operationType == Common.Operation.Reject)
            {
                this.Reject(vallist, todoID, operationUserCode, operationType, common, flowcontent, node, toNodeKey);
            }
            // 处理 转签
            if (operationType == Common.Operation.Redirect)
            {
                this.Redirect(vallist, todoID, operationUserCode, operationType, common, flowcontent, node, todoUserCode);
            }
            // 处理 加签
            if (operationType == Common.Operation.Add)
            {
                this.Add(vallist, todoID, operationUserCode, operationType, common, flowcontent, node, todoUserCode);
            }
            if (this.afterOperation != null)
            {
                this.afterOperation(flowcontent);
            }
        }
Пример #17
0
 public bool update(WF_Instance entity)
 {
     return(dao.update(entity));
 }
Пример #18
0
        public WfResult Execute(WfRunner runner)
        {
            var result = instanceService.GetInstance(runner);

            if (result.Instance == null)
            {
                // create instance
                var instance = new WF_Instance();
                instance.InitializeId();
                instance.DCreate         = DateTime.Now;
                instance.AppInstanceId   = runner.AppInstanceId;
                instance.CreateUser_Id   = runner.AC.User.Id;
                instance.CreateUser_Name = runner.AC.User.UserName ?? runner.AC.User.NickName;
                instance.Process_Id      = result.Process.Id;
                instance.Process_Name    = result.Process.Name;
                instance.StartTask_Id    = result.Task.Id;
                instance.Status          = WfProcessStatus.Running;
                instanceService.Insert(instance);

                var iTask = new WF_InstanceTask();
                iTask.InitializeId();
                iTask.DCreate       = DateTime.Now;
                iTask.AppInstanceId = runner.AppInstanceId;
                iTask.Process_Id    = result.Process.Id;
                iTask.Process_Name  = result.Process.Name;
                iTask.Task_Id       = result.Task.Id;
                iTask.Task_Name     = result.Task.Name;
                iTask.DFetch        = DateTime.Now;
                iTask.Status        = WfTaskStatus.Dealing;
                iTask.Audit         = WfAuditState.UnSend;
                iTask.Action        = WfActionType.Begin;
                iTask.CreateUser_Id = runner.AC.User.Id;
                iTask.User_Id       = instance.CreateUser_Id;
                iTask.User_Name     = instance.CreateUser_Name;
                iTaskService.Insert(iTask);

                result.Instance     = instance;
                result.InstanceTask = iTask;
            }

            if (runner.LoadPrevInstanceTask && result.InstanceTask.Prev_Id.HasValue)
            {
                result.PrevInstanceTask = iTaskService.Get(result.InstanceTask.Prev_Id.Value);
            }

            if (runner.LoadBackInstanceTask)
            {
                result.BackInstanceTask = GetBackInstanceTask(result);
            }

            if (runner.LoadNextTasks)
            {
                result.NextTasks = GetNextTasks(result);
            }

            if (runner.LoadCanWithdraw)
            {
                if (result.InstanceTask.Status == WfTaskStatus.Processed)
                {
                    result.CanWithdraw = CanWithdraw(runner, result);
                }
                else
                {
                    result.CanWithdraw = false;
                }
            }

            return(result);
        }