/// <summary> /// Renders the specified task lists. /// </summary> /// <param name="taskLists">The task lists.</param> /// <param name="mergeRoles">if set to <c>true</c> [merge roles].</param> /// <returns></returns> private string Render(Dictionary <string, TaskListCollection> taskLists, bool mergeRoles) { Dictionary <TaskDistiller, TaskListCollection> distillers = new Dictionary <TaskDistiller, TaskListCollection>(); //按角色分别呈现角色对应的任务列表 StringBuilder sb = new StringBuilder(); if (mergeRoles) { TaskDistiller distiller = null; TaskListCollection list = new TaskListCollection(); foreach (string roleName in taskLists.Keys) { distiller = GetRoleDistiller(roleName); list.AddRange(taskLists[roleName]); } sb.Append(distiller.Render.TaskListsToHtml(list.ToArray())); } else { foreach (string roleName in taskLists.Keys) { TaskDistiller distiller = GetRoleDistiller(roleName); //合并呈现 sb.Append(distiller.Render.TaskListsToHtml(taskLists[roleName].ToArray())); } } return(sb.ToString()); }
private TaskDistiller InitTaskDistiller(RoleConfigItem config) { TaskDistiller taskDistiller = new TaskDistiller(); List <InstanceDistiller> distillers = new List <InstanceDistiller>(); if (config.Distillers != null && config.Distillers.Length != 0) { //遍历每个实例提取者并加入提取者集合 foreach (TypeItem item in config.Distillers) { InstanceDistiller distiller = (InstanceDistiller)ConfigurationHelper.LoadType(item); if (distiller == null) { throw new ConfigurationErrorsException(string.Format("{0} isn't the type IInstanceDistiller", item.Type)); } distillers.Add(distiller); } } taskDistiller.InstanceDistillers = distillers.ToArray(); //遍历每个过滤器并加入过滤器集合 List <InstanceFilter> filters = new List <InstanceFilter>(); if (config.Filters != null && config.Filters.Length != 0) { foreach (TypeItem item in config.Filters) { InstanceFilter filler = (InstanceFilter)ConfigurationHelper.LoadType(item); if (filler == null) { throw new ConfigurationErrorsException(string.Format("{0} isn't the type IInstanceFilter", item.Type)); } filters.Add(filler); } } taskDistiller.Filters = filters.ToArray(); //实例化任务项目提取器 if (config.TaskItemDistiller != null) { object obj = ConfigurationHelper.LoadType(config.TaskItemDistiller); if (obj.GetType().GetInterface(typeof(ITaskItemDistiller).Name) == null) { throw new TypeLoadException(string.Format("Type \"{0}\" does not implement interface ITaskItemDistiller", obj.GetType().FullName)); } taskDistiller.ItemDistiller = (ITaskItemDistiller)obj; } //实例化呈现器 if (config.TaskRender != null) { object obj = ConfigurationHelper.LoadType(config.TaskRender); if (obj.GetType().GetInterface(typeof(ITaskRender).Name) == null) { throw new TypeLoadException(string.Format("Type \"{0}\" does not implement interface ITaskRender", obj.GetType().FullName)); } taskDistiller.Render = (ITaskRender)obj; } return(taskDistiller); }
/// <summary> /// 获取角色和对应实例集合的键-值对 /// </summary> /// <param name="workflowName">流程名称</param> /// <param name="userId">用户Id</param> /// <param name="roleName">角色名称</param> /// <param name="startDate">时间段起始时间</param> /// <param name="endDate">时间段截止时间</param> /// <returns></returns> private InstanceCollection DistillInstances(string workflowName, string userId, string roleName, DateTime startDate, DateTime endDate) { IUserIdentity userIdentity = identityService.GetUserIdentity(userId); //获取流程对应的审批角色对象,并从角色-提取者字典中获取角色对应的提取者 InstanceCollection instances = new InstanceCollection(); ApprovalRole role = WorkflowUtility.GetUserRoleByName(workflowName, roleName); if (role != null) { //用户不在该角色 if (!userInRole.IsUserInRole(userIdentity.GetUserId(), role.Name)) { throw new ApplicationException(string.Format("{0} is not in role {1}", userIdentity.GetUserId(), role.Name)); } //取得角色的任务提取器 TaskDistiller distiller = GetRoleDistiller(roleName); instances.AddRange(distiller.Distill(workflowName, userIdentity, role, startDate, endDate)); } return(instances); }
/// <summary> /// 将角色-实例集合转化为用户的任务列表 /// </summary> /// <param name="userId">用户Id.</param> /// <param name="instances">角色-实例集合.</param> /// <returns></returns> private Dictionary <string, TaskListCollection> ConvertToTasklists(string userId, InstanceCollection instances) { Dictionary <string, TaskListCollection> taskLists = new Dictionary <string, TaskListCollection>(); IUserIdentity userIdentity = identityService.GetUserIdentity(userId); List <ApprovalRole> allRoles = instances.GetAllRoles(); //按角色分别呈现角色对应的任务列表 foreach (ApprovalRole role in allRoles) { InstanceCollection c = instances.GetByRole(role); TaskListCollection lists = new TaskListCollection(); //获取该角色对应的提取器对象 TaskDistiller distiller = GetRoleDistiller(role.Name); distiller.ForRole = role; if (distiller.ItemDistiller is IInitializableDistiller) { ((IInitializableDistiller)(distiller.ItemDistiller)).Initialize(role, c); } List <InstanceCollection> collection = c.SplitByEaId(); foreach (InstanceCollection one in collection) { List <ITaskItem> items = new List <ITaskItem>(); ITaskItem taskItem = distiller.ItemDistiller.Distill(one, userIdentity); items.Add(taskItem); TaskList list = new TaskList(one.TaskName, items); //给任务列表名称赋值 if (!string.IsNullOrEmpty(this.taskName)) { list.Cagegory = this.taskName; } lists.Merge(list); } taskLists.Add(role.Name, lists); } return(taskLists); }
/// <summary> /// Creates a new object that is a copy of the current instance. /// </summary> /// <returns> /// A new object that is a copy of this instance. /// </returns> internal TaskDistiller Clone() { TaskDistiller distiller = new TaskDistiller(); List <InstanceDistiller> distillers = new List <InstanceDistiller>(); foreach (InstanceDistiller o in InstanceDistillers) { distillers.Add(o.Clone()); } distiller.InstanceDistillers = distillers.ToArray(); if (Filters != null) { List <InstanceFilter> filters = new List <InstanceFilter>(); foreach (InstanceFilter filter in Filters) { filters.Add(filter.Clone()); } distiller.Filters = filters.ToArray(); } distiller.ItemDistiller = ItemDistiller; distiller.Render = Render; return(distiller); }
/// <summary> /// 从RoleConfg项目中生成服务 /// </summary> /// <param name="config">The config.</param> /// <param name="applicationName">此TaskService实例对应的应用名称.</param> internal TaskService(ServiceConfig config, string applicationName) : this() { //获取该应用的所有工作流名称. IWorkFlowDefinePersistService defineService = WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>(); this.workflowNames = defineService.GetAllWorkflowDefineName(applicationName); this.taskName = config.TaskName; this.name = config.Name; this.mergeRoles = config.AllMerge; if (config.DefaultItem == null) { throw new ConfigurationErrorsException(string.Format("Cann't found Default roleConfig!")); } this.defaultDistiller = InitTaskDistiller(config.DefaultItem); if (defaultDistiller.InstanceDistillers == null) { throw new ConfigurationErrorsException(string.Format("default distillers \"{0}\" can not be empty!", config.Name)); } if (defaultDistiller.Filters == null) { throw new ConfigurationErrorsException(string.Format("default filters \"{0}\" can not be empty!", config.Name)); } if (defaultDistiller.ItemDistiller == null) { throw new ConfigurationErrorsException(string.Format("default itemDistiller \"{0}\" is not exist!", config.Name)); } if (defaultDistiller.Render == null) { throw new ConfigurationErrorsException(string.Format("default taskRender \"{0}\" is not exist!", config.Name)); } distillersMap = new Dictionary <string, TaskDistiller>(); if (config.Items != null && config.Items.Length > 0) { //遍历每个角色配置项目生成提取者,如果提取者 foreach (RoleConfigItem item in config.Items) { TaskDistiller distiller = InitTaskDistiller(item); //如果提取者集合为空,则使用缺省提取者集合 if (distiller.InstanceDistillers == null || distiller.InstanceDistillers.Length == 0) { distiller.InstanceDistillers = defaultDistiller.InstanceDistillers; } //如果过滤器为空,则使用缺省过滤器集合 if (distiller.Filters == null || distiller.Filters.Length == 0) { distiller.Filters = defaultDistiller.Filters; } if (distiller.ItemDistiller == null) { distiller.ItemDistiller = defaultDistiller.ItemDistiller; } if (distiller.Render == null) { distiller.Render = defaultDistiller.Render; } if (string.IsNullOrEmpty(item.Name)) { throw new ConfigurationErrorsException(""); } //把角色字串拆解为角色数组 string[] o = item.Name.Split(";,;,".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); //添加到角色-提取器字典中 foreach (string s in o) { if (!distillersMap.ContainsKey(s)) { distillersMap[s] = distiller; } } } } //校验角色字典,对不存在角色抛出异常 List <string> roles = new List <string>(WorkflowUtility.GetAllRoles(applicationName)); foreach (string key in distillersMap.Keys) { if (!roles.Contains(key)) { throw new ConfigurationErrorsException(string.Format("There isn't a role called '{0}' in workflow's definiton files", key)); } } }