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

如何在APInvoiceEntry与JournalEntry扩展类添加自定义操作至操作菜单

APInvoiceEntry与JournalEntry自定义操作添加到Action菜单的实现方案

不需要在扩展类中自行实现IActionsMenuGraph接口,框架提供了两种通用合规的实现方式,适配所有PXGraph派生类,不存在版本兼容或逻辑覆盖风险。

方案1:声明式特性挂载(官方推荐,适用于Acumatica 2021 R1及以上版本)

直接在自定义Action上标注PXAddMenuAttribute,框架初始化时会自动将Action注入对应菜单,完全不依赖基类的接口实现,代码最简洁,也符合官方开发规范。

  • APInvoiceEntry扩展示例:
public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry>
{
    public PXAction<APInvoice> ChangeSomeField;

    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Change Some Field", MapEnableRights = PXCacheRights.Update)]
    // 核心配置:指定挂载到当前图的Action菜单
    [PXAddMenu(typeof(APInvoiceEntry), nameof(Actions), MenuType = MenuType.Action)]
    protected virtual IEnumerable changeSomeField(PXAdapter adapter)
    {
        // 此处编写字段修改的业务逻辑
        if (Base.Document.Current != null)
        {
            APInvoice doc = Base.Document.Current;
            // 自定义字段赋值、持久化逻辑
            Base.Document.Update(doc);
            Base.Persist();
        }
        return adapter.Get();
    }
}
  • JournalEntry扩展示例:
public class JournalEntryExt : PXGraphExtension<JournalEntry>
{
    public PXAction<Batch> ChangeSomeField;

    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Change Some Field", MapEnableRights = PXCacheRights.Update)]
    [PXAddMenu(typeof(JournalEntry), nameof(Actions), MenuType = MenuType.Action)]
    protected virtual IEnumerable changeSomeField(PXAdapter adapter)
    {
        // 此处编写字段修改的业务逻辑
        return adapter.Get();
    }
}

方案2:初始化方法手动注册(适用于所有Acumatica版本)

如果使用的是2021 R1之前的旧版本,可以在图扩展的Initialize方法中,直接调用Base.Actions集合自带的AddMenuAction方法完成注册。

误区澄清:认为只有实现了IActionsMenuGraph的类才能调用AddMenuAction是认知偏差——AddMenuAction本质是定义在PXActionsCollection类型上的扩展方法,所有PXGraph的Actions集合都支持直接调用,和图本身是否实现IActionsMenuGraph无关。ARInvoiceEntry基类封装的ActionsMenuItem.AddMenuAction()只是上层的快捷封装,底层调用的是同一个集合方法。

对应JournalEntry的实现示例:

public class JournalEntryExt : PXGraphExtension<JournalEntry>
{
    public PXAction<Batch> ChangeSomeField;

    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Change Some Field")]
    protected virtual IEnumerable changeSomeField(PXAdapter adapter)
    {
        // 业务逻辑
        return adapter.Get();
    }

    public override void Initialize()
    {
        base.Initialize();
        // 直接调用Actions集合的扩展方法添加菜单
        Base.Actions.AddMenuAction(ChangeSomeField);
        // 如需调整菜单位置,可调用AddMenuAction的重载参数指定排序、父菜单节点
    }
}

禁止实现方案

不要在图扩展中自行实现IActionsMenuGraph接口:该接口的框架内部实现依赖专属的菜单初始化管线,在扩展类中重写实现会覆盖原生菜单加载逻辑,导致系统原有操作菜单项丢失、角色权限配置失效、菜单顺序错乱等兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:54:19