TFS 11 2012 API问题:查询容量和休假日

时间:2012-12-21 12:42:20

标签: tfs tfs2012 tfs-sdk

我需要使用TFS API完成一些事情。其中,我必须阅读每个项目的sprint的资源规划信息,以便在WPF UI中显示。

标记this guide,我现在有以下方法:

    private TfsTeamService _teamService;
    private ICommonStructureService4 _structureService;
    TeamSettingsConfigurationService _teamSettingsConfigurationService;

    public void GetUserIterationAssignments(IList<ProjectInfo> projects)
    {
        foreach (ProjectInfo project in projects)
        {
            Console.WriteLine(project.Name);

            TeamFoundationTeam team = _teamService.QueryTeams(project.Uri).First();
            IList<Guid> teamGuids = new List<Guid>() { team.Identity.TeamFoundationId };
            TeamConfiguration config = _teamSettingsConfigurationService.GetTeamConfigurations(teamGuids).FirstOrDefault();
            if (config != null)
            {
                foreach (string nodePath in config.TeamSettings.IterationPaths)
                {
                    var projectNameIndex = nodePath.IndexOf("\\", 2);
                    var fullPath = nodePath.Insert(projectNameIndex, "\\Iteration");
                    var nodeInfo = _structureService.GetNodeFromPath(fullPath);
                    if (nodeInfo.StartDate != null &&
                       nodeInfo.FinishDate != null)
                    {
                        foreach (TeamFoundationIdentity member in team.GetMembers(_collection, MembershipQuery.Direct))
                        {
                            Console.WriteLine("{0} is in assigned to {1} from {2}", 
                                                    member.DisplayName, 
                                                    nodeInfo.Name,
                                                    nodeInfo.StartDate,
                                                    nodeInfo.FinishDate);
                        }
                    }
                }
            }
        }
    }

我需要打印到控制台(当然只是为了这个例子)是容量视图中显示的大部分信息:

enter image description here

更确切地说,我需要访问

  • 每日容量
  • 休假(会员)
  • 休假(团队)

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:3)

它不是受支持的方法,如果您升级到较新版本的TFS,将来可能会中断,但如果您只想读取数据,则可以直接转到到TFS服务器的SQL数据库。

您需要的具体值(假设您正在使用DefaultCollection)

  • [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacity]
  • [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange]

这些通过GUID引用了迭代和用户。

  • 可以在[Tfs_Warehouse].[dbo].[DimIteration]
  • 中找到迭代GUID
  • 通过搜索[Tfs_Configuration].[dbo].[tbl_Identity]
  • 中的用户名/ SSID,可以找到用户GUID

这是一个快速示例,用于查询我在1月份迭代中每小时的容量:

select Capacity from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacity] as _cap
inner join [Tfs_Configuration].[dbo].[tbl_Identity] as _user
    on _user.[Id] = _cap.[TeamMemberId]
inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter
    on _iter.[IterationGUID] = _cap.[IterationId]
        where _iter.[IterationPath]='\Code\Current\401-Jan'
        and _user.[DisplayName]='Williams, Jason'

您可以使用类似的方法从tbl_TeamConfigurationCapacityDaysOffRange读取每个假日的开始/结束日期范围。然而,由于团队休假和个人休假,这有点复杂。

以下是我用来实现此目的的查询。 (它似乎有效,虽然在为所有用户工作6个月后,我们的一个用户突然从查询中消失了,我发现没有明显的原因我现在需要在IdentityMap表中查看他的ID。来自无证来源的逆向工程: - (

select [StartTime],[EndTime] from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange] as _cap1
    inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter1
      on _iter1.[IterationGUID] = _cap1.[IterationId]
          where _iter1.[IterationPath]='\Code\Current\401-Jan'
              and _cap1.[TeamMemberId]='00000000-0000-0000-0000-000000000000'
union
    select [StartTime],[EndTime] from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange] as _cap2
        inner join [Tfs_DefaultCollection].[dbo].[tbl_IdentityMap] as _map
            on _map.[localId] = _cap2.[TeamMemberId]
        inner join [Tfs_Configuration].[dbo].[tbl_Identity] as _user2
            on _user2.[Id] = _map.[masterId]
        inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter2
            on _iter2.[IterationGUID] = _cap2.[IterationId]
                where _iter2.[IterationPath]='\Code\Current\401-Jan'
                    and (_user2.[DisplayName]='Williams, Jason')

您只需要为提及迭代路径的两个地方以及要查询的用户名替换适当的值。

答案 1 :(得分:2)

还有另一种不支持的可能性。请访问网站http:// {tfs-server}:8080 / tfs / DefaultCollection / {project} / _backlogs / Capacity / {iterationpath}。后面的数据包含JSON格式的容量信息(团队容量数据)。

https://onedrive.live.com/redir?resid=88F0C013A4398D9B%21129

答案 2 :(得分:1)

这些值仅可从服务器对象模型获得(目前没有客户端对象模型等效)。接口和对象都是Internal,因此即使在服务器上也无法访问这些值。

  

internal TeamCapacity GetTeamIterationCapacity(Guid teamId, Guid iterationId);

     

声明类型:Microsoft.TeamFoundation.Server.WebAccess.WorkItemTracking.Common.DataAccess.TeamConfigurationComponent

     

汇编:Microsoft.TeamFoundation.Server.WebAccess.WorkItemTracking.Common, Version=12.0.0.0

目前获取数据的唯一方法是通过json服务(/tfs/{ProjectCollection}/{Team Project}/_api/_teamcapacity/updateteamcapacity/{Team}/{Iteration/Path}?__v=4),Team Capacity页面使用或直接来自James Tupper提到的表格中的ProjectCollection数据库。

看起来json服务正在使用请求验证,这使得任何外部系统都难以使用。

  

必填免责声明

     

TFS的服务器数据库不具有可扩展性,不支持对它们的任何直接查询,并且模型可以更改,恕不另行通知,即使在服务包之间也是如此。不支持直接查询TFS数据库。通过官方API之外的任何其他方式更改TFS数据库中的值将使您的TFS服务器处于不受支持的状态,并且在以后升级到较新版本时可能会导致重大问题。