/// <summary> /// 发起流程 /// </summary> /// wangpf 15.11.24 /// <param name="action">当前流程行为实体</param> /// <param name="toDoWork">下一个任务实体</param> /// <param name="processUserId">当前用户ID</param> /// <param name="instanceData">关联的数据</param> /// <returns></returns> public bool Start(FlowAction action, ToDoWorkInfo toDoWork, int processUserId, string instanceData) { bool result = true; //1.新建流程实例 InstanceInfo1 instance = new InstanceInfo1() { WorkFlowId = toDoWork.nodeInfo.FlowId, ProcessUser = processUserId, ProcessTime = DateTime.Now, StartUser = processUserId, StartTime = DateTime.Now, Status = (byte)FlowStatus.流转 }; int instanceId = (int)this.ProcessClass.NewFlowInstance(instance); //2.1 下一个处理者ID var nextUserId = this.IFindUserMechanism.FindUser(); //3.更新流程实例 result &= this.ContinueProcess(toDoWork, instanceId, nextUserId, processUserId); //4.节点通知处理 result &= NewNodeMessage((int)toDoWork.action.ToNode, nextUserId, "", 1); //5.记录流程日志 string content = string.Format("用户" + this.ProcessClass.GetUserByUserID(processUserId).Username + "发起了流程"); result &= NewFlowLog(instanceId, (int)toDoWork.action.Node, (int)toDoWork.action.ID, processUserId, content); return(result); }
/// <summary> /// 审批流程 /// </summary> /// wangpf 15.11.25 /// <param name="instanceId">流程实例ID</param> /// <param name="toDoWork">下一个任务</param> /// <param name="processUserId">处理者ID</param> /// <returns></returns> public bool Submit(int instanceId, ToDoWorkInfo toDoWork, int processUserId) { bool result = true; string content = string.Empty; int nextUserId; //1.判断任务节点类型(流转节点,结束节点等) switch (toDoWork.nodeInfo.Type) { case (int)NodeType.发起节点: //查找下一个操作者 nextUserId = this.IFindUserMechanism.FindUser(); //流转流程 result &= this.ContinueProcess(toDoWork, instanceId, nextUserId, processUserId); //处理通知消息 result &= DealNodeMessage((int)toDoWork.action.Node, processUserId, (int)toDoWork.action.ToNode, nextUserId, "", 1); //日志内容 content = string.Format("用户" + this.ProcessClass.GetUserByUserID(processUserId).Username + "执行了流程"); break; case (int)NodeType.流转节点: //查找下一个操作者 nextUserId = this.IFindUserMechanism.FindUser(); //流转流程 result &= this.ContinueProcess(toDoWork, instanceId, nextUserId, processUserId); //处理通知消息 result &= DealNodeMessage((int)toDoWork.action.Node, processUserId, (int)toDoWork.action.ToNode, nextUserId, "", 1); //日志内容 content = string.Format("用户" + this.ProcessClass.GetUserByUserID(processUserId).Username + "执行了流程"); break; case (int)NodeType.结束节点: //结束流程 result &= this.EndProcess(toDoWork, instanceId, processUserId); //处理消息通知 result &= this.ProcessClass.DealMessageAlerts((int)toDoWork.action.Node, processUserId); //日志内容 content = string.Format("用户" + this.ProcessClass.GetUserByUserID(processUserId).Username + "结束了流程"); break; case (int)NodeType.中止节点: //中止流程 result &= this.StopProcess(toDoWork, instanceId, processUserId); //处理消息通知 result &= this.ProcessClass.DealMessageAlerts((int)toDoWork.action.Node, processUserId); //日志内容 content = string.Format("用户" + this.ProcessClass.GetUserByUserID(processUserId).Username + "中止了流程"); break; } ; //2.记录流程日志 result &= NewFlowLog(instanceId, (int)toDoWork.action.Node, (int)toDoWork.action.ID, processUserId, content); return(result); }
/// <summary> /// 发起流程 /// </summary> /// wangpf 15.11.25 /// <param name="workFlowId">流程ID</param> /// <param name="userId">用户ID</param> /// <returns></returns> public bool StartProcess(int workFlowId, int userId, string instanceData) { bool result = false; FlowAction action = this.WorkFlowEngineCore.GetStartAction(workFlowId); ToDoWorkInfo toDoWork = this.WorkFlowEngineCore.GetToDoWork((int)action.ID); this.WorkFlowEngineCore.IFindUserMechanism = new FindOnlyUser(toDoWork.nodeInfo.RoleId); result = this.WorkFlowEngineCore.Start(action, toDoWork, userId, instanceData); return(result); }
/// <summary> /// 继续流程流转 /// </summary> /// wangpf 15.11.25 /// <param name="toDoWork">下一个任务实体</param> /// <param name="instanceId">流程实例ID</param> /// <param name="nextUserId">下一个处理用户ID</param> /// <param name="currentUserId">当前用户ID</param> /// <returns></returns> private bool ContinueProcess(ToDoWorkInfo toDoWork, int instanceId, int nextUserId, int currentUserId) { //更新流程 InstanceInfo1 instance = new InstanceInfo1() { InstanceId = instanceId, CurrentNode = (int)toDoWork.nodeInfo.NodeId, CurrentUser = nextUserId, ProcessUser = currentUserId, ProcessTime = DateTime.Now }; return(this.ProcessClass.UpdateFlowInstance(instance)); }
/// <summary> /// 中止流程流转 /// </summary> /// wangpf 15.11.25 /// <param name="toDoWork">下一个任务实体</param> /// <param name="instanceId">流程实例ID</param> /// <param name="currentUserId">当前用户ID</param> /// <returns></returns> private bool StopProcess(ToDoWorkInfo toDoWork, int instanceId, int currentUserId) { //更新流程为中止 InstanceInfo1 instance = new InstanceInfo1() { InstanceId = instanceId, CurrentNode = (int)toDoWork.nodeInfo.NodeId, CurrentUser = null, ProcessUser = currentUserId, ProcessTime = DateTime.Now, EndTime = DateTime.Now, Status = (byte)FlowStatus.中止 }; return(this.ProcessClass.EndFlowInstance(instance)); }
/// <summary> /// 继续流程 /// </summary> /// <param name="actionId">行为ID</param> /// <param name="instanceId">流程实例ID</param> /// <param name="processUserId">处理者ID</param> /// <param name="pointUserId">分配任务时指定的用户ID</param> /// <returns></returns> public bool ContinueProcess(int actionId, int instanceId, int processUserId, int pointUserId = 0) { ToDoWorkInfo toDoWork = this.WorkFlowEngineCore.GetToDoWork(actionId); switch (toDoWork.action.Type) { case (int)FlowFindType.角色: this.WorkFlowEngineCore.IFindUserMechanism = new FindOnlyUser((int)toDoWork.nodeInfo.RoleId); break; case (int)FlowFindType.分配: this.WorkFlowEngineCore.IFindUserMechanism = new FindUserByPoint(pointUserId); break; case (int)FlowFindType.记录: this.WorkFlowEngineCore.IFindUserMechanism = new FindUserByFlowLog(instanceId, (int)toDoWork.action.ToNode); break; case (int)FlowFindType.分配并处理过: this.WorkFlowEngineCore.IFindUserMechanism = new FindUserDone(instanceId, actionId); break; } return(this.WorkFlowEngineCore.Submit(instanceId, toDoWork, processUserId)); }
/// <summary> /// 根据行为ID获取下一步任务 /// </summary> /// wangpf 15.11.26 /// <param name="actionId">行为ID</param> /// <returns></returns> public ToDoWorkInfo GetToDoWork(int actionId) { ToDoWorkInfo toDoWork = this.ProcessClass.GetToDoWork(actionId); return(toDoWork); }