You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ADO中如何将子用户故事的Story Points汇总至Feature的Total Effort字段?

解决方案:Azure DevOps中Feature自动汇总子用户故事的Story Points到Total Effort字段

以下是几个稳定可行的方案,替代不稳定的Rollup Field插件和无效的内置规则:

1. 基于REST API + Azure Pipeline的自动化同步

这是最可控、稳定的方案,通过脚本调用ADO API实现计算和更新,支持定时或事件触发。

实现步骤:

  • 创建一个Azure Pipeline,选择PowerShell任务(或Bash)
  • 编写脚本完成以下逻辑:
    1. 查询所有目标Feature工作项
    2. 遍历每个Feature,查询其下所有子用户故事的Story Points
    3. 累加计算总和,更新Feature的Total Effort字段
  • 设置触发规则:可以定时同步(比如每日凌晨),或绑定ADO事件(用户故事更新时触发)

核心脚本示例(PowerShell):

# 配置参数
$orgUrl = "https://dev.azure.com/你的组织名"
$projectName = "你的项目名"
$pat = "你的PAT令牌(需具备工作项读写权限)"
$headers = @{Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat"))}
# 替换为你的Total Effort字段的实际引用名
$totalEffortField = "Custom.TotalEffort"

# 1. 查询所有未关闭的Feature
$wiqlFeature = @"
SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Feature' AND [System.State] <> 'Closed'
"@
$queryBody = @{query = $wiqlFeature} | ConvertTo-Json
$queryUrl = "$orgUrl/$projectName/_apis/wit/wiql?api-version=7.1-preview.2"
$features = Invoke-RestMethod -Uri $queryUrl -Method Post -Headers $headers -Body $queryBody -ContentType "application/json"

foreach ($feature in $features.workItems) {
    # 2. 查询当前Feature下的所有用户故事
    $wiqlChild = @"
    SELECT [System.Id], [Microsoft.VSTS.Scheduling.StoryPoints] FROM WorkItems 
    WHERE [System.WorkItemType] = 'User Story' AND [System.Parent] = $($feature.id)
    "@
    $childBody = @{query = $wiqlChild} | ConvertTo-Json
    $childItems = Invoke-RestMethod -Uri $queryUrl -Method Post -Headers $headers -Body $childBody -ContentType "application/json"

    # 3. 计算Story Points总和
    $total = 0
    foreach ($child in $childItems.workItems) {
        $childUrl = "$orgUrl/$projectName/_apis/wit/workitems/$($child.id)?api-version=7.1-preview.3"
        $childDetail = Invoke-RestMethod -Uri $childUrl -Headers $headers
        $points = $childDetail.fields["Microsoft.VSTS.Scheduling.StoryPoints"]
        if ($points) { $total += [int]$points }
    }

    # 4. 更新Feature的Total Effort字段
    $updateBody = @(
        @{
            op = "replace"
            path = "/fields/$totalEffortField"
            value = $total
        }
    ) | ConvertTo-Json
    $updateUrl = "$orgUrl/$projectName/_apis/wit/workitems/$($feature.id)?api-version=7.1-preview.3"
    Invoke-RestMethod -Uri $updateUrl -Method Patch -Headers $headers -Body $updateBody -ContentType "application/json-patch+json"
}

注意事项:

  • 确保PAT拥有工作项读取和编辑权限
  • 替换脚本中的组织名、项目名、字段引用名
  • 若需要实时同步,可配置Pipeline由ADO事件触发(比如用户故事的Story Points字段变更时)

2. 使用Azure Logic Apps实现低代码自动化

无需编写复杂脚本,通过可视化配置实现实时同步:

配置步骤:

  1. 创建新的Logic App,选择「当Azure DevOps工作项更新时」作为触发条件
  2. 添加筛选规则:仅触发用户故事类型且Story Points字段变更的事件
  3. 添加动作:获取当前用户故事的父Feature
  4. 添加动作:查询该Feature下所有子用户故事的Story Points
  5. 添加动作:计算总和,更新Feature的Total Effort字段

优势:无需维护脚本,配置简单,支持触发后立即同步,适合非开发人员操作。

3. 优化内置工作项规则(结合外部服务)

如果坚持使用ADO内置规则,可通过以下方式补全逻辑:

  • 在用户故事上设置规则:当Story Points变更或父链接变更时,调用Azure Function/Logic App触发父Feature的总和计算
  • 避免仅依赖内置规则的字段更新(内置规则无法直接跨工作项计算总和,必须结合外部服务)

4. 插件问题排查(若仍想使用Rollup Field)

如果之前的Rollup Field插件不稳定,可尝试:

  • 检查插件版本,更新至最新版
  • 调整插件配置:设置同步间隔为更短的时间,排除已关闭的工作项
  • 确认插件的服务主体拥有足够的工作项权限

内容的提问来源于stack exchange,提问作者Krishna Punekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:25:08