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

如何重写ReleasePayments的Process All方法,拦截付款释放屏幕处理流程?

拦截Acumatica付款释放(Release Payments)流程的正确方式

1. 确认目标Graph与方法

Release Payments屏幕对应的后台逻辑类是APReleaseProcess(位于PX.Objects.AP命名空间下),核心处理方法为ReleasePayments。如果你的Graph扩展选错了目标类(比如误扩展了APPaymentEntry),自然找不到对应方法。

2. 正确编写Graph扩展代码

要拦截该流程,需针对APReleaseProcess创建Graph扩展,并重写ReleasePayments方法。注意要正确引用命名空间,且确保方法签名与原类完全一致:

using PX.Data;
using PX.Objects.AP;

public class APReleaseProcessExtension : PXGraphExtension<APReleaseProcess>
{
    public delegate void ReleasePaymentsDelegate(APPayment[] documents, bool isMassProcess);

    [PXOverride]
    public void ReleasePayments(APPayment[] documents, bool isMassProcess, ReleasePaymentsDelegate baseMethod)
    {
        // 执行释放前的自定义逻辑
        foreach (var doc in documents)
        {
            // 示例:打印待释放的付款文档编号
            PXTrace.WriteInformation($"即将释放付款文档:{doc.RefNbr}");
        }

        // 调用原有的释放逻辑
        baseMethod(documents, isMassProcess);

        // 执行释放后的自定义逻辑
        foreach (var doc in documents)
        {
            // 示例:标记释放完成的文档
            PXTrace.WriteInformation($"付款文档 {doc.RefNbr} 已释放");
        }
    }
}

3. 排查常见错误原因

  • 命名空间缺失:确保代码顶部引用了PX.Objects.AP,否则编译器无法识别APReleaseProcess和APPayment类。
  • 方法签名不匹配:原方法的参数类型、数量、修饰符必须完全一致,否则会出现“找不到方法”的错误。ReleasePayments的标准签名为void ReleasePayments(APPayment[] documents, bool isMassProcess)。
  • 错误的扩展目标:若你扩展的是APPaymentEntry(付款维护屏幕的Graph),而非APReleaseProcess,肯定找不到释放相关方法。

4. 替代方案:使用事件委托

如果重写方法仍有问题,可通过订阅APReleaseProcess的相关事件来拦截流程,例如在释放前触发的RowSelected事件:

public class APReleaseProcessExtension : PXGraphExtension<APReleaseProcess>
{
    public override void Initialize()
    {
        base.Initialize();
        Base.Select<APPayment>().RowSelected += APReleaseProcess_RowSelected;
    }

    private void APReleaseProcess_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        var payment = e.Row as APPayment;
        if (payment == null) return;

        // 示例:在选择付款文档时执行自定义校验
        if (payment.DocType == APPaymentType.Prepayment && !payment.Released)
        {
            throw new PXException("预付款不允许通过此屏幕释放,请使用专用流程");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:25:17