Browse Source

GetProtocolLogsNotInActiveRuntimesAsync 去除多表关联

feature/x1-web-request
hyh 3 days ago
parent
commit
56890fb326
  1. 2
      src/X1.Application/Features/ProtocolLogs/Queries/GetProtocolLogsByDevice/GetProtocolLogsByDeviceQueryHandler.cs
  2. 22
      src/X1.Domain/Repositories/Logging/IProtocolLogRepository.cs
  3. 136
      src/X1.Infrastructure/Repositories/Logging/ProtocolLogRepository.cs
  4. 7292
      src/modify.md

2
src/X1.Application/Features/ProtocolLogs/Queries/GetProtocolLogsByDevice/GetProtocolLogsByDeviceQueryHandler.cs

@ -54,7 +54,7 @@ public class GetProtocolLogsByDeviceQueryHandler : IRequestHandler<GetProtocolLo
request.DeviceCode, request.DeviceRuntimeStatus);
// 使用高性能查询方法,直接返回ProtocolLogListDto
var protocolLogs = await _protocolLogRepository.GetByDeviceWithFiltersAsync(
var protocolLogs = await _protocolLogRepository.GetProtocolLogsNotInActiveRuntimesAsync(
request.DeviceCode,
request.RuntimeCodes, // 直接使用请求中的运行时代码数组
request.StartTimestamp,

22
src/X1.Domain/Repositories/Logging/IProtocolLogRepository.cs

@ -91,4 +91,26 @@ public interface IProtocolLogRepository : IBaseRepository<ProtocolLog>
/// <returns>RuntimeCode和DeviceCode列表</returns>
Task<IEnumerable<ProtocolLogRuntimeDeviceDto>> GetRuntimeDeviceCodesNotInActiveRuntimesAsync(CancellationToken cancellationToken = default);
/// <summary>
/// 获取不在活跃运行时状态中的协议日志(高性能查询,不包含MessageDetailJson)
/// </summary>
/// <param name="deviceCode">设备代码</param>
/// <param name="runtimeCodes">运行时代码集合</param>
/// <param name="startTimestamp">开始时间戳</param>
/// <param name="endTimestamp">结束时间戳</param>
/// <param name="layerTypes">协议层类型数组</param>
/// <param name="runtimeStatuses">运行时状态过滤(可选,支持多个状态)</param>
/// <param name="orderByDescending">是否按时间戳降序排序</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>协议日志列表DTO</returns>
Task<IEnumerable<ProtocolLogListDto>> GetProtocolLogsNotInActiveRuntimesAsync(
string? deviceCode,
IEnumerable<string>? runtimeCodes = null,
long? startTimestamp = null,
long? endTimestamp = null,
IEnumerable<int>? layerTypes = null,
IEnumerable<int>? runtimeStatuses = null,
bool orderByDescending = true,
CancellationToken cancellationToken = default);
}

136
src/X1.Infrastructure/Repositories/Logging/ProtocolLogRepository.cs

@ -356,4 +356,140 @@ public class ProtocolLogRepository : BaseRepository<ProtocolLog>, IProtocolLogRe
throw;
}
}
/// <summary>
/// 获取不在活跃运行时状态中的协议日志(高性能查询,不包含MessageDetailJson)
/// </summary>
/// <param name="deviceCode">设备代码</param>
/// <param name="runtimeCodes">运行时代码集合</param>
/// <param name="startTimestamp">开始时间戳</param>
/// <param name="endTimestamp">结束时间戳</param>
/// <param name="layerTypes">协议层类型数组</param>
/// <param name="runtimeStatuses">运行时状态过滤(可选,支持多个状态)</param>
/// <param name="orderByDescending">是否按时间戳降序排序</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>协议日志列表DTO</returns>
public async Task<IEnumerable<ProtocolLogListDto>> GetProtocolLogsNotInActiveRuntimesAsync(
string? deviceCode,
IEnumerable<string>? runtimeCodes = null,
long? startTimestamp = null,
long? endTimestamp = null,
IEnumerable<int>? layerTypes = null,
IEnumerable<int>? runtimeStatuses = null,
bool orderByDescending = false,
CancellationToken cancellationToken = default)
{
try
{
// 构建 SQL 查询 - 基于您提供的SQL,但添加了与GetByDeviceWithFiltersAsync相同的过滤条件
var sql = @"
SELECT
pl.""Id"",
pl.""MessageId"",
pl.""LayerType"",
pl.""CellID"",
pl.""IMSI"",
pl.""Direction"",
pl.""UEID"",
pl.""PLMN"",
pl.""TimeMs"",
pl.""Timestamp"",
pl.""Info"",
pl.""Message"",
pl.""DeviceCode"",
pl.""RuntimeCode""
FROM ""tb_protocol_logs"" pl
WHERE ";
// 根据 runtimeStatuses 参数动态决定使用 EXISTS 还是 NOT EXISTS
bool containsActiveStatus = runtimeStatuses != null && runtimeStatuses.Contains(1);
if (containsActiveStatus)
{
sql += @"EXISTS (
SELECT 1
FROM ""tb_cellular_device_runtimes"" t
WHERE t.""RuntimeStatus"" = 1
AND t.""RuntimeCode"" = pl.""RuntimeCode""
)";
}
else
{
sql += @"NOT EXISTS (
SELECT 1
FROM ""tb_cellular_device_runtimes"" t
WHERE t.""RuntimeStatus"" = 1
AND t.""RuntimeCode"" = pl.""RuntimeCode""
)";
}
var parameters = new List<object>();
var paramIndex = 0;
// 添加设备代码过滤
if (!string.IsNullOrEmpty(deviceCode))
{
sql += $" AND pl.\"DeviceCode\" = {{{paramIndex}}}";
parameters.Add(deviceCode);
paramIndex++;
}
// 添加时间范围过滤
if (startTimestamp.HasValue)
{
sql += $" AND pl.\"Timestamp\" >= {{{paramIndex}}}";
parameters.Add(startTimestamp.Value);
paramIndex++;
}
if (endTimestamp.HasValue)
{
sql += $" AND pl.\"Timestamp\" <= {{{paramIndex}}}";
parameters.Add(endTimestamp.Value);
paramIndex++;
}
// 添加协议层类型过滤
if (layerTypes != null && layerTypes.Any())
{
var layerTypeList = string.Join(",", layerTypes.Select((_, i) => $"{{{paramIndex + i}}}"));
sql += $" AND pl.\"LayerType\" IN ({layerTypeList})";
foreach (var layerType in layerTypes)
{
parameters.Add(layerType);
}
paramIndex += layerTypes.Count();
}
// 添加运行时代码过滤
if (runtimeCodes != null && runtimeCodes.Any())
{
var runtimeCodeList = string.Join(",", runtimeCodes.Select((_, i) => $"{{{paramIndex + i}}}"));
sql += $" AND pl.\"RuntimeCode\" IN ({runtimeCodeList})";
parameters.AddRange(runtimeCodes);
paramIndex += runtimeCodes.Count();
}
// 添加排序
if (orderByDescending)
{
sql += " ORDER BY pl.\"Timestamp\" DESC";
}
else
{
sql += " ORDER BY pl.\"Timestamp\" ASC";
}
// 执行SQL查询,直接映射到ProtocolLogListDto
var result = await QueryRepository.ExecuteSqlQueryAsync<ProtocolLogListDto>(sql, parameters.ToArray(), cancellationToken);
_logger.LogDebug("获取不在活跃运行时状态中的协议日志,结果数量:{Count}", result.Count());
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "获取不在活跃运行时状态中的协议日志时发生错误");
throw;
}
}
}

7292
src/modify.md

File diff suppressed because it is too large
Loading…
Cancel
Save