搭建消息告警模块以及跨网推送服务,支持企微,飞书,钉钉通知

This commit is contained in:
2026-09-03 14:02:35 +08:00
parent cfa8e78d33
commit 3927b0c201
40 changed files with 4360 additions and 7 deletions
+82
View File
@@ -0,0 +1,82 @@
using Model.Entity.Inspection;
namespace Model.Dto.Inspection
{
/// <summary>
/// 告警消息 DTOId 转 string 防前端精度丢失)
/// </summary>
public class AlertMessageDto
{
/// <summary>主键 Id</summary>
public string? Id { get; set; }
/// <summary>创建时间</summary>
public DateTime? CreateTime { get; set; }
/// <summary>告警来源</summary>
public AlertSourceEnum Source { get; set; }
/// <summary>关联告警规则Id"0"表示无)</summary>
public string? RuleId { get; set; }
/// <summary>设备编号</summary>
public string? DeviceCode { get; set; }
/// <summary>设备名称</summary>
public string? DeviceName { get; set; }
/// <summary>设备类型</summary>
public string? DeviceType { get; set; }
/// <summary>测点/监测指标</summary>
public string? Metric { get; set; }
/// <summary>告警类型</summary>
public AlertTypeEnum AlertType { get; set; }
/// <summary>告警级别(1信息/2警告/3紧急)</summary>
public AlertLevelEnum AlertLevel { get; set; }
/// <summary>当前值</summary>
public double? CurrentValue { get; set; }
/// <summary>阈值</summary>
public double? ThresholdValue { get; set; }
/// <summary>告警内容描述</summary>
public string? Content { get; set; }
/// <summary>通知模板编码(预留)</summary>
public string? TemplateCode { get; set; }
/// <summary>触发次数(合并窗口内累计)</summary>
public int TriggerCount { get; set; }
/// <summary>首次告警时间</summary>
public DateTime FirstAlertTime { get; set; }
/// <summary>最近告警时间</summary>
public DateTime LastAlertTime { get; set; }
/// <summary>告警状态(1未确认/2已确认/3已处理/4已关闭/5已忽略/6已转工单)</summary>
public AlertStatusEnum AlertStatus { get; set; }
/// <summary>确认人</summary>
public string? AckBy { get; set; }
/// <summary>确认时间</summary>
public DateTime? AckTime { get; set; }
/// <summary>处理人</summary>
public string? HandleBy { get; set; }
/// <summary>处理时间</summary>
public DateTime? HandleTime { get; set; }
/// <summary>处理备注</summary>
public string? HandleRemark { get; set; }
/// <summary>关联工单Id(预留二期,"0"表示未转工单)</summary>
public string? WorkOrderId { get; set; }
}
}
+136
View File
@@ -0,0 +1,136 @@
using Model.Entity.Inspection;
namespace Model.Dto.Inspection
{
/// <summary>
/// 通知渠道 DTOId 转 string;Secret 出口脱敏为是否已配置)
/// </summary>
public class AlertNotifyChannelDto
{
/// <summary>主键 Id</summary>
public string? Id { get; set; }
/// <summary>创建时间</summary>
public DateTime? CreateTime { get; set; }
/// <summary>渠道类型(1飞书/2钉钉/3企微)</summary>
public NotifyChannelTypeEnum ChannelType { get; set; }
/// <summary>渠道名称</summary>
public string? Name { get; set; }
/// <summary>Webhook 地址</summary>
public string? WebhookUrl { get; set; }
/// <summary>加签密钥(入参可传;出口仅返回脱敏标记,不回传明文)</summary>
public string? Secret { get; set; }
/// <summary>是否已配置加签密钥(出口专用)</summary>
public bool HasSecret { get; set; }
/// <summary>推送模式(1直连/2Outbox跨网中转)</summary>
public NotifyPushModeEnum PushMode { get; set; }
/// <summary>是否启用</summary>
public bool IsEnabled { get; set; }
/// <summary>备注</summary>
public string? Remark { get; set; }
}
/// <summary>
/// 通知规则 DTO
/// </summary>
public class AlertNotifyRuleDto
{
/// <summary>主键 Id</summary>
public string? Id { get; set; }
/// <summary>创建时间</summary>
public DateTime? CreateTime { get; set; }
/// <summary>规则名称</summary>
public string? RuleName { get; set; }
/// <summary>适用告警级别(1信息/2警告/3紧急)</summary>
public AlertLevelEnum AlertLevel { get; set; }
/// <summary>通知渠道Id</summary>
public string? ChannelId { get; set; }
/// <summary>接收人(@手机号/账号,逗号分隔)</summary>
public string? Receivers { get; set; }
/// <summary>是否通知当班值班人</summary>
public bool NotifyDutyPerson { get; set; }
/// <summary>静默期(分钟)</summary>
public int SilenceMinutes { get; set; }
/// <summary>是否启用</summary>
public bool IsEnabled { get; set; }
/// <summary>备注</summary>
public string? Remark { get; set; }
}
/// <summary>
/// 推送日志 DTO
/// </summary>
public class AlertNotifyLogDto
{
/// <summary>主键 Id</summary>
public string? Id { get; set; }
/// <summary>告警消息Id"0"表示渠道测试推送)</summary>
public string? AlertId { get; set; }
/// <summary>渠道类型</summary>
public NotifyChannelTypeEnum ChannelType { get; set; }
/// <summary>渠道Id</summary>
public string? ChannelId { get; set; }
/// <summary>推送目标(脱敏)</summary>
public string? Target { get; set; }
/// <summary>推送内容摘要</summary>
public string? Content { get; set; }
/// <summary>是否成功</summary>
public bool Success { get; set; }
/// <summary>错误信息</summary>
public string? ErrorMsg { get; set; }
/// <summary>重试次数</summary>
public int RetryCount { get; set; }
/// <summary>推送时间</summary>
public DateTime NotifyTime { get; set; }
}
/// <summary>
/// 值班排班 DTO
/// </summary>
public class DutyRosterDto
{
/// <summary>主键 Id</summary>
public string? Id { get; set; }
/// <summary>创建时间</summary>
public DateTime? CreateTime { get; set; }
/// <summary>值班日期</summary>
public DateTime DutyDate { get; set; }
/// <summary>值班人姓名</summary>
public string? PersonName { get; set; }
/// <summary>联系电话</summary>
public string? Phone { get; set; }
/// <summary>备注</summary>
public string? Remark { get; set; }
}
}
+59
View File
@@ -0,0 +1,59 @@
namespace Model.Dto.Inspection
{
/// <summary>
/// 跨网发件箱拉取结果 DTO(AlertBridge 拉取到的待推送项;Payload 自包含全部推送要素)
/// </summary>
public class AlertOutboxItemDto
{
/// <summary>发件箱 Id(回写结果时使用)</summary>
public string? Id { get; set; }
/// <summary>告警消息Id</summary>
public string? AlertId { get; set; }
/// <summary>渠道Id</summary>
public string? ChannelId { get; set; }
/// <summary>完整推送报文 JSONAlertOutboxPayload 序列化)</summary>
public string? Payload { get; set; }
/// <summary>重试次数</summary>
public int RetryCount { get; set; }
}
/// <summary>
/// 发件箱推送报文(自包含:AlertBridge 无需访问数据库/配置即可推送)
/// </summary>
public class AlertOutboxPayload
{
/// <summary>渠道类型(1飞书/2钉钉/3企微)</summary>
public int ChannelType { get; set; }
/// <summary>Webhook 地址</summary>
public string? WebhookUrl { get; set; }
/// <summary>加签密钥(可空)</summary>
public string? Secret { get; set; }
/// <summary>消息标题</summary>
public string? Title { get; set; }
/// <summary>消息正文(markdown</summary>
public string? Content { get; set; }
/// <summary>@ 手机号列表</summary>
public List<string>? AtMobiles { get; set; }
}
/// <summary>
/// 发件箱结果回写 DTOAlertBridge 推送完成后回写)
/// </summary>
public class OutboxResultDto
{
/// <summary>是否成功</summary>
public bool Success { get; set; }
/// <summary>结果信息(失败原因)</summary>
public string? ResultMsg { get; set; }
}
}
+62
View File
@@ -0,0 +1,62 @@
using Model.Entity.Inspection;
namespace Model.Dto.Inspection
{
/// <summary>
/// 告警上报 DTO(其它模块调用告警中心的统一入参:IAlertCenterService.RaiseAsync / POST raise
/// 除设备标识外全部可空,降低调用方接入成本
/// </summary>
public class AlertRaiseDto
{
/// <summary>告警来源(调用方标识自身模块)</summary>
public AlertSourceEnum Source { get; set; } = AlertSourceEnum.Other;
/// <summary>关联告警规则Id(来源为规则引擎时传,可空/0 表示无)</summary>
public long RuleId { get; set; }
/// <summary>设备编号(建议必传,用于去重合并)</summary>
public string? DeviceCode { get; set; }
/// <summary>设备名称</summary>
public string? DeviceName { get; set; }
/// <summary>设备类型(如 TemperatureBox</summary>
public string? DeviceType { get; set; }
/// <summary>测点/监测指标(如 Temperature</summary>
public string? Metric { get; set; }
/// <summary>告警类型(默认阈值超限)</summary>
public AlertTypeEnum AlertType { get; set; } = AlertTypeEnum.ThresholdExceed;
/// <summary>告警级别(1信息/2警告/3紧急)</summary>
public AlertLevelEnum AlertLevel { get; set; } = AlertLevelEnum.Warning;
/// <summary>当前值</summary>
public double? CurrentValue { get; set; }
/// <summary>阈值</summary>
public double? ThresholdValue { get; set; }
/// <summary>告警内容描述(空则由告警中心按内置模板生成)</summary>
public string? Content { get; set; }
/// <summary>通知模板编码(预留对接通知模板模块)</summary>
public string? TemplateCode { get; set; }
}
/// <summary>
/// 告警操作 DTO(确认/处理/关闭/忽略/转工单 共用入参)
/// </summary>
public class AlertOperateDto
{
/// <summary>操作人</summary>
public string? Operator { get; set; }
/// <summary>备注(处理说明/忽略原因等)</summary>
public string? Remark { get; set; }
/// <summary>工单Id(仅转工单时使用,二期工单模块创建后回填,可空)</summary>
public long WorkOrderId { get; set; }
}
}
+101
View File
@@ -0,0 +1,101 @@
namespace Model.Dto.Inspection
{
/// <summary>
/// 告警趋势统计项(按日/周/月分桶)
/// </summary>
public class AlertTrendItemDto
{
/// <summary>时间桶(日:yyyy-MM-dd / 周:yyyy-Www / 月:yyyy-MM</summary>
public string Bucket { get; set; }
/// <summary>告警总数</summary>
public int Total { get; set; }
/// <summary>信息级数量</summary>
public int InfoCount { get; set; }
/// <summary>警告级数量</summary>
public int WarningCount { get; set; }
/// <summary>紧急级数量</summary>
public int UrgentCount { get; set; }
/// <summary>未闭环数量(未确认+已确认未处理)</summary>
public int UnhandledCount { get; set; }
}
/// <summary>
/// 告警分布统计项(按设备/类型/级别/来源维度)
/// </summary>
public class AlertDistributionItemDto
{
/// <summary>维度名称</summary>
public string Name { get; set; }
/// <summary>数量</summary>
public int Count { get; set; }
}
/// <summary>
/// 高频告警 TOP 排名项
/// </summary>
public class AlertTopItemDto
{
/// <summary>设备编号</summary>
public string? DeviceCode { get; set; }
/// <summary>设备名称</summary>
public string? DeviceName { get; set; }
/// <summary>告警次数(含合并累计 TriggerCount</summary>
public int Count { get; set; }
/// <summary>最近告警时间</summary>
public DateTime LastAlertTime { get; set; }
}
/// <summary>
/// 告警处理及时率统计
/// </summary>
public class AlertTimelinessDto
{
/// <summary>统计范围内告警总数</summary>
public int Total { get; set; }
/// <summary>已确认数(含已处理/已关闭)</summary>
public int AckCount { get; set; }
/// <summary>已处理/已关闭数</summary>
public int HandledCount { get; set; }
/// <summary>未闭环数</summary>
public int UnhandledCount { get; set; }
/// <summary>平均确认时长(分钟,无确认记录为 null</summary>
public double? AvgAckMinutes { get; set; }
/// <summary>平均处理时长(分钟,无处理记录为 null</summary>
public double? AvgHandleMinutes { get; set; }
/// <summary>及时率(%):30 分钟内确认的占比</summary>
public double TimelyRate { get; set; }
}
/// <summary>
/// 告警概览统计(列表页顶部卡片)
/// </summary>
public class AlertOverviewDto
{
/// <summary>未确认数量</summary>
public int UnacknowledgedCount { get; set; }
/// <summary>今日新增数量</summary>
public int TodayCount { get; set; }
/// <summary>今日紧急数量</summary>
public int TodayUrgentCount { get; set; }
/// <summary>近7日总数</summary>
public int WeekCount { get; set; }
}
}