|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |