using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using YunDa.Server.Communication.Framework;
using YunDa.Server.ISMSTcp.Domain;
using YunDa.Server.ISMSTcp.Interfaces;
using YunDa.Server.ISMSTcp.Models;
using YunDa.Server.ISMSTcp.Services;
using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto;
using YunDa.SOMS.Redis.Repositories;
namespace YunDa.Server.ISMSTcp.Controllers
{
///
/// 查询API控制器
///
[ApiController]
[Route("api")]
public class QueryController : ControllerBase
{
private readonly ILogger _logger;
private readonly IQueryService _queryService;
private readonly IWebSocketMessageBroadcaster _webSocketBroadcaster;
private readonly IRedisRepository _protectionDeviceCommInfoOutputredisRepository;
private readonly WebApiRequest _webApiRequest;
private readonly ITcpClient _tcpClient;
private readonly TelemeteringHandle _telemeteringHandle;
private readonly TelesignalisationHandle _telesignalisationHandle;
private readonly GwErrorRatioService _gwErrorRatioService;
private readonly VirtualTerminalHandler _virtualTerminalHandler;
///
/// 构造函数
///
/// 日志记录器
/// 查询服务
/// WebSocket消息广播器
/// 保护装置通信信息Redis仓储
/// Web API请求服务
/// TCP客户端
/// 遥测数据处理服务
public QueryController(
ILogger logger,
IQueryService queryService,
IRedisRepository protectionDeviceCommInfoOutputredisRepository,
IWebSocketMessageBroadcaster webSocketBroadcaster,
WebApiRequest webApiRequest,
ITcpClient tcpClient,
TelemeteringHandle telemeteringHandle,
TelesignalisationHandle telesignalisationHandle,
GwErrorRatioService gwErrorRatioService,
VirtualTerminalHandler virtualTerminalHandler)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_queryService = queryService ?? throw new ArgumentNullException(nameof(queryService));
_protectionDeviceCommInfoOutputredisRepository = protectionDeviceCommInfoOutputredisRepository ?? throw new ArgumentNullException(nameof(protectionDeviceCommInfoOutputredisRepository));
_webSocketBroadcaster = webSocketBroadcaster ?? throw new ArgumentNullException(nameof(webSocketBroadcaster));
_webApiRequest = webApiRequest ?? throw new ArgumentNullException(nameof(webApiRequest));
_tcpClient = tcpClient ?? throw new ArgumentNullException(nameof(tcpClient));
_telemeteringHandle = telemeteringHandle ?? throw new ArgumentNullException(nameof(telemeteringHandle));
_telesignalisationHandle = telesignalisationHandle ?? throw new ArgumentNullException(nameof(telesignalisationHandle));
_gwErrorRatioService = gwErrorRatioService ?? throw new ArgumentNullException(nameof(gwErrorRatioService));
_virtualTerminalHandler = virtualTerminalHandler ?? throw new ArgumentNullException(nameof(virtualTerminalHandler));
}
///
/// 处理查询请求
///
/// 定值参数
/// 故障报告参数
/// 波形配置参数
/// 波形文件参数
/// 装置版本参数
/// 取消令牌
/// 查询结果
[HttpGet]
public async Task ProcessQuery(
[FromQuery] string? dz = null,
[FromQuery] string? faultRpt = null,
[FromQuery] string? waveCfg = null,
[FromQuery] string? waveDat = null,
[FromQuery] string? version = null,
CancellationToken cancellationToken = default)
{
try
{
LogQueryRequest(dz, faultRpt, waveCfg, waveDat, version);
var result = await DetermineAndExecuteQueryAsync(dz, faultRpt, waveCfg, waveDat, version, cancellationToken);
return CreateActionResult(result);
}
catch (OperationCanceledException)
{
return HandleOperationCanceled();
}
catch (Exception ex)
{
return HandleUnexpectedException(ex);
}
}
///
/// 记录查询请求日志
///
/// 定值参数
/// 故障报告参数
/// 波形配置参数
/// 波形文件参数
/// 装置版本参数
private void LogQueryRequest(string? dz, string? faultRpt, string? waveCfg, string? waveDat, string? version)
{
_logger.LogWarning("收到查询请求 - dz:{Dz}, faultRpt:{FaultRpt}, waveCfg:{WaveCfg}, waveDat:{WaveDat}, version:{Version}",
dz, faultRpt, waveCfg, waveDat, version);
}
///
/// 确定查询类型并执行相应的查询
///
/// 定值参数
/// 故障报告参数
/// 波形配置参数
/// 波形文件参数
/// 装置版本参数
/// 取消令牌
/// 查询结果
private async Task> DetermineAndExecuteQueryAsync(
string? dz,
string? faultRpt,
string? waveCfg,
string? waveDat,
string? version,
CancellationToken cancellationToken)
{
//_logger.LogWarning("收到查询命令: {Item}", yxItem?.ToString());
if (!string.IsNullOrEmpty(dz))
{
return await ExecuteSettingValueQueryAsync(dz, cancellationToken);
}
else if (!string.IsNullOrEmpty(faultRpt))
{
return await ExecuteFaultReportQueryAsync(faultRpt, cancellationToken);
}
else if (!string.IsNullOrEmpty(waveCfg))
{
return await ExecuteWaveConfigQueryAsync(waveCfg, cancellationToken);
}
else if (!string.IsNullOrEmpty(waveDat))
{
return await ExecuteWaveDataQueryAsync(waveDat, cancellationToken);
}
else if (!string.IsNullOrEmpty(version))
{
return await ExecuteVersionQueryAsync(version, cancellationToken);
}
else
{
return WebResult