AdoS8Exception.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. namespace Admin.NET.Plugin.AiDOP.Entity.S8;
  2. /// <summary>
  3. /// 异常主表(业务实体;列表为查询该表及关联展示字段,非独立「列表视图表」)。
  4. /// </summary>
  5. [SugarTable("ado_s8_exception", "S8 异常主表")]
  6. // S8-TENANT-ONLY-BATCH6:单号唯一性收敛为 (租户, 单号)。
  7. // 旧键含 factory_id,而本批之后新建异常的 factory_id 恒为 0、历史行非 0,
  8. // 混合状态下同租户可出现两条相同 exception_code —— 对外单号重号。
  9. // 其余 (tenant_id, factory_id, ...) 辅助索引本批刻意不动:前导列仍是 tenant_id,查询能走前缀。
  10. [SugarIndex("uk_ado_s8_exception_tenant_code", nameof(TenantId), OrderByType.Asc, nameof(ExceptionCode), OrderByType.Asc, IsUnique = true)]
  11. [SugarIndex("idx_ado_s8_exception_type_time", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(ExceptionTypeCode), OrderByType.Asc, nameof(CreatedAt), OrderByType.Desc)]
  12. [SugarIndex("idx_s8_exception_dedup_key", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(DedupKey), OrderByType.Asc)]
  13. [SugarIndex("idx_s8_exception_source_rule_code", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(SourceRuleCode), OrderByType.Asc)]
  14. [SugarIndex("idx_s8_exception_source_object", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(SourceObjectType), OrderByType.Asc, nameof(SourceObjectId), OrderByType.Asc)]
  15. [SugarIndex("idx_s8_exception_last_detected_at", nameof(LastDetectedAt), OrderByType.Asc)]
  16. [SugarIndex("idx_s8_exception_related_object_code", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(RelatedObjectCode), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
  17. [SugarIndex("idx_s8_exception_order_flow", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(OrderFlowCode), OrderByType.Asc, nameof(Status), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
  18. [SugarIndex("idx_s8_exception_related_flow", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(RelatedObjectCode), OrderByType.Asc, nameof(OrderFlowCode), OrderByType.Asc)]
  19. [SugarIndex("idx_s8_exception_assignee_status", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(AssigneeUserId), OrderByType.Asc, nameof(Status), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
  20. [SugarIndex("idx_s8_exception_verifier_status", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(VerifierUserId), OrderByType.Asc, nameof(Status), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
  21. public class AdoS8Exception
  22. {
  23. [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true, ColumnDataType = "bigint")]
  24. public long Id { get; set; }
  25. [SugarColumn(ColumnName = "tenant_id", ColumnDataType = "bigint")]
  26. public long TenantId { get; set; }
  27. [SugarColumn(ColumnName = "factory_id", ColumnDataType = "bigint")]
  28. public long FactoryId { get; set; }
  29. [SugarColumn(ColumnName = "exception_code", Length = 64)]
  30. public string ExceptionCode { get; set; } = string.Empty;
  31. [SugarColumn(ColumnName = "title", Length = 256)]
  32. public string Title { get; set; } = string.Empty;
  33. [SugarColumn(ColumnName = "description", Length = 4000, IsNullable = true)]
  34. public string? Description { get; set; }
  35. [SugarColumn(ColumnName = "scene_code", Length = 64)]
  36. public string SceneCode { get; set; } = string.Empty;
  37. [SugarColumn(ColumnName = "source_type", Length = 32)]
  38. public string SourceType { get; set; } = "MANUAL";
  39. [SugarColumn(ColumnName = "status", Length = 32)]
  40. public string Status { get; set; } = "NEW";
  41. /// <summary>S8-SEVERITY-FOLLOW-SERIOUS-STANDARDIZE-EXEC-1:业务枚举 FOLLOW(关注)/ SERIOUS(严重)。</summary>
  42. [SugarColumn(ColumnName = "severity", Length = 32)]
  43. public string Severity { get; set; } = "FOLLOW";
  44. [SugarColumn(ColumnName = "priority_score", ColumnDataType = "decimal(10,2)")]
  45. public decimal PriorityScore { get; set; }
  46. [SugarColumn(ColumnName = "priority_level", Length = 16)]
  47. public string PriorityLevel { get; set; } = "P3";
  48. [SugarColumn(ColumnName = "occurrence_dept_id", ColumnDataType = "bigint")]
  49. public long OccurrenceDeptId { get; set; }
  50. [SugarColumn(ColumnName = "responsible_dept_id", ColumnDataType = "bigint")]
  51. public long ResponsibleDeptId { get; set; }
  52. [SugarColumn(ColumnName = "responsible_group_id", ColumnDataType = "bigint", IsNullable = true)]
  53. public long? ResponsibleGroupId { get; set; }
  54. /// <summary>
  55. /// 处理人。<b>SYSUSER ID ONLY</b> —— 值域是 <c>SysUser.Id</c>,不是 <c>EmployeeMaster.RecID</c>。
  56. ///
  57. /// <para>列名从 <c>assignee_id</c> 显式改为 <c>assignee_user_id</c>(迁移 1.0.496)。
  58. /// 旧列名两种解读都说得通,历史上也确实同时存在过两种写法:
  59. /// 认领写 Employee.RecID、审批流回调写 SysUser.Id,实测 34 个非空值里 14 个两边都解析不出来。
  60. /// 名字里带 <c>user</c> 是为了让下一次误用在<b>读代码时</b>就被发现,而不是等到线上通知发不出去。</para>
  61. /// </summary>
  62. [SugarColumn(ColumnName = "assignee_user_id", ColumnDataType = "bigint", IsNullable = true)]
  63. public long? AssigneeUserId { get; set; }
  64. /// <summary>提报人。<b>SYSUSER ID ONLY</b>,口径同 <see cref="AssigneeUserId"/>。</summary>
  65. [SugarColumn(ColumnName = "reporter_user_id", ColumnDataType = "bigint", IsNullable = true)]
  66. public long? ReporterUserId { get; set; }
  67. [SugarColumn(ColumnName = "sla_deadline", IsNullable = true)]
  68. public DateTime? SlaDeadline { get; set; }
  69. [SugarColumn(ColumnName = "timeout_flag", ColumnDataType = "boolean")]
  70. public bool TimeoutFlag { get; set; }
  71. [SugarColumn(ColumnName = "created_at")]
  72. public DateTime CreatedAt { get; set; } = DateTime.Now;
  73. [SugarColumn(ColumnName = "updated_at", IsNullable = true)]
  74. public DateTime? UpdatedAt { get; set; }
  75. [SugarColumn(ColumnName = "assigned_at", IsNullable = true)]
  76. public DateTime? AssignedAt { get; set; }
  77. [SugarColumn(ColumnName = "closed_at", IsNullable = true)]
  78. public DateTime? ClosedAt { get; set; }
  79. /// <summary>所属模块码(S1-S7),标识异常产生于哪个业务环节</summary>
  80. [SugarColumn(ColumnName = "module_code", Length = 16, IsNullable = true)]
  81. public string? ModuleCode { get; set; }
  82. [SugarColumn(ColumnName = "process_node_code", Length = 64, IsNullable = true)]
  83. public string? ProcessNodeCode { get; set; }
  84. [SugarColumn(ColumnName = "related_object_code", Length = 64, IsNullable = true)]
  85. public string? RelatedObjectCode { get; set; }
  86. /// <summary>当前进行中的审批实例ID(用于并发控制)</summary>
  87. [SugarColumn(ColumnName = "active_flow_instance_id", IsNullable = true)]
  88. public long? ActiveFlowInstanceId { get; set; }
  89. /// <summary>当前进行中的审批业务类型(EXCEPTION_ESCALATION / EXCEPTION_CLOSURE)</summary>
  90. [SugarColumn(ColumnName = "active_flow_biz_type", Length = 32, IsNullable = true)]
  91. public string? ActiveFlowBizType { get; set; }
  92. [SugarColumn(ColumnName = "is_deleted", ColumnDataType = "boolean")]
  93. public bool IsDeleted { get; set; }
  94. [SugarColumn(ColumnName = "created_by", Length = 64, IsNullable = true)]
  95. public string? CreatedBy { get; set; }
  96. [SugarColumn(ColumnName = "updated_by", Length = 64, IsNullable = true)]
  97. public string? UpdatedBy { get; set; }
  98. /// <summary>异常类型编码(关联 ado_s8_exception_type.type_code)。配置化改造后新增。</summary>
  99. [SugarColumn(ColumnName = "exception_type_code", Length = 64, IsNullable = true)]
  100. public string? ExceptionTypeCode { get; set; }
  101. /// <summary>来源数据源 ID(自动建单时填充;人工提报为空)。关联 ado_s8_data_source.id</summary>
  102. [SugarColumn(ColumnName = "source_data_source_id", ColumnDataType = "bigint", IsNullable = true)]
  103. public long? SourceDataSourceId { get; set; }
  104. /// <summary>来源监视规则 ID(自动建单时填充)。关联 ado_s8_watch_rule.id</summary>
  105. [SugarColumn(ColumnName = "source_rule_id", ColumnDataType = "bigint", IsNullable = true)]
  106. public long? SourceRuleId { get; set; }
  107. /// <summary>命中规则时的原始数据快照(JSON 文本,便于追溯)</summary>
  108. [SugarColumn(ColumnName = "source_payload", Length = 4000, IsNullable = true)]
  109. public string? SourcePayload { get; set; }
  110. /// <summary>检验人(提交复检时手选)。<b>SYSUSER ID ONLY</b>,口径同 <see cref="AssigneeUserId"/>。</summary>
  111. [SugarColumn(ColumnName = "verifier_user_id", ColumnDataType = "bigint", IsNullable = true)]
  112. public long? VerifierUserId { get; set; }
  113. /// <summary>提交复检时间</summary>
  114. [SugarColumn(ColumnName = "verification_assigned_at", IsNullable = true)]
  115. public DateTime? VerificationAssignedAt { get; set; }
  116. /// <summary>检验完成时间</summary>
  117. [SugarColumn(ColumnName = "verified_at", IsNullable = true)]
  118. public DateTime? VerifiedAt { get; set; }
  119. /// <summary>检验结果(APPROVED / REJECTED)</summary>
  120. [SugarColumn(ColumnName = "verification_result", Length = 32, IsNullable = true)]
  121. public string? VerificationResult { get; set; }
  122. /// <summary>检验意见</summary>
  123. [SugarColumn(ColumnName = "verification_remark", Length = 2000, IsNullable = true)]
  124. public string? VerificationRemark { get; set; }
  125. /// <summary>R1 持久化去重键(首版仅普通列,唯一约束在后续小步加)。</summary>
  126. [SugarColumn(ColumnName = "dedup_key", Length = 128, IsNullable = true)]
  127. public string? DedupKey { get; set; }
  128. /// <summary>R1 最近一次被规则检测命中的时间(首版仅落列,service 暂不写)。</summary>
  129. [SugarColumn(ColumnName = "last_detected_at", IsNullable = true)]
  130. public DateTime? LastDetectedAt { get; set; }
  131. /// <summary>R1 规则恢复时间(首版仅落列,service 暂不写)。</summary>
  132. [SugarColumn(ColumnName = "recovered_at", IsNullable = true)]
  133. public DateTime? RecoveredAt { get; set; }
  134. /// <summary>R1 来源规则人读编码(与 source_rule_id 配合,首版仅落列)。</summary>
  135. [SugarColumn(ColumnName = "source_rule_code", Length = 64, IsNullable = true)]
  136. public string? SourceRuleCode { get; set; }
  137. /// <summary>R1 源对象类型(DEVICE / ORDER 等,首版仅落列)。</summary>
  138. [SugarColumn(ColumnName = "source_object_type", Length = 64, IsNullable = true)]
  139. public string? SourceObjectType { get; set; }
  140. /// <summary>R1 源对象主键或业务 ID(字符串以适配跨表/跨域,首版仅落列)。</summary>
  141. [SugarColumn(ColumnName = "source_object_id", Length = 64, IsNullable = true)]
  142. public string? SourceObjectId { get; set; }
  143. // ============================================================
  144. // S8-SCHED-SCHEMA-1:已建异常的抗抖累计字段(仅落列,本轮不接逻辑)
  145. // 仅用于已建异常后的刷新/恢复抗抖;建单前抗抖落在 AdoS8RuleDetectionState。
  146. // ============================================================
  147. /// <summary>已建异常被规则连续命中的次数(用于刷新阶段抗抖)。</summary>
  148. [SugarColumn(ColumnName = "consecutive_hit_count")]
  149. public int ConsecutiveHitCount { get; set; } = 1;
  150. /// <summary>已建异常被规则连续未命中的次数(用于恢复阶段抗抖)。</summary>
  151. [SugarColumn(ColumnName = "consecutive_miss_count")]
  152. public int ConsecutiveMissCount { get; set; } = 0;
  153. // ============================================================
  154. // TASK-002-RESET-DIMENSION-MODEL-DEV-2A:业务维度归属字段(仅落列,建单写入由后续切片接入)
  155. // ============================================================
  156. /// <summary>S_STAGE 维度节点(S1-S7);首版与 module_code 同值,DEV-4 后聚合逐步切到此字段。</summary>
  157. [SugarColumn(ColumnName = "stage_code", Length = 16, IsNullable = true)]
  158. public string? StageCode { get; set; }
  159. /// <summary>ORDER_FLOW 维度节点;首版允许 NULL,由规则携带后透传到异常。</summary>
  160. [SugarColumn(ColumnName = "order_flow_code", Length = 64, IsNullable = true)]
  161. public string? OrderFlowCode { get; set; }
  162. /// <summary>报警机制:MANUAL_REPORT / DATE / RATIO / VALUE_RANGE。与 source_type 不同。</summary>
  163. [SugarColumn(ColumnName = "rule_mechanism", Length = 32, IsNullable = true)]
  164. public string? RuleMechanism { get; set; }
  165. }