Merge remote-tracking branch 'origin/master'(告警中心/通知模块 与 产品/物模型模块 合并,EntityMapper.cs 保留双方映射区域)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
using Model.Entity.Inspection;
|
||||
|
||||
namespace Model.Dto.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警消息 DTO(Id 转 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; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
using Model.Entity.Inspection;
|
||||
|
||||
namespace Model.Dto.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 通知渠道 DTO(Id 转 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; }
|
||||
}
|
||||
}
|
||||
@@ -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>完整推送报文 JSON(AlertOutboxPayload 序列化)</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>
|
||||
/// 发件箱结果回写 DTO(AlertBridge 推送完成后回写)
|
||||
/// </summary>
|
||||
public class OutboxResultDto
|
||||
{
|
||||
/// <summary>是否成功</summary>
|
||||
public bool Success { get; set; }
|
||||
|
||||
/// <summary>结果信息(失败原因)</summary>
|
||||
public string? ResultMsg { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,221 @@
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警级别(与规则引擎 AlertRuleEntity.AlarmLevel 字符串"信息/警告/紧急"保持一致)
|
||||
/// </summary>
|
||||
public enum AlertLevelEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 信息
|
||||
/// </summary>
|
||||
Info = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 警告
|
||||
/// </summary>
|
||||
Warning = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 紧急
|
||||
/// </summary>
|
||||
Urgent = 3
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 告警状态(闭环流转:未确认 → 已确认 → 已处理 → 已关闭;可忽略/转工单)
|
||||
/// </summary>
|
||||
public enum AlertStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未确认
|
||||
/// </summary>
|
||||
Unacknowledged = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 已确认
|
||||
/// </summary>
|
||||
Acknowledged = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 已处理
|
||||
/// </summary>
|
||||
Handled = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 已关闭
|
||||
/// </summary>
|
||||
Closed = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 已忽略
|
||||
/// </summary>
|
||||
Ignored = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 已转工单
|
||||
/// </summary>
|
||||
ToWorkOrder = 6
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 告警来源(标识上报模块,便于其它模块调用与统计)
|
||||
/// </summary>
|
||||
public enum AlertSourceEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 规则引擎
|
||||
/// </summary>
|
||||
RuleEngine = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 自动巡检
|
||||
/// </summary>
|
||||
AutoPatrol = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 数据看板
|
||||
/// </summary>
|
||||
Dashboard = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 数据采集
|
||||
/// </summary>
|
||||
Collection = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 手动/API 上报
|
||||
/// </summary>
|
||||
Manual = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 其它
|
||||
/// </summary>
|
||||
Other = 99
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 告警类型
|
||||
/// </summary>
|
||||
public enum AlertTypeEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 阈值超限
|
||||
/// </summary>
|
||||
ThresholdExceed = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 设备离线
|
||||
/// </summary>
|
||||
DeviceOffline = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 通讯故障
|
||||
/// </summary>
|
||||
CommFault = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 巡检异常
|
||||
/// </summary>
|
||||
PatrolAbnormal = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 自定义
|
||||
/// </summary>
|
||||
Custom = 99
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通知渠道类型(一期仅支持飞书/钉钉/企微 Webhook 机器人)
|
||||
/// </summary>
|
||||
public enum NotifyChannelTypeEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 飞书
|
||||
/// </summary>
|
||||
Feishu = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉
|
||||
/// </summary>
|
||||
DingTalk = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 企业微信
|
||||
/// </summary>
|
||||
WeCom = 3
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 渠道推送模式
|
||||
/// </summary>
|
||||
public enum NotifyPushModeEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 直连推送(服务器可直接访问外网 Webhook)
|
||||
/// </summary>
|
||||
Direct = 1,
|
||||
|
||||
/// <summary>
|
||||
/// Outbox 中转(跨网场景:内网写发件箱,跳板机 AlertBridge 拉取后在外网推送)
|
||||
/// </summary>
|
||||
Outbox = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 跨网发件箱状态
|
||||
/// </summary>
|
||||
public enum OutboxStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 待推送
|
||||
/// </summary>
|
||||
Pending = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 已拉取(跳板机取走,等待回写结果)
|
||||
/// </summary>
|
||||
Pulled = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 推送成功
|
||||
/// </summary>
|
||||
Success = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 推送失败
|
||||
/// </summary>
|
||||
Failed = 4
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 告警级别枚举 ↔ 规则引擎字符串 映射工具
|
||||
/// </summary>
|
||||
public static class AlertLevelMap
|
||||
{
|
||||
/// <summary>
|
||||
/// 字符串(信息/警告/紧急)→ 枚举,无法识别时默认 Info
|
||||
/// </summary>
|
||||
public static AlertLevelEnum FromString(string level)
|
||||
{
|
||||
return level?.Trim() switch
|
||||
{
|
||||
"警告" => AlertLevelEnum.Warning,
|
||||
"紧急" => AlertLevelEnum.Urgent,
|
||||
_ => AlertLevelEnum.Info
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 枚举 → 字符串(信息/警告/紧急)
|
||||
/// </summary>
|
||||
public static string ToLabel(AlertLevelEnum level)
|
||||
{
|
||||
return level switch
|
||||
{
|
||||
AlertLevelEnum.Warning => "警告",
|
||||
AlertLevelEnum.Urgent => "紧急",
|
||||
_ => "信息"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警消息(消息告警模块核心表:所有模块的告警统一汇聚于此,支持确认/处理/关闭闭环)
|
||||
/// </summary>
|
||||
public class AlertMessageEntity : BaseEntity
|
||||
{
|
||||
#region 溯源信息
|
||||
/// <summary>
|
||||
/// 告警来源(规则引擎/自动巡检/看板/数采/手动等)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警来源")]
|
||||
public AlertSourceEnum Source { get; set; } = AlertSourceEnum.Manual;
|
||||
|
||||
/// <summary>
|
||||
/// 关联告警规则Id(来源为规则引擎时填写,0表示无)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "关联告警规则Id")]
|
||||
public long RuleId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备编号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "设备编号", Length = 64, IsNullable = true)]
|
||||
public string DeviceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "设备名称", Length = 128, IsNullable = true)]
|
||||
public string DeviceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备类型(如 TemperatureBox,与规则引擎 DeviceType 对齐)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "设备类型", Length = 64, IsNullable = true)]
|
||||
public string DeviceType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 测点/监测指标(如 Temperature、Humidity)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "测点指标", Length = 64, IsNullable = true)]
|
||||
public string Metric { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警类型(超限/离线/通讯故障/巡检异常/自定义)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警类型")]
|
||||
public AlertTypeEnum AlertType { get; set; } = AlertTypeEnum.ThresholdExceed;
|
||||
#endregion
|
||||
|
||||
#region 告警内容
|
||||
/// <summary>
|
||||
/// 告警级别(信息/警告/紧急,与规则引擎三级一致)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警级别")]
|
||||
public AlertLevelEnum AlertLevel { get; set; } = AlertLevelEnum.Info;
|
||||
|
||||
/// <summary>
|
||||
/// 当前值(触发告警时的实际值)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "当前值", IsNullable = true)]
|
||||
public double? CurrentValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 阈值(规则阈值,可空)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "阈值", IsNullable = true)]
|
||||
public double? ThresholdValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警内容描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警内容", Length = 500, IsNullable = true)]
|
||||
public string Content { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 通知模板编码(预留:对接通知模板模块,空表示使用内置模板)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "通知模板编码", Length = 64, IsNullable = true)]
|
||||
public string TemplateCode { get; set; }
|
||||
#endregion
|
||||
|
||||
#region 聚合信息(去重合并窗口内累加)
|
||||
/// <summary>
|
||||
/// 触发次数(合并窗口内同设备同测点同类型告警的累计次数)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "触发次数")]
|
||||
public int TriggerCount { get; set; } = 1;
|
||||
|
||||
/// <summary>
|
||||
/// 首次告警时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "首次告警时间")]
|
||||
public DateTime FirstAlertTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最近告警时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "最近告警时间")]
|
||||
public DateTime LastAlertTime { get; set; }
|
||||
#endregion
|
||||
|
||||
#region 闭环信息
|
||||
/// <summary>
|
||||
/// 告警状态(未确认/已确认/已处理/已关闭/已忽略/已转工单)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警状态")]
|
||||
public AlertStatusEnum AlertStatus { get; set; } = AlertStatusEnum.Unacknowledged;
|
||||
|
||||
/// <summary>
|
||||
/// 确认人
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "确认人", Length = 50, IsNullable = true)]
|
||||
public string AckBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 确认时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "确认时间", IsNullable = true)]
|
||||
public DateTime? AckTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理人
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "处理人", Length = 50, IsNullable = true)]
|
||||
public string HandleBy { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "处理时间", IsNullable = true)]
|
||||
public DateTime? HandleTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "处理备注", Length = 500, IsNullable = true)]
|
||||
public string HandleRemark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联工单Id(预留二期运维工单模块,0表示未转工单)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "关联工单Id")]
|
||||
public long WorkOrderId { get; set; }
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警通知渠道(飞书/钉钉/企微 Webhook 机器人配置)
|
||||
/// </summary>
|
||||
public class AlertNotifyChannelEntity : BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 渠道类型(1飞书/2钉钉/3企微)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "渠道类型")]
|
||||
public NotifyChannelTypeEnum ChannelType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 渠道名称(如:设备告警-研发飞书群)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "渠道名称", Length = 100)]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Webhook 地址
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "Webhook地址", Length = 500)]
|
||||
public string WebhookUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 加签密钥(钉钉/飞书机器人开启加签时填写,企微机器人无此项)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "加签密钥", Length = 200, IsNullable = true)]
|
||||
public string Secret { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送模式(1直连推送/2Outbox跨网中转)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "推送模式")]
|
||||
public NotifyPushModeEnum PushMode { get; set; } = NotifyPushModeEnum.Direct;
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否启用")]
|
||||
public bool IsEnabled { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "备注", Length = 500, IsNullable = true)]
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警通知推送日志(每次向渠道推送的结果记录,失败可追溯)
|
||||
/// </summary>
|
||||
public class AlertNotifyLogEntity : BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警消息Id(关联 AlertMessageEntity.Id,0表示渠道测试推送)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警消息Id")]
|
||||
public long AlertId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 渠道类型(1飞书/2钉钉/3企微)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "渠道类型")]
|
||||
public NotifyChannelTypeEnum ChannelType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 渠道Id(关联 AlertNotifyChannelEntity.Id)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "渠道Id")]
|
||||
public long ChannelId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送目标(Webhook 地址脱敏展示)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "推送目标", Length = 200, IsNullable = true)]
|
||||
public string Target { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送内容摘要
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "推送内容", Length = 1000, IsNullable = true)]
|
||||
public string Content { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否成功
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否成功")]
|
||||
public bool Success { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "错误信息", Length = 500, IsNullable = true)]
|
||||
public string ErrorMsg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 重试次数
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "重试次数")]
|
||||
public int RetryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "推送时间")]
|
||||
public DateTime NotifyTime { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警通知规则(按告警级别配置通知渠道与接收人,支持值班排班关联与静默期)
|
||||
/// </summary>
|
||||
public class AlertNotifyRuleEntity : BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 规则名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "规则名称", Length = 100)]
|
||||
public string RuleName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 适用告警级别(信息/警告/紧急)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "适用告警级别")]
|
||||
public AlertLevelEnum AlertLevel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 通知渠道Id(关联 AlertNotifyChannelEntity.Id)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "通知渠道Id")]
|
||||
public long ChannelId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 接收人(@手机号/企微账号,逗号分隔,可空表示不@)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "接收人", Length = 500, IsNullable = true)]
|
||||
public string Receivers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否通知当班值班人(按告警时间查值班排班表)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否通知值班人")]
|
||||
public bool NotifyDutyPerson { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 静默期(分钟):同一告警合并窗口内重复触发时,静默期内不重复推送,0表示每次必推
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "静默期分钟")]
|
||||
public int SilenceMinutes { get; set; } = 5;
|
||||
|
||||
/// <summary>
|
||||
/// 是否启用
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "是否启用")]
|
||||
public bool IsEnabled { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "备注", Length = 500, IsNullable = true)]
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 跨网推送发件箱(内网只写此表;跳板机上的 AlertBridge 控制台程序轮询拉取,
|
||||
/// 在外网推送飞书/钉钉/企微后回写结果,实现工控内网与即时通讯软件的隔离穿透)
|
||||
/// </summary>
|
||||
public class AlertOutboxEntity : BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警消息Id(关联 AlertMessageEntity.Id)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "告警消息Id")]
|
||||
public long AlertId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 渠道Id(关联 AlertNotifyChannelEntity.Id)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "渠道Id")]
|
||||
public long ChannelId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 完整推送报文(自包含 JSON:渠道类型/WebhookUrl/Secret/标题/内容/@列表,
|
||||
/// AlertBridge 拉取后无需再查任何配置即可直接推送)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "推送报文", ColumnDataType = "text", IsNullable = true)]
|
||||
public string Payload { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 状态(1待推送/2已拉取/3成功/4失败)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "状态")]
|
||||
public OutboxStatusEnum Status { get; set; } = OutboxStatusEnum.Pending;
|
||||
|
||||
/// <summary>
|
||||
/// 重试次数(AlertBridge 推送失败回写时累加)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "重试次数")]
|
||||
public int RetryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 拉取时间
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "拉取时间", IsNullable = true)]
|
||||
public DateTime? PullTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 完成时间(成功/失败回写时间)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "完成时间", IsNullable = true)]
|
||||
public DateTime? FinishTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 结果信息(失败原因等)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "结果信息", Length = 500, IsNullable = true)]
|
||||
public string ResultMsg { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace Model.Entity.Inspection
|
||||
{
|
||||
/// <summary>
|
||||
/// 值班排班(按天排班;通知规则勾选"通知值班人"时按告警日期匹配当班人)
|
||||
/// </summary>
|
||||
public class DutyRosterEntity : BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 值班日期(当天 00:00:00)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "值班日期")]
|
||||
public DateTime DutyDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 值班人姓名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "值班人", Length = 50)]
|
||||
public string PersonName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 联系电话(用于钉钉/企微 @ 手机号)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "联系电话", Length = 30, IsNullable = true)]
|
||||
public string Phone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "备注", Length = 500, IsNullable = true)]
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -665,5 +665,275 @@ namespace Model.Mapper
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 告警消息
|
||||
/// <summary>
|
||||
/// AlertMessageEntity → AlertMessageDto
|
||||
/// </summary>
|
||||
public static AlertMessageDto ToDto(this AlertMessageEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new AlertMessageDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
CreateTime = entity.CreateTime,
|
||||
Source = entity.Source,
|
||||
RuleId = entity.RuleId.ToString(),
|
||||
DeviceCode = entity.DeviceCode,
|
||||
DeviceName = entity.DeviceName,
|
||||
DeviceType = entity.DeviceType,
|
||||
Metric = entity.Metric,
|
||||
AlertType = entity.AlertType,
|
||||
AlertLevel = entity.AlertLevel,
|
||||
CurrentValue = entity.CurrentValue,
|
||||
ThresholdValue = entity.ThresholdValue,
|
||||
Content = entity.Content,
|
||||
TemplateCode = entity.TemplateCode,
|
||||
TriggerCount = entity.TriggerCount,
|
||||
FirstAlertTime = entity.FirstAlertTime,
|
||||
LastAlertTime = entity.LastAlertTime,
|
||||
AlertStatus = entity.AlertStatus,
|
||||
AckBy = entity.AckBy,
|
||||
AckTime = entity.AckTime,
|
||||
HandleBy = entity.HandleBy,
|
||||
HandleTime = entity.HandleTime,
|
||||
HandleRemark = entity.HandleRemark,
|
||||
WorkOrderId = entity.WorkOrderId.ToString()
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<AlertMessageEntity> → List<AlertMessageDto>
|
||||
/// </summary>
|
||||
public static List<AlertMessageDto> ToDtoList(this List<AlertMessageEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<AlertMessageDto>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AlertRaiseDto → AlertMessageEntity(告警中心上报入参映射;
|
||||
/// 状态/闭环/聚合字段由服务端初始化,不接受调用方指定)
|
||||
/// </summary>
|
||||
public static AlertMessageEntity ToEntity(this AlertRaiseDto dto)
|
||||
{
|
||||
if (dto == null) return null;
|
||||
return new AlertMessageEntity
|
||||
{
|
||||
Source = dto.Source,
|
||||
RuleId = dto.RuleId,
|
||||
DeviceCode = dto.DeviceCode,
|
||||
DeviceName = dto.DeviceName,
|
||||
DeviceType = dto.DeviceType,
|
||||
Metric = dto.Metric,
|
||||
AlertType = dto.AlertType,
|
||||
AlertLevel = dto.AlertLevel,
|
||||
CurrentValue = dto.CurrentValue,
|
||||
ThresholdValue = dto.ThresholdValue,
|
||||
Content = dto.Content,
|
||||
TemplateCode = dto.TemplateCode
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 告警通知渠道
|
||||
/// <summary>
|
||||
/// AlertNotifyChannelEntity → AlertNotifyChannelDto(Secret 脱敏:不回传明文,仅标记 HasSecret)
|
||||
/// </summary>
|
||||
public static AlertNotifyChannelDto ToDto(this AlertNotifyChannelEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new AlertNotifyChannelDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
CreateTime = entity.CreateTime,
|
||||
ChannelType = entity.ChannelType,
|
||||
Name = entity.Name,
|
||||
WebhookUrl = entity.WebhookUrl,
|
||||
Secret = null,
|
||||
HasSecret = !string.IsNullOrWhiteSpace(entity.Secret),
|
||||
PushMode = entity.PushMode,
|
||||
IsEnabled = entity.IsEnabled,
|
||||
Remark = entity.Remark
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<AlertNotifyChannelEntity> → List<AlertNotifyChannelDto>
|
||||
/// </summary>
|
||||
public static List<AlertNotifyChannelDto> ToDtoList(this List<AlertNotifyChannelEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<AlertNotifyChannelDto>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AlertNotifyChannelDto → AlertNotifyChannelEntity(IsDel/CreateTime 不映射)
|
||||
/// </summary>
|
||||
public static AlertNotifyChannelEntity ToEntity(this AlertNotifyChannelDto dto)
|
||||
{
|
||||
if (dto == null) return null;
|
||||
return new AlertNotifyChannelEntity
|
||||
{
|
||||
Id = ParseId(dto.Id),
|
||||
ChannelType = dto.ChannelType,
|
||||
Name = dto.Name,
|
||||
WebhookUrl = dto.WebhookUrl,
|
||||
Secret = dto.Secret,
|
||||
PushMode = dto.PushMode,
|
||||
IsEnabled = dto.IsEnabled,
|
||||
Remark = dto.Remark
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 告警通知规则
|
||||
/// <summary>
|
||||
/// AlertNotifyRuleEntity → AlertNotifyRuleDto
|
||||
/// </summary>
|
||||
public static AlertNotifyRuleDto ToDto(this AlertNotifyRuleEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new AlertNotifyRuleDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
CreateTime = entity.CreateTime,
|
||||
RuleName = entity.RuleName,
|
||||
AlertLevel = entity.AlertLevel,
|
||||
ChannelId = entity.ChannelId.ToString(),
|
||||
Receivers = entity.Receivers,
|
||||
NotifyDutyPerson = entity.NotifyDutyPerson,
|
||||
SilenceMinutes = entity.SilenceMinutes,
|
||||
IsEnabled = entity.IsEnabled,
|
||||
Remark = entity.Remark
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<AlertNotifyRuleEntity> → List<AlertNotifyRuleDto>
|
||||
/// </summary>
|
||||
public static List<AlertNotifyRuleDto> ToDtoList(this List<AlertNotifyRuleEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<AlertNotifyRuleDto>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AlertNotifyRuleDto → AlertNotifyRuleEntity(IsDel/CreateTime 不映射)
|
||||
/// </summary>
|
||||
public static AlertNotifyRuleEntity ToEntity(this AlertNotifyRuleDto dto)
|
||||
{
|
||||
if (dto == null) return null;
|
||||
return new AlertNotifyRuleEntity
|
||||
{
|
||||
Id = ParseId(dto.Id),
|
||||
RuleName = dto.RuleName,
|
||||
AlertLevel = dto.AlertLevel,
|
||||
ChannelId = ParseId(dto.ChannelId),
|
||||
Receivers = dto.Receivers,
|
||||
NotifyDutyPerson = dto.NotifyDutyPerson,
|
||||
SilenceMinutes = dto.SilenceMinutes,
|
||||
IsEnabled = dto.IsEnabled,
|
||||
Remark = dto.Remark
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 告警通知日志
|
||||
/// <summary>
|
||||
/// AlertNotifyLogEntity → AlertNotifyLogDto
|
||||
/// </summary>
|
||||
public static AlertNotifyLogDto ToDto(this AlertNotifyLogEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new AlertNotifyLogDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
AlertId = entity.AlertId.ToString(),
|
||||
ChannelType = entity.ChannelType,
|
||||
ChannelId = entity.ChannelId.ToString(),
|
||||
Target = entity.Target,
|
||||
Content = entity.Content,
|
||||
Success = entity.Success,
|
||||
ErrorMsg = entity.ErrorMsg,
|
||||
RetryCount = entity.RetryCount,
|
||||
NotifyTime = entity.NotifyTime
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<AlertNotifyLogEntity> → List<AlertNotifyLogDto>
|
||||
/// </summary>
|
||||
public static List<AlertNotifyLogDto> ToDtoList(this List<AlertNotifyLogEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<AlertNotifyLogDto>();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 跨网发件箱
|
||||
/// <summary>
|
||||
/// AlertOutboxEntity → AlertOutboxItemDto
|
||||
/// </summary>
|
||||
public static AlertOutboxItemDto ToDto(this AlertOutboxEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new AlertOutboxItemDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
AlertId = entity.AlertId.ToString(),
|
||||
ChannelId = entity.ChannelId.ToString(),
|
||||
Payload = entity.Payload,
|
||||
RetryCount = entity.RetryCount
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<AlertOutboxEntity> → List<AlertOutboxItemDto>
|
||||
/// </summary>
|
||||
public static List<AlertOutboxItemDto> ToDtoList(this List<AlertOutboxEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<AlertOutboxItemDto>();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 值班排班
|
||||
/// <summary>
|
||||
/// DutyRosterEntity → DutyRosterDto
|
||||
/// </summary>
|
||||
public static DutyRosterDto ToDto(this DutyRosterEntity entity)
|
||||
{
|
||||
if (entity == null) return null;
|
||||
return new DutyRosterDto
|
||||
{
|
||||
Id = entity.Id.ToString(),
|
||||
CreateTime = entity.CreateTime,
|
||||
DutyDate = entity.DutyDate,
|
||||
PersonName = entity.PersonName,
|
||||
Phone = entity.Phone,
|
||||
Remark = entity.Remark
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List<DutyRosterEntity> → List<DutyRosterDto>
|
||||
/// </summary>
|
||||
public static List<DutyRosterDto> ToDtoList(this List<DutyRosterEntity> entities)
|
||||
{
|
||||
return entities?.Select(e => e.ToDto()).ToList() ?? new List<DutyRosterDto>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DutyRosterDto → DutyRosterEntity(IsDel/CreateTime 不映射)
|
||||
/// </summary>
|
||||
public static DutyRosterEntity ToEntity(this DutyRosterDto dto)
|
||||
{
|
||||
if (dto == null) return null;
|
||||
return new DutyRosterEntity
|
||||
{
|
||||
Id = ParseId(dto.Id),
|
||||
DutyDate = dto.DutyDate.Date,
|
||||
PersonName = dto.PersonName,
|
||||
Phone = dto.Phone,
|
||||
Remark = dto.Remark
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user