using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L1; using SqlSugar; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L0; /// /// L0 生产 loader:实现 ,从标准层 /// 组装 。**只读 mdp_std**,不直连源库/旧表。 /// /// 计算口径(B6:由事实读时计算,不存易过期布尔): /// HasPendingReceipt = ReceiptPendingQty > 0(PurOrdDetail.ReceiptQty) /// HasReceivableDetails = ReceivableDetailCount > 0(MissedPrint Status='N') /// UNRESOLVED(不猜测): /// Refs → 恒空 ""(收货上下文无此列,与库存层默认一致); /// 新收货号 → 写侧 pr_SFM_GetOrdNbr 生成;本 loader 供既有收货号 RctNbr(=PurOrdRctDetail.Receiver)。 /// freshness:透传 SourceSyncedAt(=sync_time),由消费端与事件时刻比对(见 B8)。 /// public sealed class MdpIqcReceiptStateLoader : IIqcReceiptStateLoader, ITransient { private readonly IIqcReceiptStdReader _reader; public MdpIqcReceiptStateLoader(IIqcReceiptStdReader reader) => _reader = reader ?? throw new ArgumentNullException(nameof(reader)); public async Task LoadAsync(long tenantId, string domainCode, string fbillno) { var row = await _reader.LoadRowAsync(tenantId, domainCode, fbillno); if (row == null) return new IqcReceiptState { Found = false }; // 标准层暂无 → 数据未就绪,可重试 return new IqcReceiptState { Found = true, HasPendingReceipt = row.ReceiptPendingQty > 0m, HasReceivableDetails = row.ReceivableDetailCount > 0, ItemNum = row.ItemNum ?? "", Location = row.Location ?? "", LotSerial = row.LotSerial ?? "", Refs = "", // UNRESOLVED:收货态无 Refs RctNbr = row.RctNbr ?? "", // 既有收货号(新号写侧生成) PurOrd = row.PurOrd ?? "", PurLine = row.PurLine, Potype = row.Potype ?? "", OrderedQty = row.OrderedQty, BeforeReceivedQty = row.ReceivedCumQty, // 累计已收 ReturnedQty = row.ReturnedCumQty, SampleQty = row.SampleQty, SourceSyncedAt = row.SourceSyncedAt, }; } }