/// <summary> /// 获取指定工作流、角色、时间段的实例集合 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userIdentity">用户身份</param> /// <param name="role">审批角色</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> public InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate) { //提取实例集合的过程,先遍历每一个提取者对象进行实例提取,后遍历每个过滤器进行实例过滤,最后返回剩余的实例的集合 InstanceCollection instances = new InstanceCollection(); StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); foreach (InstanceDistiller distiller in InstanceDistillers) { instances.AddRange(distiller.InternalDistill(workflowName, userIdentity, role, startDate, endDate)); } if (Filters != null) { foreach (InstanceFilter filter in Filters) { if (filter is IInstanceCollectionFilter) { IInstanceCollectionFilter collFilter = (IInstanceCollectionFilter)filter; collFilter.Filter(instances, role, userIdentity); } else { for (int i = instances.Count - 1; i >= 0; i--) { if (filter.InternalIsMatch(instances[i].Instance, role, userIdentity)) { instances.RemoveAt(i); } } } } } return(instances); }
/// <summary> /// 获取指定用户Id的审批角色列表 /// </summary> /// <param name="workflowName">工作流名称</param> /// <param name="userId">用户Id</param> /// <returns>用户所在的审批角色</returns> public static List <ApprovalRole> GetUserRoles(string workflowName, string userId) { List <ApprovalRole> rolesList = new List <ApprovalRole>(); //如果用户id为空,那么返回空角色集合 if (string.IsNullOrEmpty(userId)) { return(rolesList); } IUserInRole userInRole = WorkflowRuntime.Current.GetService <IIdentityService>().GetUserInRole(); StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); foreach (ApprovalRole approvalRole in workflow.Roles) { if (userInRole.IsUserInRole(userId, approvalRole.Name)) { if (!rolesList.Contains(approvalRole)) { rolesList.Add(approvalRole); } } } return(rolesList); }
/// <summary> /// Gets the proceed list. /// </summary> /// <param name="startDate">The start date.</param> /// <param name="endDate">The end date.</param> /// <param name="userId">The user id.</param> /// <returns></returns> protected List<StateMachineWorkflowInstance> GetProceedList(DateTime startDate, DateTime endDate, string userId) { List<ApprovalRecord> recordList = new List<ApprovalRecord>(); string[] workflowNames = WorkflowRuntime.Current.DefineService.GetAllWorkflowDefineName(applicationName); foreach (string workflowName in workflowNames) { WorkflowRuntime.Current.GetService<IApprovalSaveService>().GetRecord(workflowName, startDate, endDate, userId); } List<int> eaIds = new List<int>(); foreach (ApprovalRecord record in recordList) { if (!eaIds.Contains(record.EaId)) eaIds.Add(record.EaId); } List<StateMachineWorkflowInstance> instanceList = new List<StateMachineWorkflowInstance>(); foreach (int eaid in eaIds) { List<StateMachineWorkflowInstance> instances = WorkflowRuntime.Current.GetInstance(applicationName, eaid, false); foreach (StateMachineWorkflowInstance instance in instances) { StateMachineWorkflow workflow = (StateMachineWorkflow)instance.Workflow; if (instance.ParentId == null || instance.ParentId == Guid.Empty) { instanceList.Add(instance); break; } } } return instanceList; }
/// <summary> /// 启动工作流 /// </summary> public override void Start() { StateMachineWorkflow o = (StateMachineWorkflow)this.Workflow; ApprovalState initState = o.GetStateByName(o.InitState); this.stateName = initState.Name; this.persistTime = DateTime.Now; WorkflowRuntime.Current.GetService <IWorkflowPersistService>().InsertWorkflowInstance(this); }
/// <summary> /// 根据工作流名称创建一个过程对象 /// </summary> /// <param name="workflowName">工作流名称</param> /// <param name="rules">审批规则</param> /// <param name="userIdentity">用户省份</param> public ApprovalProcess(string workflowName, IApprovalRules rules, IUserIdentity userIdentity) { this.approvalService = WorkflowRuntime.Current.GetService <IApprovalSaveService>(); this.workflowPersistService = WorkflowRuntime.Current.GetService <IWorkflowPersistService>(); this.workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); this.rules = rules; this.userIdentity = userIdentity; this.unitCode = userIdentity.GetUserUnitCode(); this.userId = userIdentity.GetUserId(); }
/// <summary> /// 递归获取所有流程的所有审批状态 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="dicStates">状态字典</param> protected void AddApprovalStates(string workflowName, Dictionary<string, string> dicStates) { StateMachineWorkflow stateMachine = WorkflowRuntime.Current.GetService<IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName) as StateMachineWorkflow; foreach (ApprovalState state in stateMachine.States) { if (state.IsApprovalState && !dicStates.ContainsKey(state.Description)) dicStates.Add(state.Description, state.Name); else continue; } }
/// <summary> /// 获取指定工作流、角色、时间段的实例集合 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userIdentity">用户身份</param> /// <param name="role">审批角色</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> protected override InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate) { StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); List <StateMachineWorkflowInstance> instances = WorkflowRuntime.Current.GetInstance(workflowName, startDate, endDate, new string[] { workflow.EndState }, userIdentity.GetUserUnitCode()); InstanceCollection collection = new InstanceCollection(); foreach (StateMachineWorkflowInstance instance in instances) { collection.Add(new InstanceWithRole(instance, role, false)); } return(collection); }
/// <summary> /// 获取指定工作流、角色、时间段的实例集合 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userIdentity">用户身份</param> /// <param name="role">审批角色</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> protected override InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate) { List <StateMachineWorkflowInstance> instances = new List <StateMachineWorkflowInstance>(); string userName = ""; string fromUserId = ""; //找到代理条目给获取授权人Id和授权人姓名 List <ApprovalAgent> agentList = WorkflowRuntime.Current.GetService <IApprovalSaveService>().GetAgentInfoByToUser(userIdentity.GetUserId()); foreach (ApprovalAgent agent in agentList) { if (agent.BeginDate == startDate && agent.EndDate == endDate) { userName = string.Format("{0}(代{1})", agent.ToUserName, agent.SetUserName); fromUserId = agent.SetUserId; } } //获取用户时间段内的审批记录,找到符合代理信息的记录,获取相应的实例 StateMachineWorkflow workflow = WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName) as StateMachineWorkflow; List <ApprovalRecord> records = WorkflowRuntime.Current.GetService <IApprovalSaveService>().GetRecord(workflowName, startDate, endDate, fromUserId); List <Guid> ids = new List <Guid>(); foreach (ApprovalRecord record in records) { if (record.OperatorName == userName) { ids.Add(record.WorkflowInstanceId); } } instances = new List <StateMachineWorkflowInstance>(); foreach (Guid id in ids) { instances.Add((StateMachineWorkflowInstance)WorkflowRuntime.Current.GetInstance(id)); } InstanceCollection collection = new InstanceCollection(); foreach (StateMachineWorkflowInstance instance in instances) { if (instance.WorkflowName == workflowName) { collection.Add(new InstanceWithRole(instance, role, false)); } } return(collection); }
/// <summary> /// 按最后操作时间范围获取正在审批中的所有项目任务列表 /// </summary> /// <param name="mainWorkflowName">Name of the main workflow.</param> /// <param name="isByUnit">if set to <c>true</c> [is by unit].</param> /// <returns></returns> public virtual TaskList[] GetProcessingLists(string mainWorkflowName, bool isByUnit) { string unitCode = ""; if (isByUnit) unitCode = userIdentity.GetUserUnitCode(); List<TaskList> result = new List<TaskList>(); Dictionary<string, string> stateNames = new Dictionary<string, string>(); string[] workflows = WorkflowRuntime.Current.GetService<IWorkFlowDefinePersistService>().GetAllWorkflowDefineName(applicationName); StateMachineWorkflow stateMachine = WorkflowRuntime.Current.GetService<IWorkFlowDefinePersistService>().GetWorkflowDefine(mainWorkflowName) as StateMachineWorkflow; AddApprovalStates(mainWorkflowName, stateNames); foreach (string stateDes in stateNames.Keys) { string stateName = stateNames[stateDes]; List<StateMachineWorkflowInstance> instanceList = new List<StateMachineWorkflowInstance>(); instanceList.AddRange(WorkflowRuntime.Current.GetInstance(mainWorkflowName, DateTime.Now.AddYears(-5), DateTime.Now.AddDays(1), new string[] { stateName }, unitCode)); result.Add(new TaskList("a." + stateDes, ItemProcessor.GenerateTaskTable(instanceList, true))); } return result.ToArray(); }
/// <summary> /// 获取指定工作流、角色、时间段的实例集合 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userIdentity">用户身份</param> /// <param name="role">审批角色</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> protected override InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate) { StateMachineWorkflow workflow = WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName) as StateMachineWorkflow; string userId, unitCode, roleName; userId = unitCode = roleName = ""; if (isMatchUser) { userId = userIdentity.GetUserId(); } if (isMatchUnit) { unitCode = userIdentity.GetUserUnitCode(); } if (isMatchRole) { roleName = role.Name; } List <ApprovalRecord> records = WorkflowRuntime.Current.GetService <IApprovalSaveService>().GetRecord(workflowName, startDate, endDate, userId, unitCode, roleName); List <Guid> ids = new List <Guid>(); foreach (ApprovalRecord record in records) { if (!ids.Contains(record.WorkflowInstanceId)) { ids.Add(record.WorkflowInstanceId); } } List <StateMachineWorkflowInstance> instances = new List <StateMachineWorkflowInstance>(); foreach (Guid id in ids) { instances.Add((StateMachineWorkflowInstance)WorkflowRuntime.Current.GetInstance(id)); } InstanceCollection collection = new InstanceCollection(); foreach (StateMachineWorkflowInstance instance in instances) { collection.Add(new InstanceWithRole(instance, role, false)); } return(collection); }
/// <summary> /// Gets the batch process list. /// </summary> /// <param name="workflowName">Name of the workflow.</param> /// <param name="batchProcessType">Type of the batch process.</param> /// <returns></returns> public virtual TaskList GetBatchProcessList(string workflowName, BatchProcessType batchProcessType) { StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService<IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); string stateName = string.Empty; ApprovalRole role = null; if (batchProcessType == BatchProcessType.Receive) { //获取操作为“接收”所在的状态名称 foreach (ApprovalState state in workflow.States) { foreach (ApprovalEvent approvalEvent in state.Events) { if (approvalEvent.Name == "接收") { role = WorkflowUtility.GetUserRoleByName(workflowName, approvalEvent.Roles[0].Name); stateName = state.Name; } } } } else if (batchProcessType == BatchProcessType.Approve) { //遍历工作流状态,找到下一状态为工作流终止状态的状态名 foreach (ApprovalState state in workflow.States) { foreach (ApprovalEvent approvalEvent in state.Events) { if (approvalEvent.NextStateNames != null && approvalEvent.NextStateNames.Length > 0 && approvalEvent.NextStateNames[0] == workflow.EndState) { role = WorkflowUtility.GetUserRoleByName(workflowName, approvalEvent.Roles[0].Name); stateName = state.Name; } } } } else throw new ArgumentException("batchProcessType"); ApprovalProcess process = CreateProcess(workflowName, role); //获取所有在该状态下的工作流实例 List<StateMachineWorkflowInstance> instanceList = process.GetList(new string[] { stateName }); return new TaskList("a." + batchProcessType.ToString(), new List<ITaskItem>(ItemProcessor.GenerateTaskTable(instanceList))); }
/// <summary> ///根据文件名读取工作流定义对象 /// </summary> /// <param name="app">The app.</param> /// <param name="fileName">Name of the file.</param> /// <returns></returns> private WorkFlowDefine ReadFromFile(WorkflowApplication app, string fileName) { StateMachineWorkflow stateMachine = new StateMachineWorkflow(); XmlSerializer xmlSerializer = new XmlSerializer(typeof(StateMachineWorkflow)); using (XmlReader reader = XmlReader.Create(fileName)) { stateMachine = (StateMachineWorkflow)xmlSerializer.Deserialize(reader); } string errorMsg; if (!stateMachine.Validate(out errorMsg)) { throw new ApplicationException(errorMsg); } //设置其应用程序对象 stateMachine.Application = app; return(stateMachine); }
/// <summary> /// 获取指定工作流、角色、时间段的实例集合 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userIdentity">用户身份</param> /// <param name="role">审批角色</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> protected override InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate) { InstanceCollection instances = new InstanceCollection(); StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); //遍历工作流中的每一个状态,获取可以处理的状态对应的实例. List <string> canDoStates = new List <string>(); foreach (ApprovalState oneState in workflow.States) { if (oneState.IsApprovalState && InstanceDistillerHelper.IsMineICanDo(oneState, role)) { canDoStates.Add(oneState.Name); } } if (canDoStates.Count == 0) { return(instances); } string unitCode = userIdentity.GetUserUnitCode(); unitCode = string.IsNullOrEmpty(unitCode)?" ":(unitCode.Trim() + "%"); List <StateMachineWorkflowInstance> list = WorkflowRuntime.Current.GetUnitList(workflowName, canDoStates.ToArray(), unitCode); //获取指定给本单位办理的实例 foreach (StateMachineWorkflowInstance instance in list) { if (instance.PersistTime >= startDate && instance.PersistTime <= endDate) { instances.Add(new InstanceWithRole(instance, role, true)); } } return(instances); }
/// <summary> /// Gets all roles. /// </summary> /// <param name="workflowName">Name of the workflow.</param> /// <returns></returns> public static List <ApprovalRole> GetAllWorkflowRoles(string workflowName) { StateMachineWorkflow workflow = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName); return(new List <ApprovalRole>(workflow.Roles)); }
/// <summary> /// Gets the name of the user role by. /// </summary> /// <param name="define">The define.</param> /// <param name="roleName">Name of the role.</param> /// <returns></returns> public static ApprovalRole GetUserRoleByName(WorkFlowDefine define, string roleName) { StateMachineWorkflow workflow = define as StateMachineWorkflow; return(workflow.GetRoleByName(roleName)); }