TFS 插件 - 在未满足某些逻辑限制时阻止工作项保存



我们正在尝试在TFS服务器端插件中计算参数。我试图限制用户将PBI移动到Committed状态,除非他们的所有子任务在"剩余工作"字段下都有值。

这个基本逻辑是有效的,我可以遍历子项并获得所有值,无论是否存在。我不明白\完成的是,在任务的工作量为空值的情况下,如何防止"保存"操作。

if (taskswithoutrw.Count() != 0)
{
    permitted = false;
    TeamFoundationApplicationCore.Log("changedpermitted to false", 0, EventLogEntryType.Information);
    throw new Exception("Some tasks does not contain "Remaining Work" value");
}
else
{
    var tasks = childs.Where(x => TFStringComparer.WorkItemTypeName.Equals(x.Type.Name, Task));
    double workSum = 0;
    foreach (var task in tasks)
    {
        workSum += Convert.ToDouble(task.Fields["Remaining Work"].Value) / 6;
        TeamFoundationApplicationCore.Log("Remaining Work sum: " + workSum.ToString(), 0, EventLogEntryType.Information);
    }
    wi.Fields["Story Points"].Value = workSum.ToString();
    wi.Save();
}

如果在将EventNotificationStatus设置为ActionDenied 时引发异常

    catch (Exception ex)
    {
            // Log error (Should be logged to the windows event log by default)
            TeamFoundationApplicationCore.LogException(requestContext, "Exception occurd in ", ex);
            TeamFoundationApplicationCore.Log("outercatch", 0, EventLogEntryType.Information);
            statusCode = -1;
            return EventNotificationStatus.ActionDenied;
    }
 Method must return this value
 return EventNotificationStatus.ActionPermitted;

但这似乎不起作用,我是不是错过了什么?

您只需在工作项字段中添加REQUIRED规则即可避免零值。使用此规则,用户在为所有必需字段分配值之前,无法保存工作项。例如:

<FieldDefinition name="Effort" refname="Microsoft.VSTS.Scheduling.Effort" type="Double" reportable="measure">
  <REQUIRED />
  <HELPTEXT>The estimated effort to implemented the backlog item</HELPTEXT>
</FieldDefinition>

另一种方法是,如果field1的值为null,为了防止保存"工作项",请添加另一个字段field2,该字段将在field1值为null时填充。当filed1的值为null时,filed2的值无效,这将阻止保存工作项。

要实现PBI工作项的状态更改为Committed时的任务,您需要在"剩余工作"字段下查找子task工作项是否有值,然后禁用状态更改。为此,您需要捕获状态下拉列表的onChange事件:

1.添加一个将事件添加到工作项的方法AddEventHandler()

private void AddEventHandler()
        {
              workItem.FieldChanged += new WorkItemFieldChangeEventHandler (this.workItem_FieldChanged);
        }

2.在WorkItemDatasource属性中调用此方法

object IWorkItemControl.WorkItemDatasource
        {
            get
            {
                return workItem;
            }
            set
            {
                workItem = (WorkItem)value;
                AddEventHandler();
            }
        }

3.现在在workItem_FieldChanged方法中执行所需的功能。

根据您的要求,您需要确定更改后的字段是否为state,以及是否设置为Committed。这可以通过如下检查事件参数来实现。

(e.Field.Name == "State" && e.Field.Value.ToString() == "Committed")

一旦确保捕获了正确的事件,现在就要查找该工作项是否有子项。还要检查链接是否为子链接。然后检查"剩余工作量"字段下的值。

您可以查看此博客了解更多详细信息,这将对您有所帮助:http://www.codeproject.com/Articles/730928/Close-a-Work-Item-only-if-Child-Work-items-are-c

最新更新