namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt; /// /// C2 收货运行期门(Phase 6A 实核 `@IsRctTemp>0 && @QtyAcc>0 && @RctDetails<>''` 的业务语义抽象)。 /// 语义:有待转正式收货明细 && 接受收货数>0 && 有可收明细(Status='N')。 /// **不因 IQC 已标合格就直接过账**——须满足运行期门才进入 C2/C5。 /// public sealed class PurchaseReceiptGateInput { /// 是否存在待转正式收货明细(@IsRctTemp>0)。 public bool HasPendingReceipt { get; set; } /// 接受收货数(@QtyAcc)。 public decimal AcceptedQty { get; set; } /// 是否存在 Status='N' 的可收明细(@RctDetails<>'')。 public bool HasReceivableDetails { get; set; } } public sealed class PurchaseReceiptGateResult { public bool CanCreate { get; set; } public string Reason { get; set; } } public static class PurchaseReceiptRuntimeGate { public static PurchaseReceiptGateResult Evaluate(PurchaseReceiptGateInput input) { if (input == null) throw new ArgumentNullException(nameof(input)); if (!input.HasPendingReceipt) return new PurchaseReceiptGateResult { CanCreate = false, Reason = "无待转正式收货明细(IsRctTemp)" }; if (input.AcceptedQty <= 0m) return new PurchaseReceiptGateResult { CanCreate = false, Reason = "接受收货数为 0" }; if (!input.HasReceivableDetails) return new PurchaseReceiptGateResult { CanCreate = false, Reason = "无可收明细(Status='N')" }; return new PurchaseReceiptGateResult { CanCreate = true }; } }