TFS二次开发系列:八、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(二)
上一篇文章我们编写了此例的DTO层,本文将数据访问层封装为逻辑层,提供给界面使用。
1.获取TFS Dto实例,并且可以获取项目集合,以及单独获取某个项目实体
public static TFSServerBll Instance = new TFSServerBll(); public TFSServerDto dto; public TFSServerBll() { dto = new TFSServerDto("http://server:8080/tfs/Project/"); } public TFSServerBll(string TfsUri) { dto = new TFSServerDto(TfsUri); } /// <summary> /// 获取项目集合 /// </summary> /// <returns></returns> public ProjectCollection GetProjectList() { return dto.GetProjectList(); } //根据projectId获取Project实体 public Project GetProject(int projectId) { return dto.GetProject(projectId); }
2.根据规则获取项目的PBI/Bug等信息
/// <summary> /// 获取项目的所有数据 /// </summary> /// <param name="project"></param> public void GetProjectInfo(Project project) { TfsSprint projectSprint = GetSprintInfo(project.Uri.ToString()); GetProjectSprintPBIandBUG(projectSprint, project); } /// <summary> /// 获取某项目所有Sprint的PBI和BUG /// </summary> /// <param name="projectSprint"></param> /// <param name="project"></param> public void GetProjectSprintPBIandBUG(TfsSprint projectSprint, Project project) { IEnumerable<ScheduleInfo> list = GetFinalBugInfo(project); foreach (Sprint sprint in projectSprint.SprintList) { sprint.PBIInfo = GetSimplePbi(project.Name, sprint.SprintPath); if (list.Count() > 0) { foreach (ScheduleInfo info in list) { if (info.Path == sprint.SprintPath) { sprint.BugInfo = new TfsBug() { New = info.NewBug, Done = info.Closed, opening = info.OpenBug }; break; } } } else { sprint.BugInfo = new TfsBug() { New = 0, Done = 0, opening =0 }; } } string s = ""; } private TfsPBI GetSimplePbi(string projectName, string IterationSprint) { WorkItemCollection total = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[Iteration Path]='" + IterationSprint + "'"); WorkItemCollection doneCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Done' and [Iteration Path]='" + IterationSprint + "'"); double totaleffort = GetPBIEffort(total); double doneeffort = GetPBIEffort(doneCollection); double effortPercent = doneeffort / totaleffort; TfsPBI pbiinfo = new TfsPBI() { Total = total.Count, Done = doneCollection.Count, EffoctPercent = effortPercent, EffoctCurrent = (int)doneeffort, EffoctTotal = (int)totaleffort }; return pbiinfo; } private TfsBug GetSimpleBug(string projectName, string IterationSprint) { WorkItemCollection total = dto.GetWorkItemCollection("Bug", projectName, "[Iteration Path]='" + IterationSprint + "'"); WorkItemCollection NewCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='New' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection doneCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Done' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection RemovedCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Removed' and [Iteration Path]='" + IterationSprint + "'"); TfsBug buginfo = new TfsBug() { Total = total.Count, New = NewCollection.Count, Done = doneCollection.Count, Removed=RemovedCollection.Count }; return buginfo; }
3.另外一些获取Bug/PBI信息的组成方式
/// <summary> /// 获得某项目的BUG数量信息 /// </summary> /// <param name="projectName"></param> /// <returns></returns> public TfsBug GetBugInfo(string projectName, string IterationSprint) { WorkItemCollection bugCollection = dto.GetWorkItemCollection("Bug", projectName, "[Iteration Path]='" + IterationSprint + "'"); WorkItemCollection bugNewCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='New' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection bugApprovedCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Approved' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection bugCommittedCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Committed' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection bugDoneCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Done' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection bugRemovedCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Removed' and [Iteration Path]='" + IterationSprint + "'"); TfsBug buginfo = new TfsBug() { Total = bugCollection.Count, New = bugNewCollection.Count, Approved = bugApprovedCollection.Count, Committed = bugCommittedCollection.Count, Done = bugDoneCollection.Count, Removed = bugRemovedCollection.Count }; return buginfo; } /// <summary> /// 获取整个项目的PBI信息 /// </summary> /// <param name="projectName"></param> /// <returns></returns> public ProjectView GetAllInfo(String projectName) { WorkItemCollection total = dto.GetWorkItemCollection("Product Backlog Item", projectName, string.Empty); WorkItemCollection doneCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Done'"); WorkItemCollection RemovedCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Removed'"); double totaleffort = GetPBIEffort(total); double doneeffort = GetPBIEffort(doneCollection); double removedeffort = GetPBIEffort(RemovedCollection); double effortPercent = 0; if(totaleffort!=0) effortPercent = doneeffort / totaleffort; WorkItemCollection RiskOpenCollection = dto.GetWorkItemCollection("Impediment", projectName, "[State]='Open'"); int riskopenCount = RiskOpenCollection.Count; WorkItemCollection totalBug = dto.GetWorkItemCollection("Bug", projectName, string.Empty); WorkItemCollection doneCollectionBug = dto.GetWorkItemCollection("Bug", projectName, "[State]='Done'"); WorkItemCollection RemovedCollectionBug = dto.GetWorkItemCollection("Bug", projectName, "[State]='Removed'"); int openbugCount = totalBug.Count - doneCollectionBug.Count - RemovedCollectionBug.Count; ProjectView view = new ProjectView() { PbiPercent = effortPercent, OpenBugCount = openbugCount, OpenRiskCount = riskopenCount, TotalPbiEffort = totaleffort}; return view; } /// <summary> /// 获得某项目的PBI数量信息 /// </summary> /// <param name="projectName"></param> /// <returns></returns> public TfsPBI GetPBIInfo(string projectName, string IterationSprint) { WorkItemCollection total = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[Iteration Path]='" + IterationSprint + "'"); WorkItemCollection newcollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='New' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection approvedCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Approved' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection committedCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Committed' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection doneCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Done' and [Iteration Path]='" + IterationSprint + "'"); WorkItemCollection removedCollection = dto.GetWorkItemCollection("Product Backlog Item", projectName, "[State]='Removed' and [Iteration Path]='" + IterationSprint + "'"); double totaleffort = GetPBIEffort(total); double doneeffort=GetPBIEffort(doneCollection); double effortPercent = doneeffort / totaleffort; TfsPBI pbiinfo = new TfsPBI() { Total = total.Count, New = newcollection.Count, Approved = approvedCollection.Count, Committed = committedCollection.Count, Done = doneCollection.Count, Removed = removedCollection.Count, EffoctPercent = effortPercent, EffoctCurrent=(int)doneeffort, EffoctTotal=(int)totaleffort }; return pbiinfo; } public double GetPBIEffort(WorkItemCollection collection) { double totalEff=0; foreach (WorkItem item in collection) { object o=item.Fields.GetById(10009).Value; if (o != null) totalEff += (double)o; } return totalEff; }
4.获取Sprint,Risk等信息集合
/// <summary> /// 获得某项目的Risk数量信息 /// </summary> /// <param name="projectName"></param> /// <returns></returns> public List<TfsRiskInfo> GetRiskInfo(string projectName) { WorkItemCollection RiskOpenCollection = dto.GetWorkItemCollection("Impediment", projectName, "[State]='Open'"); List<TfsRiskInfo> list = new List<TfsRiskInfo>(); foreach (WorkItem item in RiskOpenCollection) { list.Add(new TfsRiskInfo() { RiskInfo=item.Description, RiskStatus="Open",RiskId=item.Id.ToString()}); } return list; } /// <summary> /// 获取Sprint信息 /// </summary> /// <param name="projectUri"></param> /// <returns></returns> public TfsSprint GetSprintInfo(String projectUri) { TeamSettings setting= dto.GetSprintInfo(projectUri); TfsSprint tfssprint = new TfsSprint(); tfssprint.CurrentIterationPath=setting.CurrentIterationPath; tfssprint.SprintCount=setting.IterationPaths.Count(); IEnumerable<string> ea_items = from name in setting.IterationPaths.ToList() where name.Contains("Sprint") select name; List<Sprint> list = new List<Sprint>(); foreach (string path in ea_items) { string sprintnum = path.Substring(path.LastIndexOf("Sprint") + 6).Trim(); string sprintname ="Sprint "+sprintnum; if(!string.IsNullOrEmpty(sprintnum)) list.Add(new Sprint() { SprintName = sprintname, SprintNum = int.Parse(sprintnum), SprintPath = path }); } list.Sort((x, y) => x.SprintNum - y.SprintNum); tfssprint.SprintList = list; return tfssprint; } public IEnumerable<ScheduleInfo> GetSprintDate(string projectUri) { return dto.GetIterationDates(projectUri); } /// <summary> /// 获取团队成员信息 /// </summary> /// <param name="projectUri"></param> /// <returns></returns> public List<TfsMember> GetMemberInfo(String projectUri) { var list=new List<TfsMember>(); var members=dto.GetMemberInfo(projectUri); foreach (TeamFoundationIdentity member in members) { var m = new TfsMember() { UserName=member.DisplayName,UserSimpleName=member.UniqueName.Substring(member.UniqueName.IndexOf('\\')+1)}; list.Add(m); } return list; } public IEnumerable<ScheduleInfo> GetFinalBugInfo(Project project) { IEnumerable<ScheduleInfo> sprintlist = GetSprintDate(project.Uri.ToString()); int newbug = 0; int openbug = 0; int closed = 0; int Totalbug = 0; foreach (ScheduleInfo info in sprintlist) { TfsBug bug = GetSingleBug(project.Name, info.StartDate,info.EndDate); info.NewBug = bug.New; info.Closed = bug.Done; Totalbug += bug.New; openbug = Totalbug - info.Closed; info.OpenBug = openbug; } return sprintlist; } private TfsBug GetSingleBug(string projectName,DateTime? createdate,DateTime? enddate) { WorkItemCollection total = dto.GetWorkItemCollection("Bug", projectName, "[Created Date]>'" + createdate + "' and [Closed Date]<'"+enddate+"'"); WorkItemCollection NewCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='New' and [Created Date]>'" + createdate + "' and [Closed Date]<'" + enddate + "'"); WorkItemCollection doneCollection = dto.GetWorkItemCollection("Bug", projectName, "[State]='Done' and [Created Date]>'" + createdate + "' and [Closed Date]<'" + enddate + "'"); TfsBug buginfo = new TfsBug() { Total = total.Count, New = NewCollection.Count, Done = doneCollection.Count }; return buginfo; }
5.通过以上代码的封装,我们可以得到知己展示于前台的TFS数据展示。