diff --git a/Sln.Iot.Model/dao/BaseAlarmRule.cs b/Sln.Iot.Model/dao/BaseAlarmRule.cs index 0117c5c..25506ee 100644 --- a/Sln.Iot.Model/dao/BaseAlarmRule.cs +++ b/Sln.Iot.Model/dao/BaseAlarmRule.cs @@ -57,5 +57,11 @@ namespace Sln.Iot.Model.dao /// [SugarColumn(ColumnName = "cause")] public string cause { get; set; } + + /// + /// 告警记录ID,推送数据使用,ORM不用 + /// + [SugarColumn(IsIgnore = true)] + public long alarmId { get; set; } } } diff --git a/Sln.Iot.Model/dao/RecordAlarmData.cs b/Sln.Iot.Model/dao/RecordAlarmData.cs new file mode 100644 index 0000000..8ecdd69 --- /dev/null +++ b/Sln.Iot.Model/dao/RecordAlarmData.cs @@ -0,0 +1,83 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 Wen JY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:ThinkPad T14 +* 命名空间:Sln.Iot.Model.dao +* 唯一标识:50695B31-9DE2-4EE5-A13D-D58B53CDEBBA +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-06-05 10:38:09 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using SqlSugar; + +namespace Sln.Iot.Model.dao; + +/// +///告警数据记录 +/// +[SugarTable("ems_record_alarm_data"), Tenant("tao_iot")] +public class RecordAlarmData +{ + + /// + /// 编号 + /// + [SugarColumn(ColumnName = "obj_id", IsPrimaryKey = true)] + public long objid { get; set; } + + /// + /// Desc:计量设备编号 + /// Default: + /// Nullable:False + /// + [SugarColumn(IsPrimaryKey=true,ColumnName="monitor_id")] + public string monitorId {get;set;} + + /// + /// Desc:采集设备编号 + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="collect_device_id")] + public string collectDeviceId {get;set;} + + /// + /// 触发规则(0大于 1小于) + /// + [SugarColumn(ColumnName = "alarm_type")] + public int triggerRule { get; set; } + + /// + /// 监测字段(0温度,1湿度,2振动-速度(mm/s),3振动-位移(um),4振动-加速度(g),5振动-温度(℃),6-噪音,7-照度) + /// + [SugarColumn(ColumnName = "cause")] + public int monitorField { get;set; } + + /// + /// 告警值 + /// + [SugarColumn(ColumnName = "alarm_data")] + public decimal alarmValue { get;set; } + + /// + /// 采集时间 + /// + [SugarColumn(ColumnName="collect_time" )] + public DateTime? collectTime { get; set; } + +} \ No newline at end of file diff --git a/Sln.Iot.Model/dto/MonitorAlarmDto.cs b/Sln.Iot.Model/dto/MonitorAlarmDto.cs index fa1dd05..26c62c8 100644 --- a/Sln.Iot.Model/dto/MonitorAlarmDto.cs +++ b/Sln.Iot.Model/dto/MonitorAlarmDto.cs @@ -19,7 +19,7 @@ namespace Sln.Iot.Model.dto /// 是否报警:1-是;0-否 /// public int isFlag { get;set; } - + /// /// 设备参数 /// diff --git a/Sln.Iot.Repository/Class1.cs b/Sln.Iot.Repository/Class1.cs deleted file mode 100644 index e063971..0000000 --- a/Sln.Iot.Repository/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Sln.Iot.Repository; - -public class Class1 -{ -} \ No newline at end of file diff --git a/Sln.Iot.Repository/service/IRecordAlarmDataService.cs b/Sln.Iot.Repository/service/IRecordAlarmDataService.cs new file mode 100644 index 0000000..c51c11d --- /dev/null +++ b/Sln.Iot.Repository/service/IRecordAlarmDataService.cs @@ -0,0 +1,9 @@ +using Sln.Iot.Model.dao; +using Sln.Iot.Repository.service.@base; + +namespace Sln.Iot.Repository.service; + +public interface IRecordAlarmDataService:IBaseService +{ + +} \ No newline at end of file diff --git a/Sln.Iot.Repository/service/Impl/RecordAlarmDataServiceImpl.cs b/Sln.Iot.Repository/service/Impl/RecordAlarmDataServiceImpl.cs new file mode 100644 index 0000000..ed77e54 --- /dev/null +++ b/Sln.Iot.Repository/service/Impl/RecordAlarmDataServiceImpl.cs @@ -0,0 +1,36 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 Wen JY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:ThinkPad T14 +* 命名空间:Sln.Iot.Repository.service.Impl +* 唯一标识:0838E02D-6FDB-4D1D-8A1F-B78B582EE185 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-06-05 10:46:10 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using Sln.Iot.Model.dao; +using Sln.Iot.Repository.service.@base; + +namespace Sln.Iot.Repository.service.Impl; + +public class RecordAlarmDataServiceImpl: BaseServiceImpl, IRecordAlarmDataService +{ + public RecordAlarmDataServiceImpl(Repository rep) : base(rep) + { + } +} \ No newline at end of file diff --git a/Sln.Iot.Serial/SerialExtensions.cs b/Sln.Iot.Serial/SerialExtensions.cs index 1fca02f..a7b13c8 100644 --- a/Sln.Iot.Serial/SerialExtensions.cs +++ b/Sln.Iot.Serial/SerialExtensions.cs @@ -28,6 +28,8 @@ namespace Sln.Iot.Serial IBaseAlarmRuleService _alarmRuleService = service.GetService(); + IRecordAlarmDataService _alarmDataService = service.GetService(); + WebSocketBusiness webSocket = service.GetService(); var logger = service.GetService(); @@ -108,7 +110,7 @@ namespace Sln.Iot.Serial logger.Info($"物联网数据保存{(inRes ? "成功" : "失败")}"); - ParamAlarmFilter(iotEnvInstants,_alarmRuleService,logger, webSocket); + ParamAlarmFilter(iotEnvInstants,_alarmRuleService,logger, webSocket,_alarmDataService); } catch (Exception ex) { @@ -127,7 +129,7 @@ namespace Sln.Iot.Serial } } - private static void ParamAlarmFilter(List iotEnvInstants, IBaseAlarmRuleService _alarmRuleService, SerilogHelper _logger, WebSocketBusiness _webSocket) + private static void ParamAlarmFilter(List iotEnvInstants, IBaseAlarmRuleService _alarmRuleService, SerilogHelper _logger, WebSocketBusiness _webSocket,IRecordAlarmDataService _alarmDataService) { if (iotEnvInstants == null) { @@ -170,11 +172,26 @@ namespace Sln.Iot.Serial : 0; var comparer = CreateComparer(rule.triggerRule); - + if (comparer(paramValue, rule.triggerValue)) { + var alarmId=SnowFlakeSingle.Instance.NextId(); + + rule.alarmId = alarmId; ruleRes.Add(rule); alarmContents.Add($"{item.monitorId}传感器数据在{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}触发{rule.ruleName}异常告警,告警规则:{(rule.triggerRule == 0 ? "大于" : "小于")},阈值:{rule.triggerValue},详细信息:{rule.cause}"); + + SaveAlarmData(new RecordAlarmData() + { + objid = alarmId, + monitorId = item.monitorId, + collectDeviceId = item.monitorId.substring(0,5), + triggerRule = rule.triggerRule, + monitorField = rule.monitorField, + alarmValue = paramValue, + collectTime = DateTime.Now, + + },_alarmDataService,_logger); } } @@ -194,5 +211,22 @@ namespace Sln.Iot.Serial } } + + private static void SaveAlarmData(RecordAlarmData alarmData,IRecordAlarmDataService _alarmDataService, SerilogHelper _logger) + { + try + { + var insert = _alarmDataService.Insert(alarmData); + + string str = JsonConvert.SerializeObject(alarmData); + + _logger.Info($"传感器:{alarmData.monitorId};告警数据:{str},保存{(insert ? "成功" : "失败")}"); + } + catch (Exception e) + { + _logger.Info($"传感器:{alarmData.monitorId};告警数据保存异常:{e.Message}"); + } + } + } } diff --git a/Sln.Iot.Serial/Sln.Iot.Serial.csproj b/Sln.Iot.Serial/Sln.Iot.Serial.csproj index dae9b9b..dea2d33 100644 --- a/Sln.Iot.Serial/Sln.Iot.Serial.csproj +++ b/Sln.Iot.Serial/Sln.Iot.Serial.csproj @@ -19,10 +19,4 @@ - - - Always - - - diff --git a/Sln.Iot.Serial/libnserial.so.1 b/Sln.Iot.Serial/libnserial.so.1 deleted file mode 100644 index 5b93c2a..0000000 Binary files a/Sln.Iot.Serial/libnserial.so.1 and /dev/null differ diff --git a/Sln.Iot/Sln.Iot.csproj b/Sln.Iot/Sln.Iot.csproj index e953348..2b5083d 100644 --- a/Sln.Iot/Sln.Iot.csproj +++ b/Sln.Iot/Sln.Iot.csproj @@ -28,9 +28,6 @@ PreserveNewest - - Always - diff --git a/Sln.Iot/libnserial.so.1 b/Sln.Iot/libnserial.so.1 deleted file mode 100644 index 5b93c2a..0000000 Binary files a/Sln.Iot/libnserial.so.1 and /dev/null differ