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> /// 处理流程 /// </summary> /// <param name="executeModel">处理实体</param> /// <returns></returns> public Data.Model.WorkFlowExecute.Result Execute(Data.Model.WorkFlowExecute.Execute executeModel) { result = new Data.Model.WorkFlowExecute.Result(); nextTasks = new List <Data.Model.WorkFlowTask>(); if (executeModel.FlowID == Guid.Empty) { result.DebugMessages = "流程ID错误"; result.IsSuccess = false; result.Messages = "执行参数错误"; return(result); } wfInstalled = bWorkFlow.GetWorkFlowRunModel(executeModel.FlowID); if (wfInstalled == null) { result.DebugMessages = "未找到流程运行时实体"; result.IsSuccess = false; result.Messages = "流程运行时为空"; return(result); } switch (executeModel.ExecuteType) { case Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back: executeBack(executeModel); break; case Data.Model.WorkFlowExecute.EnumType.ExecuteType.Completed: executeComplete(executeModel); break; case Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save: executeSave(executeModel); break; case Data.Model.WorkFlowExecute.EnumType.ExecuteType.Submit: executeSubmit(executeModel); break; case Data.Model.WorkFlowExecute.EnumType.ExecuteType.Redirect: executeRedirect(executeModel); break; default: result.DebugMessages = "流程处理类型为空"; result.IsSuccess = false; result.Messages = "流程处理类型为空"; return(result); } result.NextTasks = nextTasks; return(result); }
/// <summary> /// 将json字符串转换为执行实体 /// </summary> /// <param name="jsonString"></param> /// <returns></returns> private Data.Model.WorkFlowExecute.Execute GetExecuteModel(string jsonString) { Data.Model.WorkFlowExecute.Execute execute = new Data.Model.WorkFlowExecute.Execute(); Business.Platform.Organize borganize = new Organize(); LitJson.JsonData jsondata = LitJson.JsonMapper.ToObject(jsonString); if (jsondata == null) { return(execute); } execute.Comment = jsondata["comment"].ToString(); string op = jsondata["type"].ToString().ToLower(); switch (op) { case "submit": execute.ExecuteType = Data.Model.WorkFlowExecute.EnumType.ExecuteType.Submit; break; case "save": execute.ExecuteType = Data.Model.WorkFlowExecute.EnumType.ExecuteType.Save; break; case "back": execute.ExecuteType = Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back; break; } execute.FlowID = jsondata["flowid"].ToString().ToGuid(); execute.GroupID = jsondata["groupid"].ToString().ToGuid(); execute.InstanceID = jsondata["instanceid"].ToString(); execute.IsSign = jsondata["issign"].ToString().ToInt() == 1; execute.StepID = jsondata["stepid"].ToString().ToGuid(); execute.TaskID = jsondata["taskid"].ToString().ToGuid(); var stepsjson = jsondata["steps"]; Dictionary <Guid, List <Data.Model.Users> > steps = new Dictionary <Guid, List <Data.Model.Users> >(); if (stepsjson.IsArray) { foreach (LitJson.JsonData step in stepsjson) { var id = step["id"].ToString().ToGuid(); var member = step["member"].ToString(); if (id == Guid.Empty || member.IsNullOrEmpty()) { continue; } steps.Add(id, borganize.GetAllUsers(member)); } } execute.Steps = steps; return(execute); }
/// <summary> /// 管理员强制退回任务 /// </summary> /// <param name="taskID"></param> /// <returns></returns> public string BackTask(Guid taskID) { var task = Get(taskID); if (task == null) { return("未找到任务"); } else if (task.Status.In(2, 3, 4)) { return("该任务已处理"); } if (wfInstalled == null) { wfInstalled = bWorkFlow.GetWorkFlowRunModel(task.FlowID); } Data.Model.WorkFlowExecute.Execute executeModel = new Data.Model.WorkFlowExecute.Execute(); executeModel.ExecuteType = Data.Model.WorkFlowExecute.EnumType.ExecuteType.Back; executeModel.FlowID = task.FlowID; executeModel.GroupID = task.GroupID; executeModel.InstanceID = task.InstanceID; executeModel.Note = "管理员退回"; executeModel.Sender = new Users().Get(task.ReceiveID); executeModel.StepID = task.StepID; executeModel.TaskID = task.ID; executeModel.Title = task.Title; var steps = wfInstalled.Steps.Where(p => p.ID == task.StepID); if (steps.Count() == 0) { return("未找到步骤"); } else if (steps.First().Behavior.BackType == 2 && steps.First().Behavior.BackStepID == Guid.Empty) { return("未设置退回步骤"); } Dictionary <Guid, List <Data.Model.Users> > execSteps = new Dictionary <Guid, List <Data.Model.Users> >(); var backsteps = GetBackSteps(taskID, steps.First().Behavior.BackType, task.StepID, wfInstalled); foreach (var back in backsteps) { execSteps.Add(back.Key, new List <Data.Model.Users>()); } executeModel.Steps = execSteps; var result = Execute(executeModel); return(result.Messages); }
/// <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 executeComplete(Data.Model.WorkFlowExecute.Execute executeModel) { if (executeModel.TaskID == Guid.Empty || executeModel.FlowID == Guid.Empty) { result.DebugMessages = "完成流程参数错误"; result.IsSuccess = false; result.Messages = "完成流程参数错误"; return; } var task = Get(executeModel.TaskID); if (task == null) { result.DebugMessages = "未找到当前任务"; result.IsSuccess = false; result.Messages = "未找到当前任务"; return; } Completed(task.ID, executeModel.Comment, executeModel.IsSign); if (wfInstalled.TitleField != null && wfInstalled.TitleField.LinkID != Guid.Empty && !wfInstalled.TitleField.Table.IsNullOrEmpty() && !wfInstalled.TitleField.Field.IsNullOrEmpty() && wfInstalled.DataBases.Count() > 0) { var firstDB = wfInstalled.DataBases.First(); new DBConnection().UpdateFieldValue( wfInstalled.TitleField.LinkID, wfInstalled.TitleField.Table, wfInstalled.TitleField.Field, "1", string.Format("{0}='{1}'", firstDB.PrimaryKey, task.InstanceID)); } result.DebugMessages += "已完成"; result.IsSuccess = true; result.Messages += "已完成"; }
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; } }