PurchaseReceiptRuntimeGate.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt;
  2. /// <summary>
  3. /// C2 收货运行期门(Phase 6A 实核 `@IsRctTemp&gt;0 &amp;&amp; @QtyAcc&gt;0 &amp;&amp; @RctDetails&lt;&gt;''` 的业务语义抽象)。
  4. /// 语义:有待转正式收货明细 &amp;&amp; 接受收货数&gt;0 &amp;&amp; 有可收明细(Status='N')。
  5. /// **不因 IQC 已标合格就直接过账**——须满足运行期门才进入 C2/C5。
  6. /// </summary>
  7. public sealed class PurchaseReceiptGateInput
  8. {
  9. /// <summary>是否存在待转正式收货明细(@IsRctTemp&gt;0)。</summary>
  10. public bool HasPendingReceipt { get; set; }
  11. /// <summary>接受收货数(@QtyAcc)。</summary>
  12. public decimal AcceptedQty { get; set; }
  13. /// <summary>是否存在 Status='N' 的可收明细(@RctDetails&lt;&gt;'')。</summary>
  14. public bool HasReceivableDetails { get; set; }
  15. }
  16. public sealed class PurchaseReceiptGateResult
  17. {
  18. public bool CanCreate { get; set; }
  19. public string Reason { get; set; }
  20. }
  21. public static class PurchaseReceiptRuntimeGate
  22. {
  23. public static PurchaseReceiptGateResult Evaluate(PurchaseReceiptGateInput input)
  24. {
  25. if (input == null) throw new ArgumentNullException(nameof(input));
  26. if (!input.HasPendingReceipt)
  27. return new PurchaseReceiptGateResult { CanCreate = false, Reason = "无待转正式收货明细(IsRctTemp)" };
  28. if (input.AcceptedQty <= 0m)
  29. return new PurchaseReceiptGateResult { CanCreate = false, Reason = "接受收货数为 0" };
  30. if (!input.HasReceivableDetails)
  31. return new PurchaseReceiptGateResult { CanCreate = false, Reason = "无可收明细(Status='N')" };
  32. return new PurchaseReceiptGateResult { CanCreate = true };
  33. }
  34. }