This commit is contained in:
2025-10-30 12:02:12 +08:00
parent 32f68c544e
commit e460ff6c04
5 changed files with 127 additions and 91 deletions

View File

@@ -14,7 +14,7 @@ namespace MoviconHub.App
{ {
public static IFreeSql FDb = new FreeSql.FreeSqlBuilder() public static IFreeSql FDb = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, ConfigHelper.GetValue("RemoteConnecting")) .UseConnectionString(FreeSql.DataType.SqlServer, ConfigHelper.GetValue("RemoteConnecting"))
.UseAutoSyncStructure(true) //自动同步实体结构到数据库 .UseAutoSyncStructure(false) //自动同步实体结构到数据库
.Build(); //请务必定义成 Singleton 单例模式 .Build(); //请务必定义成 Singleton 单例模式
} }
} }

View File

@@ -50,6 +50,11 @@ namespace MoviconHub.App.Models
[Column(Name = "DeviceState", IsNullable = true)] [Column(Name = "DeviceState", IsNullable = true)]
public int? DeviceState { get; set; } public int? DeviceState { get; set; }
/// <summary>
/// 报警信息
/// </summary>
[Column(Name = "AlarmMessage", StringLength = 180, IsNullable = true)]
public string AlarmMessage { get; set; }
/// <summary> /// <summary>
/// 创建时间 /// 创建时间

View File

@@ -117,7 +117,7 @@ namespace MoviconHub.App.Services
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Error(ex, "轮询RTVar数据时发生错误"); Logger.Error($"实时数据轮询时发生错误: {ex.Message}");
// 发生错误时,等待一段时间后重试 // 发生错误时,等待一段时间后重试
await Task.Delay(5000, cancellationToken); await Task.Delay(5000, cancellationToken);
} }
@@ -142,7 +142,7 @@ namespace MoviconHub.App.Services
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Error(ex, "读取RTVar数据时发生错误"); Logger.Error($"读取RTVar数据时发生错误: {ex.StackTrace}");
throw; throw;
} }
} }
@@ -153,51 +153,61 @@ namespace MoviconHub.App.Services
/// <param name="rtVars">RTVar数据列表</param> /// <param name="rtVars">RTVar数据列表</param>
private void UpdateWebSocketData(List<RTVar> rtVars) private void UpdateWebSocketData(List<RTVar> rtVars)
{ {
if (rtVars == null || rtVars.Count == 0) try
return;
lock (_lockObject)
{ {
// 更新设备状态信息 if (rtVars == null || rtVars.Count == 0)
var deviceCodeVar = rtVars.FirstOrDefault(v => v.Name == "Device_Code"); return;
if (deviceCodeVar != null)
_realtimeData.Device_Code = deviceCodeVar.Val;
var deviceNameVar = rtVars.FirstOrDefault(v => v.Name == "Device_Name"); lock (_lockObject)
if (deviceNameVar != null) {
_realtimeData.Device_Name = deviceNameVar.Val;
var deviceManufacturerVar = rtVars.FirstOrDefault(v => v.Name == "Device_Manufacturer"); // 更新设备状态信息
if (deviceManufacturerVar != null) var deviceCodeVar = rtVars.FirstOrDefault(v => v.Name == "Device_Code");
_realtimeData.Device_Manufacturer = deviceManufacturerVar.Val; if (deviceCodeVar != null)
_realtimeData.Device_Code = deviceCodeVar.Val;
var statusVar = rtVars.FirstOrDefault(v => v.Name == "Device_Status"); var deviceNameVar = rtVars.FirstOrDefault(v => v.Name == "Device_Name");
if (statusVar != null) if (deviceNameVar != null)
_realtimeData.Device_Status = statusVar.Val; _realtimeData.Device_Name = deviceNameVar.Val;
// 解析故障信息 var deviceManufacturerVar = rtVars.FirstOrDefault(v => v.Name == "Device_Manufacturer");
UpdateFaultDetails(rtVars); if (deviceManufacturerVar != null)
_realtimeData.Device_Manufacturer = deviceManufacturerVar.Val;
// 解析组件信息 var statusVar = rtVars.FirstOrDefault(v => v.Name == "Device_Status");
UpdateComponentsInfo(rtVars); 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}");
}
} }
/// <summary> /// <summary>
@@ -206,72 +216,80 @@ namespace MoviconHub.App.Services
/// <param name="webSocketData"></param> /// <param name="webSocketData"></param>
private void UpdateRemoteDb(WebSocketData webSocketData) private void UpdateRemoteDb(WebSocketData webSocketData)
{ {
// 获取组件信息 try
var component = webSocketData.ListComponentsInfo?.FirstOrDefault();
// 创建CurRunClearState对象并映射数据
var curRunClearState = new CurRunClearState()
{ {
//只有一个,更新数据 // 获取组件信息
Id = 1, var component = webSocketData.ListComponentsInfo?.FirstOrDefault();
// 基本信息 // 创建CurRunClearState对象并映射数据
DeviceCode = webSocketData.Device_Code, var curRunClearState = new CurRunClearState()
DeviceName = webSocketData.Device_Name, {
//只有一个,更新数据
Id = 1,
// 组件信息 // 基本信息
part_qrid = component?.part_qrid, DeviceCode = webSocketData.Device_Code,
part_num = component?.part_num, DeviceName = webSocketData.Device_Name,
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,
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,
// 程序进程 program_process = webSocketData.TestData.Test_FrameworkProgramProcess,
Test_FrameworkProgramProcess = webSocketData.TestData.Test_FrameworkProgramProcess,
Test_FrameworkProgramProcessPercentage = webSocketData.TestData.Test_FrameworkProgramProcessPercentage,
// 设备状态 // 程序进程
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_PartsEquipmentStatus = webSocketData.TestData.Test_PartsEquipmentStatus,
Test_FrameworkPerModelCleaningAgentUsage = webSocketData.TestData.Test_FrameworkPerModelCleaningAgentUsage,
Test_FrameworkPerModelWaterUsage = webSocketData.TestData.Test_FrameworkPerModelWaterUsage,
// 水箱和清洗剂罐信息 // 清洗时长和用量
WaterTank_Temp = webSocketData.TestData.Test_WaterTankTemperature, Test_FrameworkPerModelCleaningDuration = webSocketData.TestData.Test_FrameworkPerModelCleaningDuration,
AgentTank_Temp = webSocketData.TestData.Test_CleaningAgentTankTemperature, Test_FrameworkPerModelCleaningAgentUsage = webSocketData.TestData.Test_FrameworkPerModelCleaningAgentUsage,
WaterTank_Level = webSocketData.TestData.Test_WaterTankLevel, Test_FrameworkPerModelWaterUsage = webSocketData.TestData.Test_FrameworkPerModelWaterUsage,
AgentTank_Level = webSocketData.TestData.Test_CleaningAgentTankLevel,
// 浸泡池温度 // 水箱和清洗剂罐信息
SoakingTank1_Temp = webSocketData.TestData.Test_SoakingTank1Temperature, WaterTank_Temp = webSocketData.TestData.Test_WaterTankTemperature,
SoakingTank2_Temp = webSocketData.TestData.Test_SoakingTank2Temperature, AgentTank_Temp = webSocketData.TestData.Test_CleaningAgentTankTemperature,
WaterTank_Level = webSocketData.TestData.Test_WaterTankLevel,
AgentTank_Level = webSocketData.TestData.Test_CleaningAgentTankLevel,
// 运行模式 // 浸泡池温度
Test_WaterTankHeat = webSocketData.TestData.Test_WaterTankHeat, SoakingTank1_Temp = webSocketData.TestData.Test_SoakingTank1Temperature,
Test_WaterTankAdd = webSocketData.TestData.Test_WaterTankAdd, SoakingTank2_Temp = webSocketData.TestData.Test_SoakingTank2Temperature,
Test_CleaningAgentTankHeat = webSocketData.TestData.Test_CleaningAgentTankHeat,
Test_CleaningAgentTankAdd = webSocketData.TestData.Test_CleaningAgentTankAdd,
// 监控信息 // 运行模式
Test_ElectricSurveillance = webSocketData.TestData.Test_ElectricSurveillance, Test_WaterTankHeat = webSocketData.TestData.Test_WaterTankHeat,
Test_SteamSurveillance = webSocketData.TestData.Test_SteamSurveillance Test_WaterTankAdd = webSocketData.TestData.Test_WaterTankAdd,
}; Test_CleaningAgentTankHeat = webSocketData.TestData.Test_CleaningAgentTankHeat,
Test_CleaningAgentTankAdd = webSocketData.TestData.Test_CleaningAgentTankAdd,
var Data = FRemoteSqlContext.FDb // 监控信息
.InsertOrUpdate<CurRunClearState>() Test_ElectricSurveillance = webSocketData.TestData.Test_ElectricSurveillance,
.SetSource(curRunClearState) Test_SteamSurveillance = webSocketData.TestData.Test_SteamSurveillance
.ExecuteAffrows(); };
if (Data > 0) var Data = FRemoteSqlContext.FDb
{ .InsertOrUpdate<CurRunClearState>()
Logger.Debug("实时数据已更新到远程数据库"); .SetSource(curRunClearState)
.ExecuteAffrows();
if (Data > 0)
{
Logger.Debug("实时数据已更新到远程数据库");
}
} }
catch (Exception ex)
{
Logger.Error($"UpdateRemoteDb: {ex.StackTrace}");
}
} }

View File

@@ -449,6 +449,16 @@ namespace MoviconHub.App
EndTime = Value.EndTime, 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<DeviceStatusChange>(Data).ExecuteInserted(); var Result = FRemoteSqlContext.FDb.Insert<DeviceStatusChange>(Data).ExecuteInserted();
if (Result != null && Result.Count > 0) if (Result != null && Result.Count > 0)
{ {

View File

@@ -48,8 +48,7 @@ namespace MoviconWebApi.API.DeviceStateApi
a.StandbyTime, a.StandbyTime,
a.FaultTime, a.FaultTime,
a.ShutdownTime, a.ShutdownTime,
a.FaultNum, a.FaultNum
a.JobNum
}); });
long totalPowerOn = lightList.Sum(x => (long)(x.PowerOnTime ?? 0)); 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 totalFault = lightList.Sum(x => (long)(x.FaultTime ?? 0));
long totalShutdown = lightList.Sum(x => (long)(x.ShutdownTime ?? 0)); long totalShutdown = lightList.Sum(x => (long)(x.ShutdownTime ?? 0));
long totalFaultCount = lightList.Sum(x => (long)(x.FaultNum ?? 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<ClearData>()
.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; var hasAnyData = (totalPowerOn + totalRun + totalStandby + totalFault + totalShutdown + totalFaultCount + totalJobCount) > 0;
@@ -99,7 +102,7 @@ namespace MoviconWebApi.API.DeviceStateApi
ShutdownTime = (int)totalShutdown, ShutdownTime = (int)totalShutdown,
UseRatio = useRatioText, UseRatio = useRatioText,
FaultNum = (int)totalFaultCount, FaultNum = (int)totalFaultCount,
JobNum = (int)totalJobCount, JobNum = totalJobCount > int.MaxValue ? int.MaxValue : (int)totalJobCount,
CreateTime = endTime.ToString("yyyy-MM-dd HH:mm:ss") CreateTime = endTime.ToString("yyyy-MM-dd HH:mm:ss")
}; };