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

Acumatica批量处理发票时附件仅首个生效问题修复咨询

修复Acumatica批量发票释放时PDF附件仅生效第一个的问题

问题根源

你的判断是对的,批量处理时PXNoteAttribute.AttachFile的缓存使用存在问题:遍历adapter.Get<ARInvoice>()返回的发票对象可能未在当前图的缓存中保持活跃状态,导致后续发票的文件关联无法被正确持久化;同时文件附加后未强制更新缓存状态,也会导致关联关系丢失。

修复方案

修改代码需确保:

  • 每个发票都从当前图的缓存中获取活跃实例
  • 文件附加后强制更新缓存并持久化关联关系
  • 每个文件独立使用UploadFileMaintenance实例,避免状态干扰

修改后的完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using PX.Common;
using PX.Data;
using PX.Objects.AR;
using PX.Data.Reports;
using PX.SM;
using PX.Reports.Controls;
using PX.Reports.Data;
using PX.Reports;

namespace PX.Objects.AR
{
    public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
    {
        [InjectDependency]
        protected IReportLoaderService ReportLoader { get; private set; }

        [InjectDependency]
        protected internal PX.Reports.IReportDataBinder ReportDataBinder { get; private set; }

        public delegate IEnumerable ReleaseDelegate(PXAdapter adapter);
        [PXOverride]
        public IEnumerable Release(PXAdapter adapter, ReleaseDelegate baseMethod)
        {
            foreach (ARInvoice invoice in adapter.Get<ARInvoice>())
            {
                // 从缓存中获取当前发票的活跃实例,确保关联正确
                ARInvoice cachedInvoice = Base.Caches[typeof(ARInvoice)].Get(invoice) as ARInvoice;
                if (cachedInvoice == null) continue;

                // 报表参数设置
                Dictionary<String, String> parameters = new Dictionary<String, String>();
                parameters["ARInvoice.DocType"] = cachedInvoice.DocType;
                parameters["ARInvoice.RefNbr"] = cachedInvoice.RefNbr;
                PXReportSettings settings = new PXReportSettings("AR641000");

                // 加载并处理报表
                PX.Reports.Controls.Report report = ReportLoader.CheckIfNull(nameof(ReportLoader)).LoadReport("AR641000", null);
                ReportLoader.InitReportParameters(report, parameters, settings, false);
                PX.Reports.Data.ReportNode reportNode = ReportDataBinder.CheckIfNull(nameof(ReportDataBinder)).ProcessReportDataBinding(report);

                // 生成PDF文件
                byte[] data = PX.Reports.Mail.Message.GenerateReport(reportNode, RenderType.FilterPdf).First();
                PX.SM.FileInfo file = new PX.SM.FileInfo($"{reportNode.ExportFileName}- {cachedInvoice.RefNbr}.pdf", null, data);

                // 保存文件并附加到发票
                using (var uploadFileMaintenance = PXGraph.CreateInstance<UploadFileMaintenance>())
                {
                    uploadFileMaintenance.SaveFile(file);
                    // 使用缓存中的发票实例附加文件
                    PXNoteAttribute.AttachFile(Base.Caches[typeof(ARInvoice)], cachedInvoice, file);
                    // 更新缓存并持久化关联关系
                    Base.Caches[typeof(ARInvoice)].Update(cachedInvoice);
                    Base.Save.Press();
                }
            }

            return baseMethod(adapter);
        }
    }
}

关键改动说明

  1. 获取缓存活跃实例:通过Base.Caches[typeof(ARInvoice)].Get(invoice)获取系统追踪的发票对象,确保文件关联的是正确的缓存实例。
  2. 独立管理文件处理实例:用using块包裹UploadFileMaintenance,避免跨文件处理的状态污染。
  3. 强制持久化关联:附加文件后调用Update和Save.Press(),确保文件与发票的关联关系写入数据库,而非仅停留在内存缓存。
  4. 空值防护:增加cachedInvoice == null判断,跳过无效的发票实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:22:50