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); } } }
关键改动说明
- 获取缓存活跃实例:通过
Base.Caches[typeof(ARInvoice)].Get(invoice)获取系统追踪的发票对象,确保文件关联的是正确的缓存实例。 - 独立管理文件处理实例:用
using块包裹UploadFileMaintenance,避免跨文件处理的状态污染。 - 强制持久化关联:附加文件后调用
Update和Save.Press(),确保文件与发票的关联关系写入数据库,而非仅停留在内存缓存。 - 空值防护:增加
cachedInvoice == null判断,跳过无效的发票实例。
内容的提问来源于stack exchange,提问作者John C
相关产品推荐
相关产品推荐

