#region copyright
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
// 使用文档:https://diego2098.gitee.io/thingsgateway-docs/
// QQ群:605534569
//------------------------------------------------------------------------------
#endregion
using BlazorComponent;
using Mapster;
using Masa.Blazor;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using SqlSugar;
using System.IO;
using System.Threading;
using ThingsGateway.Admin.Blazor;
using ThingsGateway.Admin.Blazor.Core;
using ThingsGateway.Admin.Core;
using ThingsGateway.Application;
namespace ThingsGateway.Blazor;
///
/// 设备状态页面
///
public partial class DeviceStatusPage : IDisposable
{
readonly PeriodicTimer _periodicTimer = new(TimeSpan.FromSeconds(1));
List _collectDeviceCores = new();
private string _collectDeviceGroup;
List _collectDeviceGroups = new();
string _collectDeviceGroupSearchName;
List _uploadDeviceCores = new();
private string _uploadDeviceGroup;
List _uploadDeviceGroups = new();
string _uploadDeviceGroupSearchName;
CollectDeviceCore collectDeviceInfoItem;
List CurMessages = new();
bool isAllRestart;
private bool isDownExport;
bool isRestart;
bool pauseMessage;
StringNumber tab;
UploadDeviceCore uploadDeviceInfoItem;
AlarmWorker AlarmHostService { get; set; }
CollectDeviceWorker CollectDeviceHostService { get; set; }
[Inject]
GlobalDeviceData GlobalDeviceData { get; set; }
IJSObjectReference Helper { get; set; }
HistoryValueWorker HistoryValueHostService { get; set; }
[Inject]
InitTimezone InitTimezone { get; set; }
[Inject]
IJSRuntime JS { get; set; }
[CascadingParameter]
MainLayout MainLayout { get; set; }
MemoryVariableWorker MemoryVariableWorker { get; set; }
StringNumber Panel { get; set; }
UploadDeviceWorker UploadDeviceHostService { get; set; }
StringNumber Uppanel { get; set; }
///
///
///
public override void Dispose()
{
_periodicTimer?.Dispose();
base.Dispose();
}
///
protected override void OnInitialized()
{
CollectDeviceHostService = ServiceHelper.GetBackgroundService();
UploadDeviceHostService = ServiceHelper.GetBackgroundService();
AlarmHostService = ServiceHelper.GetBackgroundService();
HistoryValueHostService = ServiceHelper.GetBackgroundService();
MemoryVariableWorker = ServiceHelper.GetBackgroundService();
_ = RunTimerAsync();
base.OnInitialized();
}
///
///
///
protected override void OnParametersSet()
{
CollectDeviceQuery();
UploadDeviceQuery();
base.OnParametersSet();
}
async Task AllRestartAsync()
{
try
{
var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
if (confirm)
{
isAllRestart = true;
StateHasChanged();
PopupService.ShowProgressLinear();
await Task.Run(async () => await CollectDeviceHostService.RestartDeviceThreadAsync());
CollectDeviceQuery();
UploadDeviceQuery();
}
}
finally
{
collectDeviceInfoItem = null;
uploadDeviceInfoItem = null;
isAllRestart = false;
PopupService.HideProgressLinear();
await MainLayout.StateHasChangedAsync();
}
}
void CollectDeviceInfo(CollectDeviceCore item)
{
collectDeviceInfoItem = item;
CurMessages = new();
}
void CollectDeviceQuery()
{
_collectDeviceGroups = GlobalDeviceData.CollectDevices.Adapt>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_collectDeviceCores = CollectDeviceHostService?.CollectDeviceCores?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _collectDeviceGroup).ToList() ?? new();
}
async Task ConfigAsync(long devId, bool? isStart)
{
var str = isStart == true ? "启动" : "暂停";
var confirm = await PopupService.OpenConfirmDialogAsync(str, $"确定{str}?");
if (confirm)
{
CollectDeviceHostService.ConfigDeviceThread(devId, isStart == true);
}
}
async Task DownDeviceMessageExportAsync(List values)
{
try
{
isDownExport = true;
StateHasChanged();
using var memoryStream = new MemoryStream();
StreamWriter writer = new(memoryStream);
foreach (var item in values)
{
writer.WriteLine(item);
}
writer.Flush();
memoryStream.Seek(0, SeekOrigin.Begin);
using var streamRef = new DotNetStreamReference(stream: memoryStream);
Helper ??= await JS.InvokeAsync("import", $"/_content/ThingsGateway.Admin.Blazor.Core/js/downloadFileFromStream.js");
await Helper.InvokeVoidAsync("downloadFileFromStream", $"报文导出{SysDateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.txt", streamRef);
}
finally
{
isDownExport = false;
}
}
//去除单个采集重启
//async Task RestartAsync(long devId)
//{
// try
// {
// var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
// if (confirm)
// {
// isRestart = true;
// StateHasChanged();
// await Task.Run(async () => await CollectDeviceHostService.UpDeviceThreadAsync(devId));
// collectDeviceInfoItem = null;
// CollectDeviceQuery();
// }
// }
// catch (Exception ex)
// {
// await PopupService.EnqueueSnackbarAsync(ex.Message, AlertTypes.Warning);
// }
// finally
// {
// isRestart = false;
// await MainLayout.StateHasChangedAsync();
// }
//}
private async Task RunTimerAsync()
{
while (await _periodicTimer.WaitForNextTickAsync())
{
try
{
{
_collectDeviceGroups = GlobalDeviceData.CollectDevices.Adapt>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_collectDeviceCores = CollectDeviceHostService?.CollectDeviceCores?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _collectDeviceGroup).ToList() ?? new();
}
if (_collectDeviceCores?.FirstOrDefault()?.Device == null || CollectDeviceHostService?.CollectDeviceCores.Count != _collectDeviceCores.Count)
{
CollectDeviceQuery();
}
if (_uploadDeviceCores?.FirstOrDefault()?.Device == null || UploadDeviceHostService?.UploadDeviceCores.Count != _uploadDeviceCores.Count)
{
UploadDeviceQuery();
}
await InvokeAsync(StateHasChanged);
}
catch
{
}
}
}
async Task UpConfigAsync(long devId, bool? isStart)
{
var str = isStart == true ? "启动" : "暂停";
var confirm = await PopupService.OpenConfirmDialogAsync(str, $"确定{str}?");
if (confirm)
{
UploadDeviceHostService.ConfigDeviceThread(devId, isStart == true);
}
}
void UploadDeviceInfo(UploadDeviceCore item)
{
uploadDeviceInfoItem = item;
}
void UploadDeviceQuery()
{
_uploadDeviceGroups = UploadDeviceHostService.UploadDeviceCores.Select(a => a.Device)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
_uploadDeviceCores = UploadDeviceHostService?.UploadDeviceCores?.WhereIF(!_uploadDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _uploadDeviceGroup).ToList() ?? new();
}
async Task UpRestartAsync(long devId)
{
try
{
var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
if (confirm)
{
isRestart = true;
StateHasChanged();
await Task.Run(async () => await UploadDeviceHostService.UpDeviceThreadAsync(devId));
uploadDeviceInfoItem = null;
UploadDeviceQuery();
}
}
catch (Exception ex)
{
await PopupService.EnqueueSnackbarAsync(ex.Message, AlertTypes.Warning);
}
finally
{
isRestart = false;
await MainLayout.StateHasChangedAsync();
}
}
}