| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Inventory;
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt;
- /// <summary>
- /// 由 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 链)。
- /// </summary>
- 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;
- }
- }
|