private void executeSave(Data.Model.WorkFlowExecute.Execute executeModel) { //如果是第一步提交并且没有实例则先创建实例 Data.Model.WorkFlowTask currentTask = null; bool isFirst = executeModel.StepID == wfInstalled.FirstStepID && executeModel.TaskID == Guid.Empty && executeModel.GroupID == Guid.Empty; if (isFirst) { currentTask = createFirstTask(executeModel); } else { currentTask = Get(executeModel.TaskID); } if (currentTask == null) { result.DebugMessages = "未能创建或找到当前任务"; result.IsSuccess = false; result.Messages = "未能创建或找到当前任务"; return; } else { nextTasks.Add(currentTask); if (!executeModel.Title.IsNullOrEmpty()) { currentTask.Title = executeModel.Title; Update(currentTask); } } result.DebugMessages = "保存成功"; result.IsSuccess = true; result.Messages = "保存成功"; }
/// <summary> /// 将DataRedar转换为List /// </summary> private List <Data.Model.WorkFlowTask> DataReaderToList(SqlDataReader dataReader) { List <Data.Model.WorkFlowTask> List = new List <Data.Model.WorkFlowTask>(); Data.Model.WorkFlowTask model = null; while (dataReader.Read()) { model = new Data.Model.WorkFlowTask(); model.ID = dataReader.GetGuid(0); model.PrevID = dataReader.GetGuid(1); model.PrevStepID = dataReader.GetGuid(2); model.FlowID = dataReader.GetGuid(3); model.StepID = dataReader.GetGuid(4); model.StepName = dataReader.GetString(5); model.InstanceID = dataReader.GetString(6); model.GroupID = dataReader.GetGuid(7); model.Type = dataReader.GetInt32(8); model.Title = dataReader.GetString(9); model.SenderID = dataReader.GetGuid(10); model.SenderName = dataReader.GetString(11); model.SenderTime = dataReader.GetDateTime(12); model.ReceiveID = dataReader.GetGuid(13); model.ReceiveName = dataReader.GetString(14); model.ReceiveTime = dataReader.GetDateTime(15); if (!dataReader.IsDBNull(16)) { model.OpenTime = dataReader.GetDateTime(16); } if (!dataReader.IsDBNull(17)) { model.CompletedTime = dataReader.GetDateTime(17); } if (!dataReader.IsDBNull(18)) { model.CompletedTime1 = dataReader.GetDateTime(18); } if (!dataReader.IsDBNull(19)) { model.Comment = dataReader.GetString(19); } if (!dataReader.IsDBNull(20)) { model.IsSign = dataReader.GetInt32(20); } model.Status = dataReader.GetInt32(21); if (!dataReader.IsDBNull(22)) { model.Note = dataReader.GetString(22); } model.Sort = dataReader.GetInt32(23); List.Add(model); } return(List); }
/// <summary> /// 创建第一个任务 /// </summary> /// <param name="executeModel"></param> private Data.Model.WorkFlowTask createFirstTask(Data.Model.WorkFlowExecute.Execute executeModel) { if (wfInstalled == null) { wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID); } var nextSteps = wfInstalled.Steps.Where(p => p.ID == wfInstalled.FirstStepID); if (nextSteps.Count() == 0) { return(null); } Data.Model.WorkFlowTask task = new Data.Model.WorkFlowTask(); if (nextSteps.First().WorkTime > 0) { task.CompletedTime = Utility.DateTimeNew.Now.AddHours((double)nextSteps.First().WorkTime); } task.FlowID = executeModel.FlowID; task.GroupID = Guid.NewGuid(); task.ID = Guid.NewGuid(); task.Type = 0; task.InstanceID = executeModel.InstanceID; if (!executeModel.Note.IsNullOrEmpty()) { task.Note = executeModel.Note; } task.PrevID = Guid.Empty; task.PrevStepID = Guid.Empty; task.ReceiveID = executeModel.Sender.ID; task.ReceiveName = executeModel.Sender.Name; task.ReceiveTime = Utility.DateTimeNew.Now; task.SenderID = executeModel.Sender.ID; task.SenderName = executeModel.Sender.Name; task.SenderTime = task.ReceiveTime; task.Status = 0; task.StepID = wfInstalled.FirstStepID; task.StepName = nextSteps.First().Name; task.Sort = 1; if (!executeModel.Title.IsNullOrEmpty()) { task.Title = executeModel.Title; } Add(task); return(task); }
private void executeRedirect(Data.Model.WorkFlowExecute.Execute executeModel) { Data.Model.WorkFlowTask currentTask = null; bool isFirst = executeModel.StepID == wfInstalled.FirstStepID && executeModel.TaskID == Guid.Empty && executeModel.GroupID == Guid.Empty; if (isFirst) { currentTask = createFirstTask(executeModel); } else { currentTask = Get(executeModel.TaskID); } if (currentTask == null) { result.DebugMessages = "未能创建或找到当前任务"; result.IsSuccess = false; result.Messages = "未能创建或找到当前任务"; return; } else if (currentTask.Status.In(2, 3, 4)) { result.DebugMessages = "当前任务已处理"; result.IsSuccess = false; result.Messages = "当前任务已处理"; return; } else if (currentTask.Status == 5) { result.DebugMessages = "当前任务正在等待他人处理"; result.IsSuccess = false; result.Messages = "当前任务正在等待他人处理"; return; } if (executeModel.Steps.First().Value.Count == 0) { result.DebugMessages = "未设置转交人员"; result.IsSuccess = false; result.Messages = "未设置转交人员"; return; } else if (executeModel.Steps.First().Value.Count > 1) { result.DebugMessages = "当前任务只能转交给一个人员"; result.IsSuccess = false; result.Messages = "当前任务只能转交给一个人员"; return; } string receiveName = currentTask.ReceiveName; currentTask.ReceiveID = executeModel.Steps.First().Value.First().ID; currentTask.ReceiveName = executeModel.Steps.First().Value.First().Name; currentTask.OpenTime = null; currentTask.Status = 0; currentTask.Note = string.Format("该任务由{0}转交", receiveName); Update(currentTask); nextTasks.Add(currentTask); result.DebugMessages = "转交成功"; result.IsSuccess = true; result.Messages = string.Concat("已转交给:", currentTask.ReceiveName); return; }
private void executeBack(Data.Model.WorkFlowExecute.Execute executeModel) { var currentTask = Get(executeModel.TaskID); if (currentTask == null) { result.DebugMessages = "未能找到当前任务"; result.IsSuccess = false; result.Messages = "未能找到当前任务"; return; } else if (currentTask.Status.In(2, 3, 4)) { result.DebugMessages = "当前任务已处理"; result.IsSuccess = false; result.Messages = "当前任务已处理"; return; } else if (currentTask.Status == 5) { result.DebugMessages = "当前任务正在等待他人处理"; result.IsSuccess = false; result.Messages = "当前任务正在等待他人处理"; return; } var currentSteps = wfInstalled.Steps.Where(p => p.ID == currentTask.StepID); var currentStep = currentSteps.Count() > 0 ? currentSteps.First() : null; if (currentStep == null) { result.DebugMessages = "未能找到当前步骤"; result.IsSuccess = false; result.Messages = "未能找到当前步骤"; return; } if (currentTask.StepID == wfInstalled.FirstStepID) { result.DebugMessages = "当前任务是流程第一步,不能退回"; result.IsSuccess = false; result.Messages = "当前任务是流程第一步,不能退回"; return; } if (executeModel.Steps.Count == 0) { result.DebugMessages = "没有选择要退回的步骤"; result.IsSuccess = false; result.Messages = "没有选择要退回的步骤"; return; } List <Data.Model.WorkFlowTask> backTasks = new List <Data.Model.WorkFlowTask>(); switch (currentStep.Behavior.BackModel) { case 0: //不能退回 result.DebugMessages = "当前步骤设置为不能退回"; result.IsSuccess = false; result.Messages = "当前步骤设置为不能退回"; return; case 1: //单个退回 var taskList = GetTaskList(currentTask.ID); if (taskList.Find(p => p.Status > 1) != null) { result.DebugMessages = "当前步骤他人已处理,不能退回"; result.IsSuccess = false; result.Messages = "当前步骤他人已处理,不能退回"; } backTasks.Add(currentTask); break; case 2: //全部退回 var taskList1 = GetTaskList(currentTask.ID); if (taskList1.Find(p => p.Status > 1) != null) { result.DebugMessages = "当前步骤他人已处理,不能退回"; result.IsSuccess = false; result.Messages = "当前步骤他人已处理,不能退回"; } backTasks.AddRange(taskList1); break; } using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope()) { foreach (var backTask in backTasks) { if (backTask.Status.In(2, 3))//已完成的任务不能退回 { continue; } if (backTask.ID == currentTask.ID) { Completed(backTask.ID, executeModel.Comment, executeModel.IsSign, 3); } else { Completed(backTask.ID, "", false, 3, "他人已退回"); } var tasks = GetTaskList(backTask.PrevID); foreach (var task in tasks) { if (task != null) { //Completed(task.ID, "", false, 0, ""); Data.Model.WorkFlowTask newTask = task; newTask.ID = Guid.NewGuid(); newTask.PrevID = currentTask.ID; newTask.Note = "退回任务"; newTask.ReceiveTime = Utility.DateTimeNew.Now; newTask.SenderID = currentTask.ReceiveID; newTask.SenderName = currentTask.ReceiveName; newTask.SenderTime = Utility.DateTimeNew.Now; newTask.Sort = currentTask.Sort + 1; newTask.Status = 0; newTask.Comment = ""; if (currentStep.WorkTime > 0) { newTask.CompletedTime = Utility.DateTimeNew.Now.AddHours((double)currentStep.WorkTime); } else { newTask.CompletedTime = null; } newTask.CompletedTime1 = null; Add(newTask); nextTasks.Add(newTask); } } } scope.Complete(); } List <string> nextStepName = new List <string>(); foreach (var nstep in nextTasks) { nextStepName.Add(nstep.StepName); } string msg = string.Format("已退回到:{0}", nextStepName.Distinct().ToList().ToString(",")); result.DebugMessages += msg; result.IsSuccess = true; result.Messages += msg; result.NextTasks = nextTasks; return; }
private void executeSubmit(Data.Model.WorkFlowExecute.Execute executeModel) { using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope()) { //如果是第一步提交并且没有实例则先创建实例 Data.Model.WorkFlowTask currentTask = null; bool isFirst = executeModel.StepID == wfInstalled.FirstStepID && executeModel.TaskID == Guid.Empty && executeModel.GroupID == Guid.Empty; if (isFirst) { currentTask = createFirstTask(executeModel); } else { currentTask = Get(executeModel.TaskID); } if (currentTask == null) { result.DebugMessages = "未能创建或找到当前任务"; result.IsSuccess = false; result.Messages = "未能创建或找到当前任务"; return; } else if (currentTask.Status.In(2, 3, 4)) { result.DebugMessages = "当前任务已处理"; result.IsSuccess = false; result.Messages = "当前任务已处理"; return; } else if (currentTask.Status == 5) { result.DebugMessages = "当前任务正在等待他人处理"; result.IsSuccess = false; result.Messages = "当前任务正在等待他人处理"; return; } var currentSteps = wfInstalled.Steps.Where(p => p.ID == executeModel.StepID); var currentStep = currentSteps.Count() > 0 ? currentSteps.First() : null; if (currentStep == null) { result.DebugMessages = "未找到当前步骤"; result.IsSuccess = false; result.Messages = "未找到当前步骤"; return; } int status = 0; switch (currentStep.Behavior.HanlderModel) { case 0: //所有人必须处理 var taskList = GetTaskList(currentTask.ID); if (taskList.Count > 1) { var noCompleted = taskList.Where(p => p.Status != 2); if (noCompleted.Count() - 1 > 0) { status = 5; } else { UpdateNextTaskStatus(currentTask.ID, 0); } } Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign); break; case 1: //一人同意即可 var taskList1 = GetTaskList(currentTask.ID); foreach (var task in taskList1) { if (task.ID != currentTask.ID) { Completed(task.ID, "", false, 4); } else { Completed(task.ID, executeModel.Comment, executeModel.IsSign); } } break; case 2: //依据人数比例 var taskList2 = GetTaskList(currentTask.ID); if (taskList2.Count > 1) { decimal percentage = currentStep.Behavior.Percentage; //比例 var noCompleted = taskList2.Where(p => p.Status != 2); if ((((decimal)(taskList2.Count - (noCompleted.Count() - 1)) / (decimal)taskList2.Count) * 100).Round() < percentage) { status = 5; } else { foreach (var task in taskList2) { if (task.ID != currentTask.ID && task.Status.In(0, 1)) { Completed(task.ID, "", false, 4); } } UpdateNextTaskStatus(currentTask.ID, 0); } } Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign); break; case 3: //独立处理 Completed(currentTask.ID, executeModel.Comment, executeModel.IsSign); break; } foreach (var step in executeModel.Steps) { foreach (var user in step.Value) { if (HasNoCompletedTasks(executeModel.FlowID, step.Key, currentTask.GroupID, user.ID)) { continue; } var nextSteps = wfInstalled.Steps.Where(p => p.ID == step.Key); if (nextSteps.Count() == 0) { continue; } Data.Model.WorkFlowTask task = new Data.Model.WorkFlowTask(); if (nextSteps.First().WorkTime > 0) { task.CompletedTime = Utility.DateTimeNew.Now.AddHours((double)nextSteps.First().WorkTime); } task.FlowID = executeModel.FlowID; task.GroupID = currentTask != null ? currentTask.GroupID : executeModel.GroupID; task.ID = Guid.NewGuid(); task.Type = 0; task.InstanceID = executeModel.InstanceID; if (!executeModel.Note.IsNullOrEmpty()) { task.Note = executeModel.Note; } task.PrevID = currentTask.ID; task.PrevStepID = currentTask.StepID; task.ReceiveID = user.ID; task.ReceiveName = user.Name; task.ReceiveTime = Utility.DateTimeNew.Now; task.SenderID = executeModel.Sender.ID; task.SenderName = executeModel.Sender.Name; task.SenderTime = task.ReceiveTime; task.Status = status; task.StepID = step.Key; task.StepName = nextSteps.First().Name; task.Sort = currentTask.Sort + 1; if (!executeModel.Title.IsNullOrEmpty()) { task.Title = executeModel.Title; } Add(task); nextTasks.Add(task); } } scope.Complete(); List <string> nextStepName = new List <string>(); foreach (var nstep in nextTasks) { nextStepName.Add(nstep.StepName); } result.DebugMessages += string.Format("已发送到:{0}", nextStepName.Distinct().ToList().ToString(",")); result.IsSuccess = true; result.Messages += string.Format("已发送到:{0}", nextStepName.Distinct().ToList().ToString(",")); result.NextTasks = nextTasks; } }
/// <summary> /// 更新 /// </summary> public int Update(Data.Model.WorkFlowTask model) { return(dataWorkFlowTask.Update(model)); }
/// <summary> /// 新增 /// </summary> public int Add(Data.Model.WorkFlowTask model) { return(dataWorkFlowTask.Add(model)); }
/// <summary> /// 添加记录 /// </summary> /// <param name="model">Data.Model.WorkFlowTask实体类</param> /// <returns>操作所影响的行数</returns> public int Add(Data.Model.WorkFlowTask model) { string sql = @"INSERT INTO WorkFlowTask (ID,PrevID,PrevStepID,FlowID,StepID,StepName,InstanceID,GroupID,Type,Title,SenderID,SenderName,SenderTime,ReceiveID,ReceiveName,ReceiveTime,OpenTime,CompletedTime,CompletedTime1,Comment,IsSign,Status,Note,Sort) VALUES(@ID,@PrevID,@PrevStepID,@FlowID,@StepID,@StepName,@InstanceID,@GroupID,@Type,@Title,@SenderID,@SenderName,@SenderTime,@ReceiveID,@ReceiveName,@ReceiveTime,@OpenTime,@CompletedTime,@CompletedTime1,@Comment,@IsSign,@Status,@Note,@Sort)" ; SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("@ID", SqlDbType.UniqueIdentifier, -1) { Value = model.ID }, new SqlParameter("@PrevID", SqlDbType.UniqueIdentifier, -1) { Value = model.PrevID }, new SqlParameter("@PrevStepID", SqlDbType.UniqueIdentifier, -1) { Value = model.PrevStepID }, new SqlParameter("@FlowID", SqlDbType.UniqueIdentifier, -1) { Value = model.FlowID }, new SqlParameter("@StepID", SqlDbType.UniqueIdentifier, -1) { Value = model.StepID }, new SqlParameter("@StepName", SqlDbType.NVarChar, 1000) { Value = model.StepName }, new SqlParameter("@InstanceID", SqlDbType.VarChar, 50) { Value = model.InstanceID }, new SqlParameter("@GroupID", SqlDbType.UniqueIdentifier, -1) { Value = model.GroupID }, new SqlParameter("@Type", SqlDbType.Int, -1) { Value = model.Type }, new SqlParameter("@Title", SqlDbType.NVarChar, 4000) { Value = model.Title }, new SqlParameter("@SenderID", SqlDbType.UniqueIdentifier, -1) { Value = model.SenderID }, new SqlParameter("@SenderName", SqlDbType.NVarChar, 100) { Value = model.SenderName }, new SqlParameter("@SenderTime", SqlDbType.DateTime, 8) { Value = model.SenderTime }, new SqlParameter("@ReceiveID", SqlDbType.UniqueIdentifier, -1) { Value = model.ReceiveID }, new SqlParameter("@ReceiveName", SqlDbType.NVarChar, 100) { Value = model.ReceiveName }, new SqlParameter("@ReceiveTime", SqlDbType.DateTime, 8) { Value = model.ReceiveTime }, model.OpenTime == null ? new SqlParameter("@OpenTime", SqlDbType.DateTime, 8) { Value = DBNull.Value } : new SqlParameter("@OpenTime", SqlDbType.DateTime, 8) { Value = model.OpenTime }, model.CompletedTime == null ? new SqlParameter("@CompletedTime", SqlDbType.DateTime, 8) { Value = DBNull.Value } : new SqlParameter("@CompletedTime", SqlDbType.DateTime, 8) { Value = model.CompletedTime }, model.CompletedTime1 == null ? new SqlParameter("@CompletedTime1", SqlDbType.DateTime, 8) { Value = DBNull.Value } : new SqlParameter("@CompletedTime1", SqlDbType.DateTime, 8) { Value = model.CompletedTime1 }, model.Comment == null ? new SqlParameter("@Comment", SqlDbType.VarChar, -1) { Value = DBNull.Value } : new SqlParameter("@Comment", SqlDbType.VarChar, -1) { Value = model.Comment }, model.IsSign == null ? new SqlParameter("@IsSign", SqlDbType.Int, -1) { Value = DBNull.Value } : new SqlParameter("@IsSign", SqlDbType.Int, -1) { Value = model.IsSign }, new SqlParameter("@Status", SqlDbType.Int, -1) { Value = model.Status }, model.Note == null ? new SqlParameter("@Note", SqlDbType.NVarChar, -1) { Value = DBNull.Value } : new SqlParameter("@Note", SqlDbType.NVarChar, -1) { Value = model.Note }, new SqlParameter("@Sort", SqlDbType.Int, -1) { Value = model.Sort } }; return(dbHelper.Execute(sql, parameters)); }