namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L1; /// /// consume 时重新加载的收货可变状态(Runtime Gate 新鲜度 + 收货上下文)。 /// 由 L0 loader 从标准层/源提供——**不取自事件 payload**。 /// public sealed class IqcReceiptState { /// 检验单/收货上下文是否存在(不存在=数据未就绪,可重试)。 public bool Found { get; set; } // Runtime Gate 新鲜数据 public bool HasPendingReceipt { get; set; } // @IsRctTemp>0 public bool HasReceivableDetails { get; set; } // @RctDetails<>'' // 收货上下文(构造 C5 命令 / C6 对账 / C7 任务) public string ItemNum { get; set; } public string Location { get; set; } public string LotSerial { get; set; } public string Refs { get; set; } public string RctNbr { get; set; } // 新收货号 public string PurOrd { get; set; } public int PurLine { get; set; } public string Potype { get; set; } public decimal OrderedQty { get; set; } public decimal BeforeReceivedQty { get; set; } public decimal ReturnedQty { get; set; } public decimal SampleQty { get; set; } /// /// L0 freshness 水位(Phase B8):标准层该记录的最近同步时点(源自 `mdp_std_*.sync_time`)。 /// null=未知。消费端据此与事件发生时刻比对:标准层落后于事件 → 不过账、事件保持 retryable,避免用陈旧态过账。 /// public DateTime? SourceSyncedAt { get; set; } } /// /// L1→L0 边界 port:给定 (tenant, domain, FBILLNO) 加载**最新**收货状态。 /// L0 下阶段实现:从 `mdp_std_*`(IQC 检验单 std + 采购收货 std)读取;本阶段仅定义 port,不建 mdp entity/transform。 /// /// L0 下阶段须提供的最小数据 = 全字段: /// Found / HasPendingReceipt(IsRctTemp) / HasReceivableDetails(Status='N' 明细) / /// ItemNum / Location / LotSerial / Refs / RctNbr / PurOrd / PurLine / Potype / /// OrderedQty(QtyOrded) / BeforeReceivedQty(PurOrdDetail.RctQty) / ReturnedQty(QtyReturned) / SampleQty(InsSampleQty)。 /// public interface IIqcReceiptStateLoader { Task LoadAsync(long tenantId, string domainCode, string fbillno); }