/// <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)); }
/// <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 }); } }