5

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

沿着本指南标记,我现在有以下方法:

    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);
                        }
                    }
                }
            }
        }
    }

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

在此处输入图像描述

更准确地说,我需要访问

  • 日容量
  • 休息日(会员)
  • 休息日(团队)

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

4

3 回答 3

3

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

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

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

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

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

下面是一个快速示例,它查询我在 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')

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

于 2014-01-31T16:52:10.867 回答
2

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

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

于 2014-07-01T13:11:14.493 回答
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

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

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

必需的免责声明

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

于 2014-01-24T12:56:00.183 回答