| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L1;
- using SqlSugar;
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L0;
- /// <summary>
- /// L0 生产 loader:实现 <see cref="IIqcReceiptStateLoader"/>,从标准层 <see cref="IIqcReceiptStdReader"/>
- /// 组装 <see cref="IqcReceiptState"/>。**只读 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)。
- /// </summary>
- public sealed class MdpIqcReceiptStateLoader : IIqcReceiptStateLoader, ITransient
- {
- private readonly IIqcReceiptStdReader _reader;
- public MdpIqcReceiptStateLoader(IIqcReceiptStdReader reader) => _reader = reader ?? throw new ArgumentNullException(nameof(reader));
- public async Task<IqcReceiptState> 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,
- };
- }
- }
|