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

Acumatica技术咨询:将信用冻结管控从Sales Orders转移至Shipments的事件处理程序实现建议

Acumatica技术咨询:将信用冻结管控从Sales Orders转移至Shipments的事件处理程序实现建议

Hi Aleks, 针对你想把信用额度管控逻辑从销售订单转移到发货环节的需求——也就是让信用冻结只阻止发货释放、不影响生产——我整理了一些实操建议和代码示例,希望能帮到你:

核心思路

原有的OnCreditLimitSatisfied和OnCreditLimitViolated事件默认绑定在销售订单(SOOrder)图中,我们需要在发货单(SOShipment)图中实现类似的信用检查逻辑,绑定到发货释放的动作前,以此控制发货权限。

实操步骤与代码示例

推荐使用Graph Extension来扩展SOShipment图,避免直接修改系统原生代码,方便后续版本升级:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.SO;

public class SOShipmentCreditControlExt : PXGraphExtension<SOShipment>
{
    public override void Initialize()
    {
        base.Initialize();
        // 将信用检查绑定到发货释放动作的前置事件
        Base.release.AddHandler<SOShipment>(OnBeforeReleaseShipment);
    }

    /// <summary>
    /// 发货释放前执行信用检查
    /// </summary>
    protected virtual void OnBeforeReleaseShipment(PXCache cache, PXRowSelectedEventArgs e)
    {
        SOShipment shipment = e.Row as SOShipment;
        if (shipment == null || shipment.CustomerID == null) return;

        // 获取当前发货单对应的客户信息
        BAccount customer = PXSelect<BAccount, 
            Where<BAccount.bAccountID, Equal<Required<SOShipment.customerID>>>>
            .Select(Base, shipment.CustomerID);

        if (customer == null) return;

        // 调用系统内置的信用检查工具类,获取客户信用状态
        ARCreditCheckResult creditResult = ARCreditCheck.GetCustomerCreditStatus(
            graph: Base,
            bAccountID: customer.BAccountID,
            docDate: shipment.ShipDate,
            branchID: shipment.BranchID,
            currencyID: shipment.CuryID
        );

        // 根据信用检查结果触发对应事件并控制发货动作
        if (creditResult.Violation != null)
        {
            // 触发信用额度违反事件,自定义提示并阻止释放
            Base.OnCreditLimitViolated?.Invoke(cache, new PXCreditLimitViolatedEventArgs(shipment, creditResult.Violation));
            throw new PXException("客户 {0} 信用额度已超出,无法释放该发货单。", customer.AcctName);
        }
        else
        {
            // 信用额度符合要求,触发满足事件
            Base.OnCreditLimitSatisfied?.Invoke(cache, new PXEventArgs(shipment));
        }
    }

    /// <summary>
    /// 自定义信用额度违反事件的处理逻辑
    /// </summary>
    public virtual void _(Events.CreditLimitViolated<SOShipment> e)
    {
        // 这里可以添加自定义逻辑,比如记录审计日志、发送通知等
        PXTrace.WriteError("信用管控拦截:发货单 {0} 因客户信用额度不足被阻止释放。", Base.Document.Current.ShipmentNbr);
        e.Cancel = true; // 明确标记取消当前动作
    }

    /// <summary>
    /// 自定义信用额度满足事件的处理逻辑
    /// </summary>
    public virtual void _(Events.CreditLimitSatisfied<SOShipment> e)
    {
        // 这里可以添加自定义逻辑,比如记录放行日志
        PXTrace.WriteInformation("信用管控放行:发货单 {0} 客户信用状态正常,允许释放。", Base.Document.Current.ShipmentNbr);
    }
}

关键注意事项

  • 逻辑一致性:ARCreditCheck.GetCustomerCreditStatus方法的参数可以根据你的业务需求调整,比如是否包含未结发票、未发货订单等,确保信用检查逻辑和销售订单环节保持一致(或按需修改)。
  • 版本适配:不同Acumatica版本的ARCreditCheck类方法参数可能有细微差异,建议参考你使用版本的官方API文档调整代码。
  • 测试验证:务必测试两种场景:客户信用额度不足时是否能阻止发货释放;客户还款后信用恢复时是否能正常释放发货单。
  • 扩展灵活性:如果需要更复杂的信用规则(比如针对特定客户组豁免检查),可以在信用检查逻辑中添加额外的判断条件。

如果还有具体的细节问题,比如参数调整、版本适配或者特殊业务场景的处理,欢迎补充说明,大家一起讨论~

备注:内容来源于stack exchange,提问作者Aleks Iwan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:09:38