Exemple #1
0
        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      = "保存成功";
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        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;
        }
Exemple #5
0
        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;
        }
Exemple #6
0
        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;
            }
        }
Exemple #7
0
 /// <summary>
 /// 更新
 /// </summary>
 public int Update(Data.Model.WorkFlowTask model)
 {
     return(dataWorkFlowTask.Update(model));
 }
Exemple #8
0
 /// <summary>
 /// 新增
 /// </summary>
 public int Add(Data.Model.WorkFlowTask model)
 {
     return(dataWorkFlowTask.Add(model));
 }
Exemple #9
0
        /// <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));
        }