From 4c3d4f14ba947f1e54837712fbeaa3ce4b333d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E7=9D=BF?= <774114798@qq.com> Date: Mon, 2 Dec 2024 17:46:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BF=E5=91=BD=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProtecttionDeviceRedisAppService.cs | 48 +++++++++++--- .../DataAnalysis/Model/ConstantModel.cs | 3 + .../DataAnalysis/WebApiRequest.cs | 25 ++++++++ .../DataCenter/RedisRepository.cs | 3 + .../ProtectionDeviceDataCenter.cs | 20 +++++- .../ProtectionDeviceRunInfoHandle.cs | 16 +---- .../ProtectionDeviceSelfCheckHandle.cs | 63 ++++++++++++++++++- 7 files changed, 151 insertions(+), 27 deletions(-) diff --git a/src/YunDa.Application/YunDa.ISAS.Application/GeneralInformation/ProtectionDevice/ProtecttionDeviceRedisAppService.cs b/src/YunDa.Application/YunDa.ISAS.Application/GeneralInformation/ProtectionDevice/ProtecttionDeviceRedisAppService.cs index b1b76de..03cbdb4 100644 --- a/src/YunDa.Application/YunDa.ISAS.Application/GeneralInformation/ProtectionDevice/ProtecttionDeviceRedisAppService.cs +++ b/src/YunDa.Application/YunDa.ISAS.Application/GeneralInformation/ProtectionDevice/ProtecttionDeviceRedisAppService.cs @@ -2,6 +2,7 @@ using Abp.Authorization; using Abp.Collections.Extensions; using Abp.Domain.Repositories; +using Abp.UI; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; @@ -149,25 +150,54 @@ namespace YunDa.ISAS.Application.GeneralInformation.ProtectionDevice try { - var decices = _protectionDeviceInfoRepository - .GetAllIncluding() + // 从仓储中查询设备信息 + var devices = _protectionDeviceInfoRepository + .GetAllIncluding(t => t.EquipmentInfo) .WhereIf(equipmentInfoId != default, t => t.EquipmentInfoId == equipmentInfoId) .ToList(); - var data = decices.Select(t => new EquipmentInfoRemainingLifeAssessment + + // 定义基准寿命年限 + float totalLifetimeInYears = 15; + + // 计算设备剩余寿命 + var data = devices.Select(t => { - - EquipmentInfoId = t.EquipmentInfoId, - RemainingLifeInYears ="5.8年" + double remainingYears; + + if (t.EquipmentInfo?.ProductionDate == null) + { + // 当出厂日期为空,寿命按 15 年计算 + remainingYears = totalLifetimeInYears; + } + else + { + // 计算已用寿命年限 + double elapsedYears = (DateTime.Now - t.EquipmentInfo.ProductionDate.Value).TotalDays / 365.0; + + // 剩余寿命 = 基准寿命 - 已用寿命 + remainingYears = Math.Max(totalLifetimeInYears - elapsedYears, 0); + } + + // 返回计算结果 + return new EquipmentInfoRemainingLifeAssessment + { + EquipmentInfoId = t.EquipmentInfoId, + RemainingLifeInYears = $"{Math.Round(remainingYears, 1)}年" // 保留一位小数 + }; }); + + // 设置返回结果 rst.ResultData = data.ToList(); rst.Flag = true; - } catch (Exception ex) { - - throw; + // 捕获异常并记录日志 + //_logger.LogError(ex, "计算设备剩余寿命时发生错误"); + //throw new UserFriendlyException("计算设备剩余寿命失败,请联系管理员", ex); } + + return rst; } } diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/Model/ConstantModel.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/Model/ConstantModel.cs index cccdf54..c85edba 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/Model/ConstantModel.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/Model/ConstantModel.cs @@ -215,5 +215,8 @@ namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis.Model public static string RequestModifyBoardInfoList => $"{WebAddr}/api/services/isas/BoardCardInfo/ModifyBoardInfoList"; public static string RequestSecondaryCircuitLogicExpressionList => $"{WebAddr}/api/services/isas/SecondaryCircuitLogicExpression/FindDatas"; + public static string RequestProtectionDeviceGetDeviceEventTypeList => $"{WebAddr}/api/services/isas/ProtectionDevice/GetDeviceEventType"; + + } } \ No newline at end of file diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/WebApiRequest.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/WebApiRequest.cs index 542376e..392736d 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/WebApiRequest.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataAnalysis/WebApiRequest.cs @@ -39,6 +39,7 @@ using YunDa.ISAS.ExternalInteraction.DataTransferObject.InspectionEquipment.Requ using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto; using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionSettingDto; using YunDa.SOMS.DataTransferObject.GeneralInformation.SecondaryCircuitDto; +using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport; using ConstantModel = Yunda.ISAS.DataMonitoringServer.DataAnalysis.Model.ConstantModel; namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis @@ -1112,5 +1113,29 @@ namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis return null; } + //http://localhost:38091?deviceAddr=1&eventCode=1 + + public EquipmentInfoAbnormalComponent GetDeviceAbnormalComponent(byte deviceAddr, byte eventCode) + { + try + { + JObject rstDataJObject = ToolLibrary + .HttpHelper + .HttpGetRequest + (ConstantModel + .RequestProtectionDeviceGetDeviceEventTypeList+$"?deviceAddr={deviceAddr}&eventCode={eventCode}" + ); + var rst = rstDataJObject?["result"]?["resultData"];//获取结果集 + + var res = rst.ToObject(); + return res; + } + catch (Exception ex) + { + MonitoringEventBus.LogHandler(ex.Message, "获取遥测报警配置缓存"); + } + return null; + } + } } diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataCenter/RedisRepository.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataCenter/RedisRepository.cs index 6ba636b..e5e4edc 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataCenter/RedisRepository.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/DataCenter/RedisRepository.cs @@ -42,6 +42,9 @@ namespace Yunda.ISAS.DataMonitoringServer.DataCenter /// 遥信数据变位库 /// public IRedisRepository TelesignalisationModelInflectionListRedis { get; } + + public string DeviceSelfTestChannelRediskey = "deviceSelfTestChannel"; + public IRedisRepository AbnormalComponentRedis { get; } public IRedisRepository SecondaryCircuitComponentRedis { get; } public IRedisRepository EquipmentInfoRemainingLifeAssessmentRedis { get; } diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceDataCenter.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceDataCenter.cs index d74d061..cbc600f 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceDataCenter.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceDataCenter.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Net.NetworkInformation; using System.Threading.Tasks; +using ToolLibrary.LogHelper; using Yunda.ISAS.DataMonitoringServer.DataAnalysis; using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server; using YunDa.ISAS.Redis.Repositories; @@ -15,11 +16,13 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle { public class ProtectionDeviceDataCenter: ISingletonDependency { + public static List _devices; WebApiRequest _webApiRequest; ProtectionDeviceDZDataHandle _protectionDeviceDZDataHandle; ProtectionDeviceVersionHandle _protectionDeviceVersionHandle; ProtectionDeviceIOInfoHandle _protectionDeviceIOInfoHandle; ProtectionDeviceRunInfoHandle _protectionDeviceRunInfoHandle; + ProtectionDeviceSelfCheckHandle _protectionDeviceSelfCheckHandle; IRedisRepository _deviceBoardStatesRedis; DotNettyTcpServer _dotNettyTcpServer; string deviceBoardStatesRedisKey = "deviceBoardStates"; @@ -29,7 +32,8 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle , ProtectionDeviceVersionHandle protectionDeviceVersionHandle , ProtectionDeviceIOInfoHandle protectionDeviceIOInfoHandle , DotNettyTcpServer dotNettyTcpServer - ,ProtectionDeviceRunInfoHandle protectionDeviceRunInfoHandle + , ProtectionDeviceSelfCheckHandle protectionDeviceSelfCheckHandle + , ProtectionDeviceRunInfoHandle protectionDeviceRunInfoHandle , IRedisRepository deviceBoardStatesRedis ) { @@ -41,6 +45,20 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle _protectionDeviceRunInfoHandle = protectionDeviceRunInfoHandle; _dotNettyTcpServer.deviceBoardStatesAction += _dotNettyTcpServer_deviceBoardStatesAction; _deviceBoardStatesRedis = deviceBoardStatesRedis; + _protectionDeviceSelfCheckHandle = protectionDeviceSelfCheckHandle; + Task.Run(async () => + { + try + { + _devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南"); + await Task.Delay(1000); + } + catch (Exception ex) + { + Log4Helper.Error(this.GetType(), "初始化装置IO错误", ex); + } + + }); } /// /// 将装置状态写入到内存数据库中 diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceRunInfoHandle.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceRunInfoHandle.cs index 77c4376..3a62bab 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceRunInfoHandle.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceRunInfoHandle.cs @@ -22,7 +22,6 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle WebApiRequest _webApiRequest; FtpFile _ftpFile; DotNettyTcpServer _dotNettyTcpServer; - List _devices; private readonly RedisDataRepository _redisDataRepository; public ProtectionDeviceRunInfoHandle( FtpFile ftpFile, @@ -36,19 +35,6 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle _dotNettyTcpServer = dotNettyTcpServer; _redisDataRepository = redisDataRepository; _dotNettyTcpServer.MessageReceived += OnMessageReceived; // 订阅事件 - Task.Run(async () => - { - try - { - _devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南"); - await Task.Delay(10000); - } - catch (Exception ex) - { - Log4Helper.Error(this.GetType(), "初始化装置IO错误", ex); - } - - }); } int _commCount = 0; @@ -60,7 +46,7 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle { if (_commCount == 0) { - var device = _devices.FirstOrDefault(t => t.DeviceAddr == address); + var device = ProtectionDeviceDataCenter._devices.FirstOrDefault(t => t.DeviceAddr == address); var localFile = _ftpFile.GetFileFromFtp(device.GatewayIP1, "/nor/root/status/", "status.txt",address.ToString()); if (File.Exists(localFile)) { diff --git a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceSelfCheckHandle.cs b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceSelfCheckHandle.cs index ac739b1..9cce09b 100644 --- a/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceSelfCheckHandle.cs +++ b/src/YunDa.Server/Yunda.ISAS.DataMonitoringServer/ProtectionDeviceHandle/ProtectionDeviceSelfCheckHandle.cs @@ -1,13 +1,72 @@ -using System; +using Abp.Dependency; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using ToolLibrary.LogHelper; +using Yunda.ISAS.DataMonitoringServer.DataAnalysis; +using Yunda.ISAS.DataMonitoringServer.DataCenter; +using Yunda.SOMS.DataMonitoringServer.FTPHandle; +using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server; +using YunDa.ISAS.Entities.System; +using YunDa.SOMS.Commdb.Models; +using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport; namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle { - public class ProtectionDeviceSelfCheckHandle + public class ProtectionDeviceSelfCheckHandle : ISingletonDependency { + WebApiRequest _webApiRequest; + DotNettyTcpServer _dotNettyTcpServer; + private readonly RedisDataRepository _redisDataRepository; + + public ProtectionDeviceSelfCheckHandle(WebApiRequest webApiRequest, + DotNettyTcpServer dotNettyTcpServer, + RedisDataRepository redisDataRepository) + { + _webApiRequest = webApiRequest; + _dotNettyTcpServer = dotNettyTcpServer; + _redisDataRepository = redisDataRepository; + _dotNettyTcpServer.MessageReceived += OnMessageReceived; // 订阅事件 + } + + private void OnMessageReceived(byte address, byte[] message, byte functionType) + { + try + { + if (functionType == 4) //通信状态 + { + var device = ProtectionDeviceDataCenter._devices.FirstOrDefault(t => t.DeviceAddr == address); + if (device != null) + { + if (message.Length > 0) + { + if (message[0] != 0) + { + var abnormalComponent = _webApiRequest.GetDeviceAbnormalComponent(address, message[0]); + if (abnormalComponent != null) + { + abnormalComponent.EquipmentInfoId = device.EquipmentInfoId; + Task.Run(async () => + { + string redisChannel = _redisDataRepository.DeviceSelfTestChannelRediskey; + await _redisDataRepository.AbnormalComponentRedis.PublishAsync(redisChannel, abnormalComponent); + }); + + } + } + } + } + + } + } + catch (Exception ex) + { + Log4Helper.Error(this.GetType(), "自检信息", ex); + } + } + //GetDeviceAbnormalComponent } }