using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IStation.Untity;
namespace IStation.Server
{
///
/// 监测处理辅助类
///
public class MonitorHandleHelper
{
///
/// 处理
///
public static bool Handle(Model.MonitorDataDockingCorpRecord data)
{
try
{
#region 数据验证
if (data == null)
{
LogHelper.Info("监测接收数据处理中,监测接收数据序列化失败,自动跳过当前数据!");
return true;
}
if (data.Records == null || data.Records.Count < 1)
{
LogHelper.Info($"监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID},接收记录为空,自动跳过当前数据!");
return true;
}
data.Records = data.Records.Where(x => !string.IsNullOrEmpty(x.SrcValue)).ToList();
if (data.Records.Count < 1)
{
LogHelper.Info($" 监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID},有效接收记录为空,自动跳过当前数据!");
return true;
}
var configure = new Service.DataDockingConfigure().GetByID(data.CorpID, data.ConfigureID);
if (configure == null)
{
LogHelper.Info($"监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID},未检索到数据对接配置信息,自动跳过当前数据!");
return true;
}
if (configure.UseStatus != Model.eUseStatus.Enable)
{
LogHelper.Info($"监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID},未检索到有效数据对接配置信息,自动跳过当前数据!");
return true;
}
#endregion
#region 处理日志
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,处理数据:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{data.Records.Count}");
}
#endregion
#region 流程记录生成
var sysId_list = data.Records.Select(x => x.SysId).ToList();
var dataDockingRecord = new Model.MonitorDataDockingFlowRecord();
dataDockingRecord.CorpID = data.CorpID;
dataDockingRecord.ConfigureID = data.ConfigureID;
dataDockingRecord.DockingTime =DateTime.Now;
dataDockingRecord.DockingCount = data.Records.Count;
dataDockingRecord.DockingContent = sysId_list;
new RedisCache.MonitorDataDockingFlowRecordCacheHelper().SetLastRecord(dataDockingRecord);
#endregion
#region 数据处理
var monitor_list = new Service.MonitorPoint().GetExSignalWithSignalTypeByIds(data.CorpID, data.Records.Select(x => x.SysId).ToList());
if (monitor_list == null || monitor_list.Count < 1)
{
LogHelper.Info($"监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 未检索到测点信息,自动跳过当前数据!");
return true;
}
monitor_list = monitor_list.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList();
if (monitor_list.Count < 1)
{
LogHelper.Info($"监测接收数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 未检索到有效测点信息,自动跳过当前数据!");
return true;
}
//最后一次记录列表
var record_last_list = RecordCacheHelper.Get(data.CorpID,monitor_list.Select(x=>x.ID).Distinct());
if (record_last_list == null || record_last_list.Count < 1)
{
record_last_list = new RedisCache.MonitorRecordCacheHelper().GetLastRecord(data.CorpID, monitor_list.Select(x => x.ID));
}
//保持数据时间的统一
var dt_now = DateTime.Now;
//遍历处理
var record_list = new List();
foreach (var monitor in monitor_list)
{
switch (monitor.MonitorType)
{
case Model.eMonitorType.General:
{
//信号
var signal = monitor.SignalList.FirstOrDefault();
if (signal == null)
{
break;
}
//对接记录
var record_docking = data.Records.Find(t => t.SysId == monitor.ID);
if (record_docking == null)
{
break;
}
if (record_docking.RecordType != Model.eMonitorType.General)
{
break;
}
//上一次记录
var record_last = record_last_list?.Find(x => x.MonitorPointID == monitor.ID);
var record =Calculation.MonitorHandleHelper.Handle(monitor,signal,record_docking,record_last, dt_now);
if (record != null)
record_list.Add(record);
}
break;
case Model.eMonitorType.Vibration:
{
//对接记录
var record_docking = data.Records.Find(t => t.SysId == monitor.ID);
if (record_docking == null)
{
break;
}
if (record_docking.RecordType != Model.eMonitorType.Vibration)
{
break;
}
var sub_record_list = Model.MonitorDataDockingReceiveSubRecord.ToList(record_docking.SrcValue);
if (sub_record_list != null && sub_record_list.Count > 0)
{
foreach (var sub_record in sub_record_list)
{
var signal = monitor.SignalList?.FirstOrDefault(x => x.ID == sub_record.SysId);
if (signal == null)
continue;
var record_docking_sub = new Model.MonitorDataDockingReceiveRecord()
{
SysId = record_docking.SysId,
RecordType = record_docking.RecordType,
SrcTime = record_docking.SrcTime,
SrcValue = sub_record.SrcValue,
DataStatus=record_docking.DataStatus
};
var record_last = record_last_list?.Find(x => x.MonitorPointID == monitor.ID && x.SignalID == sub_record.SysId);
var record = Calculation.MonitorHandleHelper.Handle(monitor,signal,record_docking_sub,record_last,dt_now);
if(record!=null)
record_list.Add(record);
}
}
}
break;
default:
{
LogHelper.Error($"接收数据记录处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID}, 测点标识:{monitor.ID} 的监测类型为:{monitor.MonitorType},暂时不支持对接!");
}
break;
}
}
//数据判断
if (record_list == null || record_list.Count < 1)
{
LogHelper.Error($"接收记录数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据处理后为空,自动跳过当前数据!");
return true;
}
RecordCacheHelper.Set(data.CorpID,record_list);
#endregion
#region 数据存储
#region 实时记录
var record_real_list = record_list.Where(x => x is Model.MonitorRealRecordPure).Select(x => x as Model.MonitorRealRecordPure).ToList();
if (record_real_list != null && record_real_list.Count > 0)
{
var result = new Service.MonitorRealRecord().InsertsLastRecord(record_real_list);
if (!result)
{
LogHelper.Info($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 实时数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存实时记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_real_list.Count}");
}
}
}
#endregion
#region 时记录
var record_hour_list = record_list.Where(x => x is Model.MonitorHourRecordPure).Select(x => x as Model.MonitorHourRecordPure).ToList();
if (record_hour_list != null && record_hour_list.Count > 0)
{
var result = new Service.MonitorHourRecord().InsertsLastRecord(record_hour_list);
if (!result)
{
LogHelper.Info($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 时数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存时记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_hour_list.Count}");
}
}
}
#endregion
#region 日记录
var record_day_list = record_list.Where(x => x is Model.MonitorDayRecordPure).Select(x => x as Model.MonitorDayRecordPure).ToList();
if (record_day_list != null && record_day_list.Count > 0)
{
var result = new Service.MonitorDayRecord().InsertsLastRecord(record_day_list);
if (!result)
{
LogHelper.Info($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 日数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存日记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_day_list.Count}");
}
}
}
#endregion
#region 周记录
var record_week_list = record_list.Where(x => x is Model.MonitorWeekRecordPure).Select(x => x as Model.MonitorWeekRecordPure).ToList();
if (record_week_list != null && record_week_list.Count > 0)
{
var result = new Service.MonitorWeekRecord().InsertsLastRecord(record_week_list);
if (!result)
{
LogHelper.Error($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 周数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存周记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_week_list.Count}");
}
}
}
#endregion
#region 月记录
var record_month_list = record_list.Where(x => x is Model.MonitorMonthRecordPure).Select(x => x as Model.MonitorMonthRecordPure).ToList();
if (record_month_list != null && record_month_list.Count > 0)
{
var result = new Service.MonitorMonthRecord().InsertsLastRecord(record_month_list);
if (!result)
{
LogHelper.Error($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 月数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存月记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_month_list.Count}");
}
}
}
#endregion
#region 年记录
var record_year_list = record_list.Where(x => x is Model.MonitorYearRecordPure).Select(x => x as Model.MonitorYearRecordPure).ToList();
if (record_year_list != null && record_year_list.Count > 0)
{
var result = new Service.MonitorYearRecord().InsertsLastRecord(record_year_list);
if (!result)
{
LogHelper.Error($"数据处理中,客户标识:{data.CorpID},配置标识:{data.ConfigureID} 年数据存储失败!");
}
else
{
if (ConfigHelper.IsWriteLog)
{
LogHelper.Info($"监测接收数据处理中,保存年记录:客户标识:{data.CorpID},配置标识:{data.ConfigureID},数据数量:{record_year_list.Count}");
}
}
}
#endregion
#endregion
#region 运行数据分发
var runQueue = new RabbitMqExChangeHelper();
runQueue.Push(ConfigHelper.RunExchangeName, record_list);
#endregion
return true;
}
catch (Exception ex)
{
LogHelper.Error("接收数据记录处理失败,自动跳过当前数据!", ex);
return true;
}
}
}
}