From e460ff6c0421e96afcde9a834807f6a1271ea250 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Thu, 30 Oct 2025 12:02:12 +0800 Subject: [PATCH] 251030 --- MoviconHub.App/FRemoteSqlContext.cs | 2 +- MoviconHub.App/Models/DeviceStatusChange.cs | 5 + MoviconHub.App/Services/DBServices.cs | 190 +++++++++++--------- MoviconHub.App/frmMain.cs | 10 ++ MoviconWebApi/API/DeviceStateApi/Data.cs | 11 +- 5 files changed, 127 insertions(+), 91 deletions(-) diff --git a/MoviconHub.App/FRemoteSqlContext.cs b/MoviconHub.App/FRemoteSqlContext.cs index 6799283..26be838 100644 --- a/MoviconHub.App/FRemoteSqlContext.cs +++ b/MoviconHub.App/FRemoteSqlContext.cs @@ -14,7 +14,7 @@ namespace MoviconHub.App { public static IFreeSql FDb = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.SqlServer, ConfigHelper.GetValue("RemoteConnecting")) - .UseAutoSyncStructure(true) //自动同步实体结构到数据库 + .UseAutoSyncStructure(false) //自动同步实体结构到数据库 .Build(); //请务必定义成 Singleton 单例模式 } } diff --git a/MoviconHub.App/Models/DeviceStatusChange.cs b/MoviconHub.App/Models/DeviceStatusChange.cs index 9787977..87f8284 100644 --- a/MoviconHub.App/Models/DeviceStatusChange.cs +++ b/MoviconHub.App/Models/DeviceStatusChange.cs @@ -50,6 +50,11 @@ namespace MoviconHub.App.Models [Column(Name = "DeviceState", IsNullable = true)] public int? DeviceState { get; set; } + /// + /// 报警信息 + /// + [Column(Name = "AlarmMessage", StringLength = 180, IsNullable = true)] + public string AlarmMessage { get; set; } /// /// 创建时间 diff --git a/MoviconHub.App/Services/DBServices.cs b/MoviconHub.App/Services/DBServices.cs index b0383f1..79bf3ce 100644 --- a/MoviconHub.App/Services/DBServices.cs +++ b/MoviconHub.App/Services/DBServices.cs @@ -117,7 +117,7 @@ namespace MoviconHub.App.Services } catch (Exception ex) { - Logger.Error(ex, "轮询RTVar数据时发生错误"); + Logger.Error($"实时数据轮询时发生错误: {ex.Message}"); // 发生错误时,等待一段时间后重试 await Task.Delay(5000, cancellationToken); } @@ -142,7 +142,7 @@ namespace MoviconHub.App.Services } catch (Exception ex) { - Logger.Error(ex, "读取RTVar数据时发生错误"); + Logger.Error($"读取RTVar数据时发生错误: {ex.StackTrace}"); throw; } } @@ -153,51 +153,61 @@ namespace MoviconHub.App.Services /// RTVar数据列表 private void UpdateWebSocketData(List rtVars) { - if (rtVars == null || rtVars.Count == 0) - return; - - lock (_lockObject) + try { - // 更新设备状态信息 - var deviceCodeVar = rtVars.FirstOrDefault(v => v.Name == "Device_Code"); - if (deviceCodeVar != null) - _realtimeData.Device_Code = deviceCodeVar.Val; + if (rtVars == null || rtVars.Count == 0) + return; - var deviceNameVar = rtVars.FirstOrDefault(v => v.Name == "Device_Name"); - if (deviceNameVar != null) - _realtimeData.Device_Name = deviceNameVar.Val; + lock (_lockObject) + { - var deviceManufacturerVar = rtVars.FirstOrDefault(v => v.Name == "Device_Manufacturer"); - if (deviceManufacturerVar != null) - _realtimeData.Device_Manufacturer = deviceManufacturerVar.Val; + // 更新设备状态信息 + var deviceCodeVar = rtVars.FirstOrDefault(v => v.Name == "Device_Code"); + if (deviceCodeVar != null) + _realtimeData.Device_Code = deviceCodeVar.Val; - var statusVar = rtVars.FirstOrDefault(v => v.Name == "Device_Status"); - if (statusVar != null) - _realtimeData.Device_Status = statusVar.Val; + var deviceNameVar = rtVars.FirstOrDefault(v => v.Name == "Device_Name"); + if (deviceNameVar != null) + _realtimeData.Device_Name = deviceNameVar.Val; - // 解析故障信息 - UpdateFaultDetails(rtVars); + var deviceManufacturerVar = rtVars.FirstOrDefault(v => v.Name == "Device_Manufacturer"); + if (deviceManufacturerVar != null) + _realtimeData.Device_Manufacturer = deviceManufacturerVar.Val; - // 解析组件信息 - UpdateComponentsInfo(rtVars); + var statusVar = rtVars.FirstOrDefault(v => v.Name == "Device_Status"); + if (statusVar != null) + _realtimeData.Device_Status = statusVar.Val; - // 解析测试数据 - UpdateTestData(rtVars); + // 解析故障信息 + UpdateFaultDetails(rtVars); - //获取条码信息,确定是否需要搜索数据 - SglModel.CodeReady = rtVars.FirstOrDefault(v => v.Name == "part_qrid").Val; + // 解析组件信息 + UpdateComponentsInfo(rtVars); - UpdateRemoteDb(RealtimeData); + // 解析测试数据 + UpdateTestData(rtVars); - //把最新的数据赋值给WebSocketClient中 - WebSocketClientHelper.CurWebSocketData = RealtimeData; + //获取条码信息,确定是否需要搜索数据 + SglModel.CodeReady = rtVars.FirstOrDefault(v => v.Name == "part_qrid").Val; - //更新数据到远程数据库 + UpdateRemoteDb(RealtimeData); + + //把最新的数据赋值给WebSocketClient中 + WebSocketClientHelper.CurWebSocketData = RealtimeData; + + //更新数据到远程数据库 + + // 记录日志 + //Logger.Debug("实时数据已更新"); + } - // 记录日志 - Logger.Debug("实时数据已更新"); } + catch (Exception ex) + { + Logger.Error($"UpdateWebSocketData: {ex.StackTrace}"); + } + } /// @@ -206,72 +216,80 @@ namespace MoviconHub.App.Services /// private void UpdateRemoteDb(WebSocketData webSocketData) { - // 获取组件信息 - var component = webSocketData.ListComponentsInfo?.FirstOrDefault(); - - // 创建CurRunClearState对象并映射数据 - var curRunClearState = new CurRunClearState() + try { - //只有一个,更新数据 - Id = 1, + // 获取组件信息 + var component = webSocketData.ListComponentsInfo?.FirstOrDefault(); - // 基本信息 - DeviceCode = webSocketData.Device_Code, - DeviceName = webSocketData.Device_Name, + // 创建CurRunClearState对象并映射数据 + var curRunClearState = new CurRunClearState() + { + //只有一个,更新数据 + Id = 1, - // 组件信息 - part_qrid = component?.part_qrid, - part_num = component?.part_num, - part_position = component?.part_position, - component_name = component?.part_name, - vehicle_model = component?.part_Vehicle_model, - locomotive_number = component?.part_locomotive_number, - repair_process = component?.part_repair_process, + // 基本信息 + DeviceCode = webSocketData.Device_Code, + DeviceName = webSocketData.Device_Name, - program_process = webSocketData.TestData.Test_FrameworkProgramProcess, + // 组件信息 + part_qrid = component?.part_qrid, + part_num = component?.part_num, + part_position = component?.part_position, + component_name = component?.part_name, + vehicle_model = component?.part_Vehicle_model, + locomotive_number = component?.part_locomotive_number, + repair_process = component?.part_repair_process, - // 程序进程 - Test_FrameworkProgramProcess = webSocketData.TestData.Test_FrameworkProgramProcess, - Test_FrameworkProgramProcessPercentage = webSocketData.TestData.Test_FrameworkProgramProcessPercentage, + program_process = webSocketData.TestData.Test_FrameworkProgramProcess, - // 设备状态 - Test_PartsEquipmentStatus = webSocketData.TestData.Test_PartsEquipmentStatus, + // 程序进程 + Test_FrameworkProgramProcess = webSocketData.TestData.Test_FrameworkProgramProcess, + Test_FrameworkProgramProcessPercentage = webSocketData.TestData.Test_FrameworkProgramProcessPercentage, - // 清洗时长和用量 - Test_FrameworkPerModelCleaningDuration = webSocketData.TestData.Test_FrameworkPerModelCleaningDuration, - Test_FrameworkPerModelCleaningAgentUsage = webSocketData.TestData.Test_FrameworkPerModelCleaningAgentUsage, - Test_FrameworkPerModelWaterUsage = webSocketData.TestData.Test_FrameworkPerModelWaterUsage, + // 设备状态 + Test_PartsEquipmentStatus = webSocketData.TestData.Test_PartsEquipmentStatus, - // 水箱和清洗剂罐信息 - WaterTank_Temp = webSocketData.TestData.Test_WaterTankTemperature, - AgentTank_Temp = webSocketData.TestData.Test_CleaningAgentTankTemperature, - WaterTank_Level = webSocketData.TestData.Test_WaterTankLevel, - AgentTank_Level = webSocketData.TestData.Test_CleaningAgentTankLevel, + // 清洗时长和用量 + Test_FrameworkPerModelCleaningDuration = webSocketData.TestData.Test_FrameworkPerModelCleaningDuration, + Test_FrameworkPerModelCleaningAgentUsage = webSocketData.TestData.Test_FrameworkPerModelCleaningAgentUsage, + Test_FrameworkPerModelWaterUsage = webSocketData.TestData.Test_FrameworkPerModelWaterUsage, - // 浸泡池温度 - SoakingTank1_Temp = webSocketData.TestData.Test_SoakingTank1Temperature, - SoakingTank2_Temp = webSocketData.TestData.Test_SoakingTank2Temperature, + // 水箱和清洗剂罐信息 + WaterTank_Temp = webSocketData.TestData.Test_WaterTankTemperature, + AgentTank_Temp = webSocketData.TestData.Test_CleaningAgentTankTemperature, + WaterTank_Level = webSocketData.TestData.Test_WaterTankLevel, + AgentTank_Level = webSocketData.TestData.Test_CleaningAgentTankLevel, - // 运行模式 - Test_WaterTankHeat = webSocketData.TestData.Test_WaterTankHeat, - Test_WaterTankAdd = webSocketData.TestData.Test_WaterTankAdd, - Test_CleaningAgentTankHeat = webSocketData.TestData.Test_CleaningAgentTankHeat, - Test_CleaningAgentTankAdd = webSocketData.TestData.Test_CleaningAgentTankAdd, - - // 监控信息 - Test_ElectricSurveillance = webSocketData.TestData.Test_ElectricSurveillance, - Test_SteamSurveillance = webSocketData.TestData.Test_SteamSurveillance - }; + // 浸泡池温度 + SoakingTank1_Temp = webSocketData.TestData.Test_SoakingTank1Temperature, + SoakingTank2_Temp = webSocketData.TestData.Test_SoakingTank2Temperature, - var Data = FRemoteSqlContext.FDb - .InsertOrUpdate() - .SetSource(curRunClearState) - .ExecuteAffrows(); + // 运行模式 + Test_WaterTankHeat = webSocketData.TestData.Test_WaterTankHeat, + Test_WaterTankAdd = webSocketData.TestData.Test_WaterTankAdd, + Test_CleaningAgentTankHeat = webSocketData.TestData.Test_CleaningAgentTankHeat, + Test_CleaningAgentTankAdd = webSocketData.TestData.Test_CleaningAgentTankAdd, - if (Data > 0) - { - Logger.Debug("实时数据已更新到远程数据库"); + // 监控信息 + Test_ElectricSurveillance = webSocketData.TestData.Test_ElectricSurveillance, + Test_SteamSurveillance = webSocketData.TestData.Test_SteamSurveillance + }; + + var Data = FRemoteSqlContext.FDb + .InsertOrUpdate() + .SetSource(curRunClearState) + .ExecuteAffrows(); + + if (Data > 0) + { + Logger.Debug("实时数据已更新到远程数据库"); + } } + catch (Exception ex) + { + Logger.Error($"UpdateRemoteDb: {ex.StackTrace}"); + } + } diff --git a/MoviconHub.App/frmMain.cs b/MoviconHub.App/frmMain.cs index d88c9a4..1e2bcf4 100644 --- a/MoviconHub.App/frmMain.cs +++ b/MoviconHub.App/frmMain.cs @@ -449,6 +449,16 @@ namespace MoviconHub.App EndTime = Value.EndTime, }; + if (Data.DeviceState == 4) + { + var ActiveAlarmModels = ListAlarmModels.Where(a => a.IsActive == true).ToList(); + if (ActiveAlarmModels != null && ActiveAlarmModels.Count > 0) + { + Data.AlarmMessage = ActiveAlarmModels.FirstOrDefault().AlarmMessage; + } + } + + var Result = FRemoteSqlContext.FDb.Insert(Data).ExecuteInserted(); if (Result != null && Result.Count > 0) { diff --git a/MoviconWebApi/API/DeviceStateApi/Data.cs b/MoviconWebApi/API/DeviceStateApi/Data.cs index 4c8c529..bc979c4 100644 --- a/MoviconWebApi/API/DeviceStateApi/Data.cs +++ b/MoviconWebApi/API/DeviceStateApi/Data.cs @@ -48,8 +48,7 @@ namespace MoviconWebApi.API.DeviceStateApi a.StandbyTime, a.FaultTime, a.ShutdownTime, - a.FaultNum, - a.JobNum + a.FaultNum }); long totalPowerOn = lightList.Sum(x => (long)(x.PowerOnTime ?? 0)); @@ -58,7 +57,11 @@ namespace MoviconWebApi.API.DeviceStateApi long totalFault = lightList.Sum(x => (long)(x.FaultTime ?? 0)); long totalShutdown = lightList.Sum(x => (long)(x.ShutdownTime ?? 0)); long totalFaultCount = lightList.Sum(x => (long)(x.FaultNum ?? 0)); - long totalJobCount = lightList.Sum(x => (long)(x.JobNum ?? 0)); + // 作业次数:来自当前搜索时间内 ClearData 的记录数 + long totalJobCount = await db.Select() + .WhereIf(!string.IsNullOrWhiteSpace(request.DeviceCode), x => x.DeviceCode == request.DeviceCode) + .Where(x => x.CreateTime >= startTime && x.CreateTime <= endTime) + .CountAsync(); // 若该时间段内没有任何记录,返回空集合 var hasAnyData = (totalPowerOn + totalRun + totalStandby + totalFault + totalShutdown + totalFaultCount + totalJobCount) > 0; @@ -99,7 +102,7 @@ namespace MoviconWebApi.API.DeviceStateApi ShutdownTime = (int)totalShutdown, UseRatio = useRatioText, FaultNum = (int)totalFaultCount, - JobNum = (int)totalJobCount, + JobNum = totalJobCount > int.MaxValue ? int.MaxValue : (int)totalJobCount, CreateTime = endTime.ToString("yyyy-MM-dd HH:mm:ss") };