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

TFS 11 2012 API问题:查询容量和休息日,tfs,tfs-sdk,Tfs,Tfs Sdk,我需要用TFSAPI完成一些事情。其中,我必须阅读每个项目的sprint的资源规划信息,以显示在wpfui中 现在,我有以下方法: private TfsTeamService _teamService; private ICommonStructureService4 _structureService; TeamSettingsConfigurationService _teamSettingsConfigurationService; public voi

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

现在,我有以下方法:

    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);
                        }
                    }
                }
            }
        }
    }
private TfsTeamService\u teamService;
专用ICommonStructureService4_structureService;
团队设置配置服务\u团队设置配置服务;
public void GetUserIterationAssignments(IList项目)
{
foreach(项目中的ProjectInfo项目)
{
Console.WriteLine(项目名称);
TeamFoundationTeamTeam=_teamService.QueryTeams(project.Uri).First();
IList teamGuids=new List(){team.Identity.TeamFoundationId};
TeamConfiguration配置=_teamSettingsConfiguration服务.GetTeamConfigurations(teamGuids).FirstOrDefault();
如果(配置!=null)
{
foreach(config.TeamSettings.IterationPath中的字符串nodePath)
{
var projectNameIndex=nodePath.IndexOf(“\\”,2);
var fullPath=nodePath.Insert(projectNameIndex,\\迭代);
var nodeInfo=\u structureService.GetNodeFromPath(完整路径);
如果(nodeInfo.StartDate!=null&&
nodeInfo.FinishDate!=null)
{
foreach(team.GetMembers(_collection,MembershipQuery.Direct))中的TeamFoundationIdentity成员
{
WriteLine({0}是从{2}分配给{1}),
member.DisplayName,
nodeInfo.Name,
nodeInfo.StartDate,
nodeInfo.FinishDate);
}
}
}
}
}
}
我需要打印到Console(当然仅此示例)的是Capacity视图中显示的大部分信息:

更准确地说,我需要访问

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

关于如何做到这一点有什么想法吗?

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

内部TeamCapacity GetTeamIterationCapacity(Guid teamId,Guid iterationId)

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

程序集:
Microsoft.TeamFoundation.Server.WebAccess.WorkItemTracking.Common,版本=12.0.0.0

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

json服务似乎正在使用请求验证,这使得它很难从任何外部系统使用

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


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

您需要的特定值位于(假设您使用的是DefaultCollection)

  • [Tfs\u DefaultCollection].[dbo].[tbl\u TeamConfigurationCapacity]
  • [Tfs\u DefaultCollection].[dbo].[tbl\u TeamConfigurationCapacityDaysOffRange]
它们通过guid引用迭代和用户

  • 迭代guid可以在
    [Tfs\u Warehouse].[dbo].[dimitation]
  • 通过搜索
    [Tfs_配置].[dbo].[tbl_标识]
下面是一个快速示例,用于查询我在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_团队配置CapacityDaysofFrange中读取每个假日的开始/结束日期范围。然而,这有点复杂,因为有团队休息日和个人休息日

下面是我用来实现这一点的查询。(这似乎是可行的,尽管在为我们所有的用户工作了6个月之后,我们的一个用户突然从查询中消失了,我发现没有明显的原因,我现在需要在IdentityMap表中查找他的ID。来自未记录来源的反向工程的乐趣:-(


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

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


试试看是的,我已经试过了。上面的代码是基于Shai的工作。不幸的是,他没有达到能力。不确定你是否找到了答案,但我做了一些挖掘,发现c
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')