S8PurchaseDeliveryRuleDefinitions.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Admin.NET.Plugin.AiDOP.Infrastructure.S8;
  2. using Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
  3. using Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess.Providers;
  4. namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.Definitions;
  5. /// <summary>
  6. /// S8 正式规则定义的集中登记处(当前仅 Rule 01)。
  7. ///
  8. /// <para>集中一处而非每规则一个文件,理由与 <see cref="S8BusinessDatasetDefinitions"/> 相同:
  9. /// 重复 rule_code 在数组里人工一眼可查;新增规则只加一个元素,不必再改 <c>Startup.cs</c>。</para>
  10. /// </summary>
  11. public sealed class S8PurchaseDeliveryRuleDefinitions : IS8RuleDefinitionSource
  12. {
  13. /// <summary>Rule 01 编码。全链身份,任何地方引用必须逐字用本常量,不写字面量。</summary>
  14. public const string PurchaseDeliveryDateDelayCode = "RULE_S4_PURCHASE_DELIVERY_DATE_DELAY";
  15. /// <summary>Rule 01 建单使用的异常类型。</summary>
  16. public const string PurchaseDeliveryExceptionTypeCode = "PURCHASE_DELIVERY_ABNORMAL";
  17. /// <summary>Rule 01 源对象类型。**参与 dedup_key**。</summary>
  18. public const string PurchaseOrderLineObjectType = "PURCHASE_ORDER_LINE";
  19. public IEnumerable<S8RuleDefinition> GetDefinitions() => new[]
  20. {
  21. new S8RuleDefinition
  22. {
  23. RuleCode = PurchaseDeliveryDateDelayCode,
  24. DisplayName = "采购交期延误",
  25. Description =
  26. "采购订单行已过约定到期日仍未完成交付时提报异常。" +
  27. "到期日取交付计划需求日期,缺失时回落采购订单到期日;" +
  28. "已完成 / 已关闭 / 已取消的订单行不再判为延误。",
  29. DatasetCode = S8BusinessDatasetDefinitions.PurchaseDeliveryCode,
  30. RuleType = S8TimeoutRuleEvaluator.RuleTypeCode,
  31. RuleMechanism = "DATE",
  32. SourceObjectType = PurchaseOrderLineObjectType,
  33. SceneCode = S8ModuleCode.S4,
  34. StageCode = S8ModuleCode.S4,
  35. OrderFlowCode = "MATERIAL_PURCHASE",
  36. ExceptionTypeCode = PurchaseDeliveryExceptionTypeCode,
  37. // ────────────────────────────────────────────────────────────────
  38. // 判定语义。四个列名都是 canonical 名 —— Provider 直接以这些名字产出行
  39. // (见 S8PurchaseDeliveryDataProvider 的 SELECT 别名契约)。
  40. //
  41. // due_at 的血缘已完成取证:Provider 的 COALESCE(need_date, due_date)
  42. // 与数据中台自身的 DELAYED 判据
  43. // COALESCE(交付计划 need_date, 采购订单 need_date, 采购订单 due_date) < now
  44. // 展开后逐字等价(S3MdpSyncTransformService 的 dwd_supplier_delivery INSERT)。
  45. // 实测佐证:UAT 租户最新快照 36 行,evaluator 命中 28 条,
  46. // 与中台自行标记的 DELAYED 28 条完全一致。
  47. //
  48. // ⚠️ UNPROVEN_CONTRACT_SEMANTICS:以上只证明 S8 与中台口径一致,
  49. // 并未证明 need_date 等同于与供应商约定的承诺交期。该问题需追至源系统
  50. // PurOrdDetail.NeedDate 并由业务确认,在此之前 due_at 不得被当作交付合同依据。
  51. // ────────────────────────────────────────────────────────────────
  52. Timeout = new S8TimeoutSemantics
  53. {
  54. DueAtColumn = S8CanonicalColumns.DueAt,
  55. StatusColumn = S8CanonicalColumns.Status,
  56. // 去重身份 = po_no + '#' + po_line,由 Provider 拼好后放在 source_object_id 列。
  57. // 真库证据:dwd_supplier_delivery 全表 39854 行 / 4 租户 / 97 个快照,
  58. // (tenant_id, stat_date, po_no, po_line) 重复组为 0。
  59. SourceObjectIdColumn = S8CanonicalColumns.SourceObjectId,
  60. RelatedObjectCodeColumn = S8CanonicalColumns.RelatedObjectCode,
  61. // status 域 = COMPLETED / DELAYED / OPEN / CLOSED / CANCELLED / PARTIAL
  62. // (三个写入方合并取证:S3MdpSyncTransformService / DeliveryScheduleService /
  63. // ProcessOutsourceOrderService)。
  64. // 下列三个视为已完成;DELAYED / OPEN / PARTIAL 均可命中。
  65. CompletedStates = new[] { "COMPLETED", "CLOSED", "CANCELLED" }
  66. },
  67. Parameters = new S8RuleParameterPolicy
  68. {
  69. PollIntervalSecondsDefault = 300,
  70. TriggerCountRequiredDefault = 1,
  71. // 交期类异常抖动主要来自快照切换,连续两次未命中才判恢复。
  72. RecoverCountRequiredDefault = 2,
  73. GraceMinutesDefault = 0,
  74. SeverityDefault = S8SeverityCode.Serious,
  75. AllowsDepartmentDefaults = true
  76. }
  77. }
  78. };
  79. }