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")
};