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