using Abp.Dependency;
using Amazon.Runtime.Internal.Transform;
using MongoDB.Driver.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;
using ToolLibrary.LogHelper;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.DataCollection;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.Helper;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis.TeleInfoSave;
using Yunda.ISAS.DataMonitoringServer.DataCenter;
using Yunda.ISAS.DataMonitoringServer.WebApi;
using Yunda.ISAS.DataMonitoringServer.WebSocket;
using Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle;
using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server;
using YunDa.SOMS.DataTransferObject.GeneralInformation.SecondaryCircuitDto;
namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis
{
public class MonitoringDataService : ISingletonDependency
{
///
/// 是否在运行
///
//public bool IsRunning { get; set; }
private readonly DataCollectionTask _dataCollectionTask;
private readonly TelemeteringResultSaveTask _telemeteringResultSaveTask;
private readonly WebSocketServer _webSocketServer;
//private readonly WebApiServer _webApiServer;
private readonly ConfigurationHepler _configurationHepler;
private readonly WebApiRequest _webApiRequest;
private readonly RunningDataCache _runningDataCache;
private readonly TelecomDataCenter _telecomDataCenter;
private readonly DotNettyTcpServer _dotNettyTcpServer;
private readonly ProtectionDeviceDataCenter _protectionDeviceDataCenter;
private readonly ProtectionDeviceDZDataHandle _protectionDeviceDZDataHandle;
private readonly RedisDataRepository _redisDataRepository;
WPF.ViewModel.Content _settingModel;
public MonitoringDataService(WebApiRequest webApiRequest,
RunningDataCache runningDataCache,
DataCollectionTask dataCollectionTask,
TelemeteringResultSaveTask telemeteringResultSaveTask,
WebSocketServer webSocketController,
ConfigurationHepler configurationHepler,
TelecomDataCenter telecomDataCenter,
DotNettyTcpServer dotNettyTcpServer,
ProtectionDeviceDZDataHandle protectionDeviceDZDataHandle,
ProtectionDeviceDataCenter protectionDeviceDataCenter,
RedisDataRepository redisDataRepository
//WebApiServer webApiServer
)
{
_telecomDataCenter = telecomDataCenter;
_webApiRequest = webApiRequest;
_runningDataCache = runningDataCache;
_dataCollectionTask = dataCollectionTask;
_telemeteringResultSaveTask = telemeteringResultSaveTask;
_webSocketServer = webSocketController;
//_webApiServer = webApiServer;
_configurationHepler = configurationHepler;
_dotNettyTcpServer = dotNettyTcpServer;
//var webapiPort = _configurationHepler.GetAppsettingsValue("ConnectionStrings", "WebApi", "Port");
_protectionDeviceDZDataHandle = protectionDeviceDZDataHandle;
_protectionDeviceDataCenter = protectionDeviceDataCenter;
_redisDataRepository = redisDataRepository;
//_webApiServer.RunServerAsync(int.Parse(webapiPort));
}
private bool IsOpenWebSocket = false;
private Action _recvMsgAc =msg =>
{
MessageBox.Show(msg);
};
///
/// 开始服务
///
///
public async void DataServiceStart(WPF.ViewModel.Content settingModel)
{
_settingModel = settingModel;
Action startWebsocket = () =>
{
try
{
if (!IsOpenWebSocket)
{
_telemeteringResultSaveTask.SaveStart();//开启遥测数据保存
_telecomDataCenter.ExcuteSelfChecking();
var path = _configurationHepler.GetAppsettingsValue("ConnectionStrings", "Websocket", "Path");
var port = _configurationHepler.GetAppsettingsValue("ConnectionStrings", "Websocket", "Port");
//_webSocketServer.WebSocketStartAsync(path, int.Parse(port));
IsOpenWebSocket = true;
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "websocket", ex);
}
};
SetMonitoringData(_configurationHepler.SubstationId);
if (settingModel.DataSourceCategoryName =="综自")
{
MonitoringEventBus.LogHandler("启动装置定值接口", "装置定值");
await _protectionDeviceDataCenter.InitProtectionDeviceComms();
await InitSecondaryCircuitLogicExpressionDic();
}
_dataCollectionTask.CollectionStart(settingModel, startWebsocket);//开启数据采集
}
public void CallAllData()
{
_dataCollectionTask.CallAllData();
}
///
/// 停止服务
///
public void DataServiceStop()
{
_dataCollectionTask.CollectionStop(); //数据采集停止
_dotNettyTcpServer.StopSeverAsync();
if (_settingModel.DataSourceCategoryName == "综自")
{
_protectionDeviceDataCenter.StopAllProcesses();
}
}
///
/// 从服务端获取遥信遥测数据 填入缓存中
///
private void SetMonitoringData(Guid transformerSubstationId)
{
try
{
//1、从业务服务中获取监控遥测,遥信数据并更新至MonitoringDataService.EquipmentData中
//_webApiRequest.GetEquipmentData(transformerSubstationId);
//_webApiRequest.GetLinkageStrategyData(transformerSubstationId);
//_webApiRequest.GetVideoDevs(transformerSubstationId);
_webApiRequest.GetTransubstationInfo(transformerSubstationId);
_webApiRequest.GetEquipmentInfoSimDatas(transformerSubstationId);
_webApiRequest.GetEquipmentTypeSimDatas();
_webApiRequest.GetDMAlarmCategorySimpleSimDatas(transformerSubstationId);
_webApiRequest.GetTelemeteringAlarmStrategySimDatas(transformerSubstationId);
//var count = _runningDataCache.VideoDevs.Count;
//MonitoringEventBus.LogHandler($"从服务器获取了{count}条摄像头数据", "服务器数据更新");
//_webApiRequest.GetTelecommandModels(transformerSubstationId);
//count = _runningDataCache.TelecommandModels.Count;
//MonitoringEventBus.LogHandler($"从服务器获取了{count}条遥控配置数据", "服务器数据更新");
//_webApiRequest.InitCamAuthCache();
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.Message, "异常信息");
}
}
private async Task InitSecondaryCircuitLogicExpressionDic()
{
try
{
_runningDataCache.SecondaryCircuitLogicExpressionDic.Clear();
var yxlist =await _redisDataRepository.GetTelesignalisationModels();
var yclist =await _redisDataRepository.GetTelemeteringModels();
var ycCheckList =( await _redisDataRepository.GetCheckTelemeteringModels()).ToDictionary(t => t.Id);
var yxSendList =( await _redisDataRepository.GetSendTelesignalisationModels()).ToDictionary(t => t.Id);
var yxDic = yxlist.ToDictionary(t => t.Id);
var ycDic = yclist.ToDictionary(t => t.Id);
var list = _webApiRequest.GetSecondaryCircuitLogicExpressionList();
foreach (var item in list)
{
if (!ycCheckList.ContainsKey(item.TelemeteringConfigurationId.Value)|| !yxSendList.ContainsKey(item.TelesignalisationConfigurationId.Value))
{
Debug.WriteLine("错误,没有找到遥测/遥信");
continue;
}
var checktelemeteringConfiguration = ycCheckList[item.TelemeteringConfigurationId.Value];
var sendtelesignalConfiguration = yxSendList[item.TelesignalisationConfigurationId.Value];
float? upperLimit = checktelemeteringConfiguration.UpperLimit;
float? lowerLimit = checktelemeteringConfiguration.LowerLimit;
// 正则表达式匹配花括号中的内容,包括 GUID
string pattern = @"\{([^}]*:([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}))\}";
Regex regex = new Regex(pattern);
item.LogicalExpression = regex.Replace(item.LogicalExpression, match =>
{
// 提取 GUID
var guidStr = match.Groups[2].Value;
var guid = Guid.Parse(guidStr);
// 查找对应的 key
if (yxDic.TryGetValue(guid, out var yx))
{
return $"{{{yx.DeviceAddress}_{yx.CPUSector}_{yx.DispatcherAddress}_{(int)yx.DataSourceCategory}}}";
}
else if (ycDic.TryGetValue(guid, out var yc))
{
// 构造 key 替换
return $"{{{yc.DeviceAddress}_{yc.CPUSector}_{yc.DispatcherAddress}_{(int)yc.DataSourceCategory}}}";
}
// 如果未找到,保留原内容
return match.Value;
});
// 输出替换后的 LogicalExpression
Debug.WriteLine($"替换后的 LogicalExpression: {item.LogicalExpression}");
// 正则表达式匹配花括号中的内容
string pattern1 = @"\{([^}]*)\}";
Regex regex1 = new Regex(pattern1);
// 提取匹配结果
MatchCollection matches = regex1.Matches(item.LogicalExpression);
List extractedValues = new List();
var logicalExpression = $"({item.LogicalExpression})>={lowerLimit}&&({item.LogicalExpression})<={upperLimit}";
foreach (Match match in matches)
{
string key = match.Groups[1].Value;
var logicExpressionTelesignalisation = new LogicExpressionTelesignalisation
{
LogicExpression = logicalExpression,
TelesignalisationAddr = $"{sendtelesignalConfiguration.DeviceAddress}_{sendtelesignalConfiguration.CPUSector}_{sendtelesignalConfiguration.DispatcherAddress}_{(int)sendtelesignalConfiguration.DataSourceCategory}"
};
if (_runningDataCache.SecondaryCircuitLogicExpressionDic.ContainsKey(key))
{
_runningDataCache.SecondaryCircuitLogicExpressionDic[key].Add(logicExpressionTelesignalisation);
}
else
{
_runningDataCache.SecondaryCircuitLogicExpressionDic.Add(key, new List { logicExpressionTelesignalisation });
}
}
}
}
catch (Exception ex)
{
MonitoringEventBus.LogHandler(ex.Message, "异常信息");
}
}
}
}