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,
};
}
}