【问题标题】:TFS 11 2012 API Questions : query capacity and days offTFS 11 2012 API 问题:查询容量和休息日
【发布时间】:2012-12-09 01:12:35
【问题描述】:

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

跟着@​​987654321@打标签,我现在有如下方法:

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

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

更准确地说,我需要访问

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

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

【问题讨论】:

  • 是的,我已经试过了。上面的代码是基于 Shai 的工作。不幸的是,他没有发挥作用。
  • 不确定你是否找到了这个问题的答案,但我做了一些挖掘,发现容量和休息日(对于成员和团队)可以在集合数据库中找到表tbl_TeamConfigurationCapacitytbl_TeamConfigurationCapacityDaysOffRange。但是,我没有在 TFS SDK 中找到它 :(
  • 谢谢詹姆斯,我已经找到了。你对 API 的看法似乎是对的,真可惜....

标签: tfs tfs-sdk


【解决方案1】:

这不是一个受支持的方法,如果你升级到新版本的 TFS 可能会中断,但如果你只想读取数据,你可以直接进入 SQL 数据库用于您的 TFS 服务器。

您需要的具体值在(假设您使用的是 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')

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 非常有帮助。 1 个更改是使容量字段为小数
    【解决方案3】:

    这些值只能从服务器对象模型中获得(目前没有等效的客户端对象模型)。接口和对象都是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) 或直接从 James Tupper 提到的表中的 ProjectCollection 数据库中获取。

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

    必填免责声明

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

    【讨论】:

    • 感谢 jesse,这意味着 - 目前 - 这部分没有什么新东西。
    • 只是想我现在要补充的是答案。
    • 你是对的,所以虽然新的 TFS 版本可能会为客户端对象模型带来更多功能,但这个答案对于当前版本仍然适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多