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

Acumatica - 重写业务逻辑:改写SOInvoiceEntry的InvoiceOrder逻辑

自定义SOInvoiceEntry的InvoiceOrder逻辑实现方案

看来你已经在Acumatica自定义发票聚合逻辑的路上走了一半啦!下面我会把你的思路落地成完整可运行的扩展代码,同时补充关键注意事项,确保你的自定义逻辑能精准触发在「未选择单独开票」的场景下。

完整扩展代码实现

首先,我们需要创建一个SOInvoiceEntry的图扩展,通过替换内置的InvoiceOrder委托来注入自定义逻辑:

public class SOInvoiceEntryExtension : PXGraphExtension<SOInvoiceEntry>
{
    // 标记扩展为激活状态
    public static bool IsActive() => true;

    // 备份原有的InvoiceOrder委托,用于保留默认逻辑
    private InvoiceOrderDelegate _originalInvoiceOrder;

    public override void Initialize()
    {
        base.Initialize();
        // 先保存原委托,避免完全覆盖后丢失默认功能
        _originalInvoiceOrder = Base.InvoiceOrder;
        // 替换为自定义实现
        Base.InvoiceOrder = CustomInvoiceOrder;
    }

    // 自定义InvoiceOrder方法,参数必须与原委托完全匹配
    private void CustomInvoiceOrder(DateTime invoiceDate, 
        PXResult<SOOrderShipment, SOOrder, CurrencyInfo, SOAddress, SOContact, SOOrderType> order, 
        PXResultset<SOShipLine, SOLine> details, Customer customer, 
        Contact billContact, Address billAddress, Contact shipContact, Address shipAddress, 
        List<SOOrderShipment> splittedShipments, bool overrideCurrencyRate, decimal? curyRate, 
        string curyRateTypeID, DateTime? curyRateDate)
    {
        // 提取当前订单对象
        SOOrder targetOrder = order;

        // 判断条件:未勾选「单独开票」时执行自定义逻辑
        if (targetOrder?.SeparateInvoice != true)
        {
            // --------------------------
            // 这里编写你的自定义发票聚合逻辑
            // 示例场景参考:
            // 1. 合并相同物料的发货行到同一条发票明细
            // 2. 调整特定订单类型的计税规则
            // 3. 自动填充自定义字段值到发票头/明细
            // --------------------------
            PXTrace.WriteInformation("触发自定义发票聚合逻辑,订单编号: {0}", targetOrder.OrderNbr);

            // 如果需要在自定义逻辑后仍执行部分默认逻辑,可调用备份的原委托:
            // _originalInvoiceOrder?.Invoke(invoiceDate, order, details, customer, billContact, billAddress, shipContact, shipAddress, splittedShipments, overrideCurrencyRate, curyRate, curyRateTypeID, curyRateDate);
        }
        else
        {
            // 勾选「单独开票」时,执行原有的默认发票生成逻辑
            _originalInvoiceOrder?.Invoke(invoiceDate, order, details, customer, billContact, billAddress, shipContact, shipAddress, splittedShipments, overrideCurrencyRate, curyRate, curyRateTypeID, curyRateDate);
        }
    }
}

关键注意事项

  • 委托参数匹配:自定义方法的参数必须和Acumatica内置的InvoiceOrderDelegate完全一致,否则会出现编译错误。如果不确定参数列表,可以通过Acumatica的元数据浏览器查看SOInvoiceEntry类的InvoiceOrder成员定义。
  • 原逻辑备份:一定要先保存原委托实例,否则在需要保留默认逻辑的场景下(比如勾选单独开票时),会丢失Acumatica原生的发票生成功能。
  • 调试与验证:使用PXTrace.WriteInformation输出日志,或者在Acumatica的系统日志中查看自定义逻辑的触发情况;测试时要覆盖「勾选单独开票」和「未勾选」两种场景,确保逻辑分支都正常工作。
  • 权限与字段访问:如果自定义逻辑需要访问其他关联数据(比如库存、价格表),要确保扩展类有对应的访问权限,必要时使用PXSelect或PXSelectBase查询数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:53:46