Пример #1
0
        /// <summary>
        ///     保存流程到下一步
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <OperateStatus> SaveWorkflowEngineTaskNext(WorkflowEngineRunnerInput input)
        {
            //根据当前模块Id及实例Id获取下一步流程信息
            var nextActivitys = await GetWorkflowEngineNextActivitysDoubleWay(input);

            IList <WorkflowProcessInstanceTask> tasks = new List <WorkflowProcessInstanceTask>();
            //更新状态
            var markedInput = new WorkflowEngineActivityOrLineMarkedInput
            {
                Activity          = input.CurrentActivityId,
                ProcessInstanceId = input.ProcessInstanceId
            };

            //插入流程任务表
            foreach (var activity in nextActivitys)
            {
                //判断该节点是否为结束节点
                var processTask = new WorkflowProcessInstanceTask
                {
                    TaskId              = CombUtil.NewComb(),
                    Title               = input.Title,
                    ProcessInstanceId   = input.ProcessInstanceId,
                    PrevTaskId          = input.CurrentTaskId,
                    PrevActivityId      = input.CurrentActivityId,
                    PrevActivityName    = input.CurrentActivityName,
                    CurrentActivityId   = activity.ActivityId,
                    CurrentActivityName = activity.Name,
                    SendUserId          = input.CurrentUser.UserId,
                    SendUserName        = input.CurrentUser.Name,
                    SendTime            = DateTime.Now,
                    Status              = (byte)EnumTask.正在处理,
                    ReceiveTime         = DateTime.Now
                };
                if (activity.AcitvityType == EnumAcitvityType.结束)
                {
                    processTask.Status          = (byte)EnumTask.完成;
                    processTask.ReceiveUserId   = input.CurrentUser.UserId;
                    processTask.ReceiveUserName = input.CurrentUser.Name;
                    processTask.DoUserId        = input.CurrentUser.UserId;
                    processTask.DoUserName      = input.CurrentUser.Name;
                    processTask.DoTime          = DateTime.Now;
                    markedInput.ToActivity      = processTask.CurrentActivityId;
                    await _workflowProcessInstanceLineLogic.UpdateLineMarked(markedInput);

                    tasks.Add(processTask);
                    //修改流程总状态及处理人
                    var processInstance = await _workflowProcessInstanceLogic.GetByIdAsync(input.ProcessInstanceId);

                    processInstance.Status              = (byte)EnumProcessStatu.已完成;
                    processInstance.EndUserId           = input.CurrentUser.UserId;
                    processInstance.EndUserName         = input.CurrentUser.Name;
                    processInstance.EndTime             = DateTime.Now;
                    processInstance.EndUserOrganization = input.CurrentUser.OrganizationName;
                    await _workflowProcessInstanceLogic.UpdateAsync(processInstance);

                    break;
                }
                //获取流程下一步处理人员
                var receiveUsers = await Task.Run(() => GetWorkflowEngineTaskNextReceiveUser(activity).ToList());

                if (!receiveUsers.Any())
                {
                    return(new OperateStatus
                    {
                        ResultSign = ResultSign.Error,
                        Message = string.Format(ResourceWorkflow.处理人为空, activity.Name)
                    });
                }
                //获取流程处理人,为该流程所有处理人新增一条待办记录
                foreach (var receive in receiveUsers)
                {
                    processTask.ReceiveUserId   = receive.ReceiveUserId;
                    processTask.ReceiveUserName = receive.ReceiveUserName;
                    markedInput.ToActivity      = processTask.CurrentActivityId;
                    await _workflowProcessInstanceLineLogic.UpdateLineMarked(markedInput);

                    tasks.Add(processTask);
                }
            }
            //更新状态
            markedInput = new WorkflowEngineActivityOrLineMarkedInput
            {
                Activity          = input.CurrentActivityId,
                ProcessInstanceId = input.ProcessInstanceId
            };
            //更新活动状态
            await _workflowProcessInstanceActivityLogic.UpdateActivityMarked(markedInput);

            //修改当前步骤为完成
            await _workflowProcessTaskLogic.UpdateProcessTaskStatus(new WorkflowEngineProcessTaskStatusInput()
            {
                Comment       = input.Comment,
                PrincipalUser = input.CurrentUser,
                Status        = EnumActivityStatus.完成,
                TaskId        = input.CurrentTaskId
            });

            return(await _workflowProcessTaskLogic.InsertMultipleDapperAsync(tasks));
        }
Пример #2
0
        /// <summary>
        ///     开始启动流程
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <OperateStatus> StartWorkflowEngineProcess(WorkflowEngineStartTaskInput input)
        {
            try
            {
                //查询流程信息
                var processActivity = await _workflowProcessActivityLogic.GetWorkflowProcessActivityByProcessId(new IdInput { Id = input.ProcessId });

                var processLine = await _workflowProcessLineLogic.GetWorkflowProcessLineByProcessId(new IdInput { Id = input.ProcessId });

                //插入流程实例信息
                var processInstance = new WorkflowProcessInstance
                {
                    Status                 = (byte)EnumProcessStatu.处理中,
                    ProcessInstanceId      = CombUtil.NewComb(),
                    ProcessId              = input.ProcessId,
                    Title                  = input.Title,
                    Urgency                = input.Urgency,
                    CreateTime             = DateTime.Now,
                    CreateUserId           = input.PrincipalUser.UserId,
                    CreateUserName         = input.PrincipalUser.Name,
                    CreateUserOrganization = input.PrincipalUser.OrganizationName,
                    UpdateTime             = DateTime.Now,
                    UpdateUserId           = input.PrincipalUser.UserId,
                    UpdateUserName         = input.PrincipalUser.Name,
                    UpdateUserOrganization = input.PrincipalUser.OrganizationName,
                };
                //插入流程实例活动信息
                IList <WorkflowProcessInstanceActivity> processInstanceActivitys =
                    new List <WorkflowProcessInstanceActivity>();
                foreach (var activity in processActivity)
                {
                    var processInstanceActivity = activity.MapTo <WorkflowProcessInstanceActivity>();
                    processInstanceActivity.ProcessInstanceId = processInstance.ProcessInstanceId;
                    processInstanceActivity.Marked            = false;
                    processInstanceActivitys.Add(processInstanceActivity);
                }
                //插入流程实例连线信息
                IList <WorkflowProcessInstanceLine> processInstanceLines = new List <WorkflowProcessInstanceLine>();
                foreach (var line in processLine)
                {
                    var processInstanceLine = line.MapTo <WorkflowProcessInstanceLine>();
                    processInstanceLine.ProcessInstanceId = processInstance.ProcessInstanceId;
                    processInstanceLine.Marked            = false;
                    processInstanceLines.Add(processInstanceLine);
                }
                //插入数据
                await _workflowProcessInstanceLogic.InsertAsync(processInstance);

                await _workflowProcessInstanceActivityLogic.InsertMultipleDapperAsync(processInstanceActivitys);

                await _workflowProcessInstanceLineLogic.InsertMultipleDapperAsync(processInstanceLines);

                //获取发起步骤
                var startTask = await GetWorkflowEngineStartTaskOutput(input);

                //插入第一步流程任务信息
                var processTask = new WorkflowProcessInstanceTask
                {
                    TaskId              = CombUtil.NewComb(),
                    Title               = input.Title,
                    ProcessInstanceId   = processInstance.ProcessInstanceId,
                    CurrentActivityId   = startTask.ActivityId,
                    CurrentActivityName = startTask.Name,
                    SendUserId          = input.PrincipalUser.UserId,
                    SendUserName        = input.PrincipalUser.Name,
                    SendTime            = DateTime.Now,
                    ReceiveUserId       = input.PrincipalUser.UserId,
                    ReceiveUserName     = input.PrincipalUser.Name,
                    ReceiveTime         = DateTime.Now,
                    DoUserId            = input.PrincipalUser.UserId,
                    DoUserName          = input.PrincipalUser.Name,
                    DoTime              = DateTime.Now,
                    Status              = (byte)EnumActivityStatus.完成
                };
                await _workflowProcessTaskLogic.InsertAsync(processTask);

                //下一步
                var operateStatus = await SaveWorkflowEngineTaskNext(new WorkflowEngineRunnerInput
                {
                    Title               = processInstance.Title,
                    ProcessInstanceId   = processInstance.ProcessInstanceId,
                    CurrentActivityId   = startTask.ActivityId,
                    CurrentActivityName = startTask.Name,
                    CurrentTaskId       = processTask.TaskId,
                    CurrentUser         = input.PrincipalUser,
                    ProcessId           = startTask.ProcessId
                });

                return(operateStatus);
            }
            catch (Exception ex)
            {
                LogWriter.WriteLog(FolderName.Workflow, "启动流程发生异常:" + ex.Message);
                return(new OperateStatus
                {
                    ResultSign = ResultSign.Error,
                    Message = ex.Message
                });
            }
        }