mirror of
https://gitee.com/ThingsGateway/ThingsGateway.git
synced 2025-10-20 10:50:48 +08:00
示例
This commit is contained in:
@@ -1,56 +1,56 @@
|
||||
////------------------------------------------------------------------------------
|
||||
////此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
//// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
//// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
//// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
//// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
//// 使用文档:https://thingsgateway.cn/
|
||||
//// QQ群:605534569
|
||||
//// ------------------------------------------------------------------------------
|
||||
//////------------------------------------------------------------------------------
|
||||
//////此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
////// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
////// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
////// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
////// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
////// 使用文档:https://thingsgateway.cn/
|
||||
////// QQ群:605534569
|
||||
////// ------------------------------------------------------------------------------
|
||||
|
||||
using System.Dynamic;
|
||||
//using System.Dynamic;
|
||||
|
||||
using ThingsGateway.Foundation;
|
||||
using ThingsGateway.Gateway.Application;
|
||||
public class TestDynamicModel : IDynamicModel
|
||||
{
|
||||
public IEnumerable<dynamic> GetList(IEnumerable<object> datas)
|
||||
{
|
||||
if (datas == null) return null;
|
||||
List<ExpandoObject> deviceObjs = new List<ExpandoObject>();
|
||||
//按设备名称分组
|
||||
var groups = datas.Where(a => !string.IsNullOrEmpty(((AlarmVariable)a).DeviceName)).GroupBy(a => ((AlarmVariable)a).DeviceName, a => ((AlarmVariable)a));
|
||||
foreach (var group in groups)
|
||||
{
|
||||
//按采集时间分组
|
||||
var data = group.GroupBy(a => a.AlarmTime.DateTimeToUnixTimestamp());
|
||||
var deviceObj = new ExpandoObject();
|
||||
List<ExpandoObject> expandos = new List<ExpandoObject>();
|
||||
foreach (var item in data)
|
||||
{
|
||||
var expando = new ExpandoObject();
|
||||
expando.TryAdd("ts", item.Key);
|
||||
var variableObj = new ExpandoObject();
|
||||
foreach (var tag in item)
|
||||
{
|
||||
var alarmObj = new ExpandoObject();
|
||||
alarmObj.TryAdd(nameof(tag.AlarmCode), tag.AlarmCode);
|
||||
alarmObj.TryAdd(nameof(tag.AlarmText), tag.AlarmText);
|
||||
alarmObj.TryAdd(nameof(tag.AlarmType), tag.AlarmType);
|
||||
alarmObj.TryAdd(nameof(tag.AlarmLimit), tag.AlarmLimit);
|
||||
alarmObj.TryAdd(nameof(tag.EventTime), tag.EventTime);
|
||||
alarmObj.TryAdd(nameof(tag.EventType), tag.EventType);
|
||||
//using ThingsGateway.Foundation;
|
||||
//using ThingsGateway.Gateway.Application;
|
||||
//public class TestDynamicModel : IDynamicModel
|
||||
//{
|
||||
// public IEnumerable<dynamic> GetList(IEnumerable<object> datas)
|
||||
// {
|
||||
// if (datas == null) return null;
|
||||
// List<ExpandoObject> deviceObjs = new List<ExpandoObject>();
|
||||
// //按设备名称分组
|
||||
// var groups = datas.Where(a => !string.IsNullOrEmpty(((AlarmVariable)a).DeviceName)).GroupBy(a => ((AlarmVariable)a).DeviceName, a => ((AlarmVariable)a));
|
||||
// foreach (var group in groups)
|
||||
// {
|
||||
// //按采集时间分组
|
||||
// var data = group.GroupBy(a => a.AlarmTime.DateTimeToUnixTimestamp());
|
||||
// var deviceObj = new ExpandoObject();
|
||||
// List<ExpandoObject> expandos = new List<ExpandoObject>();
|
||||
// foreach (var item in data)
|
||||
// {
|
||||
// var expando = new ExpandoObject();
|
||||
// expando.TryAdd("ts", item.Key);
|
||||
// var variableObj = new ExpandoObject();
|
||||
// foreach (var tag in item)
|
||||
// {
|
||||
// var alarmObj = new ExpandoObject();
|
||||
// alarmObj.TryAdd(nameof(tag.AlarmCode), tag.AlarmCode);
|
||||
// alarmObj.TryAdd(nameof(tag.AlarmText), tag.AlarmText);
|
||||
// alarmObj.TryAdd(nameof(tag.AlarmType), tag.AlarmType);
|
||||
// alarmObj.TryAdd(nameof(tag.AlarmLimit), tag.AlarmLimit);
|
||||
// alarmObj.TryAdd(nameof(tag.EventTime), tag.EventTime);
|
||||
// alarmObj.TryAdd(nameof(tag.EventType), tag.EventType);
|
||||
|
||||
variableObj.TryAdd(tag.Name, alarmObj);
|
||||
}
|
||||
expando.TryAdd("alarms", variableObj);
|
||||
// variableObj.TryAdd(tag.Name, alarmObj);
|
||||
// }
|
||||
// expando.TryAdd("alarms", variableObj);
|
||||
|
||||
expandos.Add(expando);
|
||||
}
|
||||
deviceObj.TryAdd(group.Key, expandos);
|
||||
deviceObjs.Add(deviceObj);
|
||||
}
|
||||
// expandos.Add(expando);
|
||||
// }
|
||||
// deviceObj.TryAdd(group.Key, expandos);
|
||||
// deviceObjs.Add(deviceObj);
|
||||
// }
|
||||
|
||||
return deviceObjs;
|
||||
}
|
||||
}
|
||||
// return deviceObjs;
|
||||
// }
|
||||
//}
|
@@ -1,223 +1,223 @@
|
||||
////------------------------------------------------------------------------------
|
||||
////此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
//// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
//// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
//// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
//// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
//// 使用文档:https://thingsgateway.cn/
|
||||
//// QQ群:605534569
|
||||
//// ------------------------------------------------------------------------------
|
||||
//////------------------------------------------------------------------------------
|
||||
//////此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
////// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
////// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
////// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
////// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
////// 使用文档:https://thingsgateway.cn/
|
||||
////// QQ群:605534569
|
||||
////// ------------------------------------------------------------------------------
|
||||
|
||||
using ThingsGateway.Foundation;
|
||||
using ThingsGateway.Gateway.Application;
|
||||
using ThingsGateway.NewLife.Extension;
|
||||
public class TestKafkaDynamicModel : DynamicModelBase
|
||||
{
|
||||
private Dictionary<string, VariableRuntime> variableRuntimes = new();
|
||||
//using ThingsGateway.Foundation;
|
||||
//using ThingsGateway.Gateway.Application;
|
||||
//using ThingsGateway.NewLife.Extension;
|
||||
//public class TestKafkaDynamicModel : DynamicModelBase
|
||||
//{
|
||||
// private Dictionary<string, VariableRuntime> variableRuntimes = new();
|
||||
|
||||
private long id = 0;
|
||||
// private long id = 0;
|
||||
|
||||
public TestKafkaDynamicModel()
|
||||
{
|
||||
var name = "kafka1";
|
||||
if (GlobalData.ReadOnlyDevices.TryGetValue(name, out var kafka1))
|
||||
{
|
||||
id = kafka1.Id;
|
||||
// public TestKafkaDynamicModel()
|
||||
// {
|
||||
// var name = "kafka1";
|
||||
// if (GlobalData.ReadOnlyDevices.TryGetValue(name, out var kafka1))
|
||||
// {
|
||||
// id = kafka1.Id;
|
||||
|
||||
foreach (var item in kafka1.Driver?.IdVariableRuntimes)
|
||||
{
|
||||
//变量备注1作为Key(AE报警SourceId)
|
||||
var data1 = item.Value.GetPropertyValue(id, nameof(BusinessVariableProperty.Data1));
|
||||
if (!data1.IsNullOrEmpty())
|
||||
{
|
||||
variableRuntimes.Add(data1, item.Value);
|
||||
}
|
||||
}
|
||||
// foreach (var item in kafka1.Driver?.IdVariableRuntimes)
|
||||
// {
|
||||
// //变量备注1作为Key(AE报警SourceId)
|
||||
// var data1 = item.Value.GetPropertyValue(id, nameof(BusinessVariableProperty.Data1));
|
||||
// if (!data1.IsNullOrEmpty())
|
||||
// {
|
||||
// variableRuntimes.Add(data1, item.Value);
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception($"找不到设备 {name}");
|
||||
}
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// throw new Exception($"找不到设备 {name}");
|
||||
// }
|
||||
|
||||
}
|
||||
public override IEnumerable<dynamic> GetList(IEnumerable<object> datas)
|
||||
{
|
||||
if (datas == null) return null;
|
||||
var pluginEventDatas = datas.Cast<PluginEventData>();
|
||||
var opcDatas = pluginEventDatas.Select(
|
||||
a =>
|
||||
{
|
||||
if (a.ObjectValue == null)
|
||||
{
|
||||
a.ObjectValue = a.Value.ToObject(Type.GetType(a.ValueType));
|
||||
}
|
||||
return a.ObjectValue is ThingsGateway.Plugin.OpcAe.OpcAeEventData opcData ? opcData : null;
|
||||
}
|
||||
).Where(a => a != null).ToList();
|
||||
// }
|
||||
// public override IEnumerable<dynamic> GetList(IEnumerable<object> datas)
|
||||
// {
|
||||
// if (datas == null) return null;
|
||||
// var pluginEventDatas = datas.Cast<PluginEventData>();
|
||||
// var opcDatas = pluginEventDatas.Select(
|
||||
// a =>
|
||||
// {
|
||||
// if (a.ObjectValue == null)
|
||||
// {
|
||||
// a.ObjectValue = a.Value.ToObject(Type.GetType(a.ValueType));
|
||||
// }
|
||||
// return a.ObjectValue is ThingsGateway.Plugin.OpcAe.OpcAeEventData opcData ? opcData : null;
|
||||
// }
|
||||
// ).Where(a => a != null).ToList();
|
||||
|
||||
List<KafkaAlarmEntity> alarmEntities = new List<KafkaAlarmEntity>();
|
||||
if (opcDatas.Count == 0)
|
||||
{
|
||||
Logger?.LogInformation("没有OPCAE数据");
|
||||
return alarmEntities;
|
||||
}
|
||||
// List<KafkaAlarmEntity> alarmEntities = new List<KafkaAlarmEntity>();
|
||||
// if (opcDatas.Count == 0)
|
||||
// {
|
||||
// Logger?.LogInformation("没有OPCAE数据");
|
||||
// return alarmEntities;
|
||||
// }
|
||||
|
||||
|
||||
foreach (var opcAeEventData in opcDatas)
|
||||
{
|
||||
//一般只需要条件报警
|
||||
//if (opcAeEventData.EventType != Opc.Ae.EventType.Condition)
|
||||
// continue;
|
||||
//重连时触发的事件,可以跳过不处理
|
||||
//if(opcAeEventData.Refresh)
|
||||
// continue;
|
||||
var sourceName = opcAeEventData.SourceID;
|
||||
if (variableRuntimes.TryGetValue(sourceName, out var variableRuntime))
|
||||
{
|
||||
var ack = opcAeEventData.EventType != Opc.Ae.EventType.Condition ? false : ((Opc.Ae.ConditionState)opcAeEventData.NewState).HasFlag(Opc.Ae.ConditionState.Acknowledged);
|
||||
// foreach (var opcAeEventData in opcDatas)
|
||||
// {
|
||||
// //一般只需要条件报警
|
||||
// //if (opcAeEventData.EventType != Opc.Ae.EventType.Condition)
|
||||
// // continue;
|
||||
// //重连时触发的事件,可以跳过不处理
|
||||
// //if(opcAeEventData.Refresh)
|
||||
// // continue;
|
||||
// var sourceName = opcAeEventData.SourceID;
|
||||
// if (variableRuntimes.TryGetValue(sourceName, out var variableRuntime))
|
||||
// {
|
||||
// var ack = opcAeEventData.EventType != Opc.Ae.EventType.Condition ? false : ((Opc.Ae.ConditionState)opcAeEventData.NewState).HasFlag(Opc.Ae.ConditionState.Acknowledged);
|
||||
|
||||
bool isRecover = opcAeEventData.EventType != Opc.Ae.EventType.Condition ? false : !((Opc.Ae.ConditionState)opcAeEventData.NewState).HasFlag(Opc.Ae.ConditionState.Active);
|
||||
// bool isRecover = opcAeEventData.EventType != Opc.Ae.EventType.Condition ? false : !((Opc.Ae.ConditionState)opcAeEventData.NewState).HasFlag(Opc.Ae.ConditionState.Active);
|
||||
|
||||
//构建告警实体
|
||||
KafkaAlarmEntity alarmEntity = new KafkaAlarmEntity
|
||||
{
|
||||
AlarmCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data2)), //唯一编码
|
||||
ResourceCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data3)), //资源编码
|
||||
ResourceName = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data4)), //资源名称
|
||||
MetricCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data5)), //指标编码
|
||||
MetricName = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data6)), //指标名称
|
||||
Content = $"{variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data4))},{opcAeEventData.Message}", //告警内容,设备名称+告警内容(包含阈值信息),可能opcae里没有带阈值信息,那么就需要录入固定值,可选Data10
|
||||
AlarmType = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data7)), // opcAeEventData.Severity 告警类型,子系统产生告警的类型,可能需要固定备注值
|
||||
// //构建告警实体
|
||||
// KafkaAlarmEntity alarmEntity = new KafkaAlarmEntity
|
||||
// {
|
||||
// AlarmCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data2)), //唯一编码
|
||||
// ResourceCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data3)), //资源编码
|
||||
// ResourceName = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data4)), //资源名称
|
||||
// MetricCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data5)), //指标编码
|
||||
// MetricName = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data6)), //指标名称
|
||||
// Content = $"{variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data4))},{opcAeEventData.Message}", //告警内容,设备名称+告警内容(包含阈值信息),可能opcae里没有带阈值信息,那么就需要录入固定值,可选Data10
|
||||
// AlarmType = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data7)), // opcAeEventData.Severity 告警类型,子系统产生告警的类型,可能需要固定备注值
|
||||
|
||||
ConfirmedTime = ack ? opcAeEventData.Time.DateTimeToUnixTimestamp() : null, //告警确认时间
|
||||
FixTime = isRecover ? opcAeEventData.Time.DateTimeToUnixTimestamp() : null, //解除告警时间
|
||||
LastTime = opcAeEventData.ActiveTime.DateTimeToUnixTimestamp(), //产生告警时间
|
||||
Status = isRecover ? "FIXED" : "UNFIXED", //告警状态
|
||||
AlarmLevel = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data8)), //opcAeEventData.Severity.ToString(), //告警等级,可能需要固定备注值
|
||||
SubSystemCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data9)), //子系统编码
|
||||
Type = "SUB_SYSTEM_ALARM", //默认填写字段
|
||||
ConfirmAccount = opcAeEventData.ActorID, //告警确认人
|
||||
ClearAccount = opcAeEventData.ActorID, //告警清除人
|
||||
ProcessInstruction = null //告警处理说明,OPCAE不带有
|
||||
};
|
||||
alarmEntities.Add(alarmEntity);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger?.LogInformation($"找不到相关变量{sourceName}");
|
||||
}
|
||||
}
|
||||
// ConfirmedTime = ack ? opcAeEventData.Time.DateTimeToUnixTimestamp() : null, //告警确认时间
|
||||
// FixTime = isRecover ? opcAeEventData.Time.DateTimeToUnixTimestamp() : null, //解除告警时间
|
||||
// LastTime = opcAeEventData.ActiveTime.DateTimeToUnixTimestamp(), //产生告警时间
|
||||
// Status = isRecover ? "FIXED" : "UNFIXED", //告警状态
|
||||
// AlarmLevel = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data8)), //opcAeEventData.Severity.ToString(), //告警等级,可能需要固定备注值
|
||||
// SubSystemCode = variableRuntime.GetPropertyValue(id, nameof(BusinessVariableProperty.Data9)), //子系统编码
|
||||
// Type = "SUB_SYSTEM_ALARM", //默认填写字段
|
||||
// ConfirmAccount = opcAeEventData.ActorID, //告警确认人
|
||||
// ClearAccount = opcAeEventData.ActorID, //告警清除人
|
||||
// ProcessInstruction = null //告警处理说明,OPCAE不带有
|
||||
// };
|
||||
// alarmEntities.Add(alarmEntity);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Logger?.LogInformation($"找不到相关变量{sourceName}");
|
||||
// }
|
||||
// }
|
||||
|
||||
return alarmEntities;
|
||||
}
|
||||
}
|
||||
// return alarmEntities;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 告警实体
|
||||
/// </summary>
|
||||
public class KafkaAlarmEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警编码唯一 (非空)
|
||||
/// 示例:"8e8a118ac452fd04da8c26fa588a7cab"
|
||||
/// </summary>
|
||||
public string AlarmCode { get; set; }
|
||||
///// <summary>
|
||||
///// 告警实体
|
||||
///// </summary>
|
||||
//public class KafkaAlarmEntity
|
||||
//{
|
||||
// /// <summary>
|
||||
// /// 告警编码唯一 (非空)
|
||||
// /// 示例:"8e8a118ac452fd04da8c26fa588a7cab"
|
||||
// /// </summary>
|
||||
// public string AlarmCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源编码,唯一编码,需要按照映射表上传 (非空)
|
||||
/// 示例:"RS_A6K9MUSG19V"
|
||||
/// </summary>
|
||||
public string ResourceCode { get; set; }
|
||||
// /// <summary>
|
||||
// /// 资源编码,唯一编码,需要按照映射表上传 (非空)
|
||||
// /// 示例:"RS_A6K9MUSG19V"
|
||||
// /// </summary>
|
||||
// public string ResourceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 资源名称,需要按照映射表上传 (非空)
|
||||
/// 示例:"MB-A7"
|
||||
/// </summary>
|
||||
public string ResourceName { get; set; }
|
||||
// /// <summary>
|
||||
// /// 资源名称,需要按照映射表上传 (非空)
|
||||
// /// 示例:"MB-A7"
|
||||
// /// </summary>
|
||||
// public string ResourceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指标编码唯一,需要按照映射表上传 (非空)
|
||||
/// 示例:"ActivePowerPa"
|
||||
/// </summary>
|
||||
public string MetricCode { get; set; }
|
||||
// /// <summary>
|
||||
// /// 指标编码唯一,需要按照映射表上传 (非空)
|
||||
// /// 示例:"ActivePowerPa"
|
||||
// /// </summary>
|
||||
// public string MetricCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指标名称,需要按照映射表上传 (非空)
|
||||
/// 示例:"有功功率Pa"
|
||||
/// </summary>
|
||||
public string MetricName { get; set; }
|
||||
// /// <summary>
|
||||
// /// 指标名称,需要按照映射表上传 (非空)
|
||||
// /// 示例:"有功功率Pa"
|
||||
// /// </summary>
|
||||
// public string MetricName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警内容:设备名称+告警内容(包含阈值信息) (非空)
|
||||
/// 示例:"MB-A7,有功功率Pa > 30"
|
||||
/// </summary>
|
||||
public string Content { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警内容:设备名称+告警内容(包含阈值信息) (非空)
|
||||
// /// 示例:"MB-A7,有功功率Pa > 30"
|
||||
// /// </summary>
|
||||
// public string Content { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警类型,子系统产生告警的类型 (非空)
|
||||
/// 示例:"0101" 表示高限报警
|
||||
/// </summary>
|
||||
public string AlarmType { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警类型,子系统产生告警的类型 (非空)
|
||||
// /// 示例:"0101" 表示高限报警
|
||||
// /// </summary>
|
||||
// public string AlarmType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警确认时间 (可空,时间戳)
|
||||
/// 示例:1586152800000
|
||||
/// </summary>
|
||||
public long? ConfirmedTime { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警确认时间 (可空,时间戳)
|
||||
// /// 示例:1586152800000
|
||||
// /// </summary>
|
||||
// public long? ConfirmedTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 解除告警时间 (可空,时间戳)
|
||||
/// 示例:1586152800000
|
||||
/// </summary>
|
||||
public long? FixTime { get; set; }
|
||||
// /// <summary>
|
||||
// /// 解除告警时间 (可空,时间戳)
|
||||
// /// 示例:1586152800000
|
||||
// /// </summary>
|
||||
// public long? FixTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产生告警时间 (非空,时间戳)
|
||||
/// 示例:1586152800000
|
||||
/// </summary>
|
||||
public long LastTime { get; set; }
|
||||
// /// <summary>
|
||||
// /// 产生告警时间 (非空,时间戳)
|
||||
// /// 示例:1586152800000
|
||||
// /// </summary>
|
||||
// public long LastTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警状态 (非空)
|
||||
/// 可选值:UNFIXED(新增告警)、FIXED(解除告警)
|
||||
/// </summary>
|
||||
public string Status { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警状态 (非空)
|
||||
// /// 可选值:UNFIXED(新增告警)、FIXED(解除告警)
|
||||
// /// </summary>
|
||||
// public string Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警等级,需要按照映射表上传 (非空)
|
||||
/// 示例:"1"
|
||||
/// </summary>
|
||||
public string AlarmLevel { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警等级,需要按照映射表上传 (非空)
|
||||
// /// 示例:"1"
|
||||
// /// </summary>
|
||||
// public string AlarmLevel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统编码 (非空)
|
||||
/// 示例:"MS_NEW_PD_DCIM_001"
|
||||
/// </summary>
|
||||
public string SubSystemCode { get; set; }
|
||||
// /// <summary>
|
||||
// /// 子系统编码 (非空)
|
||||
// /// 示例:"MS_NEW_PD_DCIM_001"
|
||||
// /// </summary>
|
||||
// public string SubSystemCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 默认填写字段 (非空)
|
||||
/// 固定值:"SUB_SYSTEM_ALARM"
|
||||
/// </summary>
|
||||
public string Type { get; set; }
|
||||
// /// <summary>
|
||||
// /// 默认填写字段 (非空)
|
||||
// /// 固定值:"SUB_SYSTEM_ALARM"
|
||||
// /// </summary>
|
||||
// public string Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警确认人 (可空)
|
||||
/// 示例:"admin3"
|
||||
/// </summary>
|
||||
public string ConfirmAccount { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警确认人 (可空)
|
||||
// /// 示例:"admin3"
|
||||
// /// </summary>
|
||||
// public string ConfirmAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警清除人 (可空)
|
||||
/// 示例:"admin"
|
||||
/// </summary>
|
||||
public string ClearAccount { get; set; }
|
||||
// /// <summary>
|
||||
// /// 告警清除人 (可空)
|
||||
// /// 示例:"admin"
|
||||
// /// </summary>
|
||||
// public string ClearAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 告警处理说明 (可空)
|
||||
/// 示例:"admin"
|
||||
/// </summary>
|
||||
public string ProcessInstruction { get; set; }
|
||||
}
|
||||
// /// <summary>
|
||||
// /// 告警处理说明 (可空)
|
||||
// /// 示例:"admin"
|
||||
// /// </summary>
|
||||
// public string ProcessInstruction { get; set; }
|
||||
//}
|
||||
|
@@ -1,46 +1,46 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
// 使用文档:https://thingsgateway.cn/
|
||||
// QQ群:605534569
|
||||
// ------------------------------------------------------------------------------
|
||||
////------------------------------------------------------------------------------
|
||||
////此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
|
||||
//// 此代码版权(除特别声明外的代码)归作者本人Diego所有
|
||||
//// 源代码使用协议遵循本仓库的开源协议及附加协议
|
||||
//// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
|
||||
//// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
|
||||
//// 使用文档:https://thingsgateway.cn/
|
||||
//// QQ群:605534569
|
||||
//// ------------------------------------------------------------------------------
|
||||
|
||||
using ThingsGateway.Gateway.Application;
|
||||
using ThingsGateway.NewLife.Json.Extension;
|
||||
using ThingsGateway.Plugin.DB;
|
||||
using ThingsGateway.SqlSugar;
|
||||
//using ThingsGateway.Gateway.Application;
|
||||
//using ThingsGateway.NewLife.Json.Extension;
|
||||
//using ThingsGateway.Plugin.DB;
|
||||
//using ThingsGateway.SqlSugar;
|
||||
|
||||
using TouchSocket.Core;
|
||||
//using TouchSocket.Core;
|
||||
|
||||
public class TestSQL : DynamicSQLBase
|
||||
{
|
||||
public override Task DBInit(ISqlSugarClient db, CancellationToken cancellationToken)
|
||||
{
|
||||
db.DbMaintenance.CreateDatabase();
|
||||
db.CodeFirst.InitTables<ThingsGateway.Plugin.OpcAe.OpcAeEventData>();
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
//public class TestSQL : DynamicSQLBase
|
||||
//{
|
||||
// public override Task DBInit(ISqlSugarClient db, CancellationToken cancellationToken)
|
||||
// {
|
||||
// db.DbMaintenance.CreateDatabase();
|
||||
// db.CodeFirst.InitTables<ThingsGateway.Plugin.OpcAe.OpcAeEventData>();
|
||||
// return Task.CompletedTask;
|
||||
// }
|
||||
|
||||
public override async Task DBInsertable(ISqlSugarClient db, IEnumerable<object> datas, CancellationToken cancellationToken)
|
||||
{
|
||||
var pluginEventDatas = datas.Cast<PluginEventData>();
|
||||
var opcDatas = pluginEventDatas.Select(
|
||||
a =>
|
||||
{
|
||||
if (a.ObjectValue == null)
|
||||
{
|
||||
a.ObjectValue = a.Value.ToObject(Type.GetType(a.ValueType));
|
||||
}
|
||||
return a.ObjectValue is ThingsGateway.Plugin.OpcAe.OpcAeEventData opcData ? opcData : null;
|
||||
}
|
||||
).Where(a => a != null).ToList();
|
||||
if (opcDatas.Count == 0)
|
||||
return;
|
||||
Logger?.Info(opcDatas.ToSystemTextJsonString());
|
||||
// public override async Task DBInsertable(ISqlSugarClient db, IEnumerable<object> datas, CancellationToken cancellationToken)
|
||||
// {
|
||||
// var pluginEventDatas = datas.Cast<PluginEventData>();
|
||||
// var opcDatas = pluginEventDatas.Select(
|
||||
// a =>
|
||||
// {
|
||||
// if (a.ObjectValue == null)
|
||||
// {
|
||||
// a.ObjectValue = a.Value.ToObject(Type.GetType(a.ValueType));
|
||||
// }
|
||||
// return a.ObjectValue is ThingsGateway.Plugin.OpcAe.OpcAeEventData opcData ? opcData : null;
|
||||
// }
|
||||
// ).Where(a => a != null).ToList();
|
||||
// if (opcDatas.Count == 0)
|
||||
// return;
|
||||
// Logger?.Info(opcDatas.ToSystemTextJsonString());
|
||||
|
||||
await db.Insertable(opcDatas).ExecuteCommandAsync(cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
// await db.Insertable(opcDatas).ExecuteCommandAsync(cancellationToken).ConfigureAwait(false);
|
||||
// }
|
||||
//}
|
||||
|
Reference in New Issue
Block a user