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
相关产品推荐
相关产品推荐

