Ejemplo n.º 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      = "保存成功";
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
0
        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      += "已完成";
        }
Ejemplo n.º 7
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;
        }
Ejemplo n.º 8
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;
        }
Ejemplo n.º 9
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;
            }
        }