using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Inventory; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt; /// /// 由 IQC 合格收货命令构造库存命令批(纯逻辑,无 DB)。据 Phase 6A LIVE 取证: /// ① `rct-po` +AcceptedQty(进可用库存); /// ② 若 SampleQty>0 再加 `iss-unp` -SampleQty(同 item/loc/lot,Reason='iqc')。 /// 顺序与 LIVE 一致(rct-po 先、iss-unp 后)。**不构造 rct-po-ins / iss-tr-ins**(非 IQC 链)。 /// public static class IqcInventoryBatchBuilder { public static InventoryPostingBatch Build(IqcAcceptedReceipt r) { if (r == null) throw new ArgumentNullException(nameof(r)); var batch = new InventoryPostingBatch(); var seq = 0; // ① 主收货 rct-po(进可用库存) batch.Commands.Add(new InventoryTransactionCommand { TenantId = r.TenantId, DomainCode = r.DomainCode, PostingId = r.PostingId, TransactionGroupId = r.TransactionGroupId, Seq = ++seq, TransType = InventoryTransType.RctPo, ChangeQty = r.AcceptedQty, UmConversion = r.UmConversion == 0m ? 1m : r.UmConversion, ItemNum = r.ItemNum, Location = r.Location, LotSerial = r.LotSerial ?? "", Refs = r.Refs ?? "", OrdNbr = r.RctNbr, WorkOrd = r.WorkOrd, Receiver = r.Receiver, RctQcNbr = r.RctQcNbr, Fbillno = r.Fbillno, User = r.User, }); // ② 留样 iss-unp(-SampleQty,同 item/loc/lot,Reason='iqc') if (r.SampleQty > 0m) { batch.Commands.Add(new InventoryTransactionCommand { TenantId = r.TenantId, DomainCode = r.DomainCode, PostingId = r.PostingId, TransactionGroupId = r.TransactionGroupId, Seq = ++seq, TransType = InventoryTransType.IssUnp, ChangeQty = -r.SampleQty, UmConversion = r.UmConversion == 0m ? 1m : r.UmConversion, ItemNum = r.ItemNum, Location = r.Location, LotSerial = r.LotSerial ?? "", Refs = r.Refs ?? "", OrdNbr = r.RctNbr, Reason = "iqc", User = r.User, }); } return batch; } }