251030
This commit is contained in:
@@ -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 单例模式
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
/// 创建时间
|
/// 创建时间
|
||||||
|
|||||||
@@ -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}");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user