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

重写发票界面Release动作后,报错仍释放发票的问题求助

解决Acumatica发票Release动作抛错后仍被释放的问题

你的代码逻辑存在两个关键问题,导致抛出异常后发票还是被释放了,我们一步步来修复:

问题分析

  1. 错误的原方法调用方式:你用Base.release.Press(adapter)触发原释放逻辑,这会直接触发按钮点击事件,可能绕过重写方法的异常拦截机制。正确的做法应该调用重写的原方法Base.Release(adapter)。
  2. 代码分支逻辑漏洞:当paymentSetup和paymentSettings有效且发票状态为已支付时,你的代码没有调用原释放方法就直接返回null,会导致正常场景下发票无法释放;而异常抛出分支虽然中断了当前代码,但按钮事件的触发逻辑可能还是执行了释放动作。

修复后的代码

[PXOverride] 
public virtual IEnumerable Release(PXAdapter adapter) 
{ 
    if (Base.Document.Current != null) 
    { 
        var paymentSetup = PaySetup.SelectSingle(Base.Document.Current.PaymentMethodID); 
        var paymentSettings = PaySettingDetails.SelectSingle(Base.Document.Current.PaymentMethodID); 
        
        // 仅当支付设置有效且激活时,执行自定义验证
        if (paymentSettings != null && paymentSetup != null && paymentSetup.IsActive == true) 
        { 
            if (this.PayCurrentInvoice.Current != null && 
                !string.Equals(this.PayCurrentInvoice.Current.PayStatus, KNPIConstants.PAID, StringComparison.OrdinalIgnoreCase)) 
            { 
                // 抛出异常直接中断流程,不会执行后续原释放方法
                throw new PXException(KNPIMessages.NotPaid); 
            } 
        } 
    }

    // 所有验证通过后,执行原Release逻辑
    return Base.Release(adapter); 
}

关键修复点

  • 替换原方法调用:用Base.Release(adapter)替代Base.release.Press(adapter),确保重写方法的逻辑被正确执行,异常能有效拦截原流程。
  • 统一逻辑结构:把原释放方法的调用放在所有验证逻辑之后,只有当所有自定义条件满足(或无需验证)时才执行释放;一旦抛出异常,代码直接中断,不会走到原方法调用步骤。
  • 优化字符串比较:使用StringComparison.OrdinalIgnoreCase替代ToUpper(),更高效还能避免PayStatus为null时的空引用风险。

修改后,当自定义验证不满足抛出异常时,原Release方法不会被执行,发票也就不会被释放;验证通过时则正常执行原释放逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:47:39