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

C# EA插件如何拦截已审批元素修改并获取修改前状态

EA插件阻止已批准元素修改的解决方案

针对你需要拦截状态为"Approved"的元素修改,同时获取修改前后状态的需求,有两种可行的实现方式:

方法一:利用EA_OnPreCommit预提交事件

这个事件会在所有修改提交到数据库前触发,能直接获取到每个字段的新旧值,是最可靠的拦截方式。

public virtual void EA_OnPreCommit(Repository repository, ref bool IsCanceled)
{
    // 获取所有待提交的变更记录
    var pendingChanges = repository.GetProjectInterface().GetPendingChanges();
    
    foreach (var change in pendingChanges)
    {
        // 只处理元素的状态字段变更
        if (change.Type.Equals("Element", StringComparison.OrdinalIgnoreCase) && 
            change.Field.Equals("Status", StringComparison.OrdinalIgnoreCase))
        {
            // 获取修改前后的状态值
            string oldStatus = change.OldValue;
            string newStatus = change.NewValue;
            
            // 规则1:原状态为Approved时,禁止任何修改
            if (oldStatus == "Approved")
            {
                IsCanceled = true;
                repository.ShowMessage("无法修改状态为「Approved」的元素,请先变更状态再操作。");
                break;
            }
            
            // 规则2:仅允许从Implemented状态切换到Approved(可根据需求调整)
            if (newStatus == "Approved" && oldStatus != "Implemented")
            {
                IsCanceled = true;
                repository.ShowMessage("仅状态为「Implemented」的元素可设置为「Approved」。");
                break;
            }
        }
    }
}

方法二:缓存元素原始状态

通过EA_OnContextItemChanged记录当前选中元素的状态,在EA_OnContextItemModified触发时对比新旧状态,适合单元素修改的场景。

// 全局变量缓存当前选中元素的原始状态
private string _currentElementStatus;

public virtual void EA_OnContextItemChanged(Repository repository, string guid, ObjectType ot)
{
    if (ot == ObjectType.otElement && repository != null)
    {
        var element = repository.GetElementByGuid(guid);
        _currentElementStatus = element.Status;
    }
}

public virtual void EA_OnContextItemModified(Repository repository, string guid, ObjectType ot)
{
    if (ot == ObjectType.otElement && repository != null)
    {
        var element = repository.GetElementByGuid(guid);
        string newStatus = element.Status;
        
        // 原状态为Approved时禁止修改
        if (_currentElementStatus == "Approved")
        {
            throw new Exception("无法修改状态为「Approved」的元素,请先变更状态再操作。");
        }
        
        // 仅允许从Implemented切换到Approved
        if (newStatus == "Approved" && _currentElementStatus != "Implemented")
        {
            throw new Exception("仅状态为「Implemented」的元素可设置为「Approved」。");
        }
        
        // 更新缓存为最新状态
        _currentElementStatus = newStatus;
    }
}

两种方法对比

  • EA_OnPreCommit:覆盖所有提交场景(包括批量修改、脚本修改),拦截更全面,但需要遍历所有变更记录。
  • 缓存状态:仅针对当前选中的元素,逻辑更简单,但无法拦截批量修改或非UI触发的修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:10:24