You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.1 KiB

# 修改记录
## 2024年修改记录
### 协议日志仓储修改
#### 修改文件:
1. `X1.Domain/Repositories/Logging/IProtocolLogRepository.cs`
2. `X1.Infrastructure/Repositories/Logging/ProtocolLogRepository.cs`
#### 修改内容:
1. **保留现有方法**
- 保留了 `GetByDeviceWithFiltersAsync` 方法,该方法用于根据设备代码和运行时状态获取协议日志
2. **新增方法**
- 在接口 `IProtocolLogRepository` 中添加了 `GetProtocolLogsNotInActiveRuntimesAsync` 方法
- 在实现类 `ProtocolLogRepository` 中实现了该方法
3. **新方法特性**
- 方法名:`GetProtocolLogsNotInActiveRuntimesAsync`
- 功能:获取不在活跃运行时状态中的协议日志
- 参数:与 `GetByDeviceWithFiltersAsync` 保持一致
- `deviceCode`:设备代码
- `runtimeCodes`:运行时代码集合
- `startTimestamp`:开始时间戳
- `endTimestamp`:结束时间戳
- `layerTypes`:协议层类型数组
- `runtimeStatuses`:运行时状态过滤
- `orderByDescending`:是否按时间戳降序排序
- `cancellationToken`:取消令牌
- 返回类型:`IEnumerable<ProtocolLogListDto>`
4. **SQL查询逻辑**
- 基于用户提供的SQL查询
- **动态查询逻辑**:根据 `runtimeStatuses` 参数动态决定使用 `EXISTS` 还是 `NOT EXISTS`
-`runtimeStatuses` 包含值 1 时,使用 `EXISTS` 包含活跃运行时状态(`RuntimeStatus = 1`)的记录
-`runtimeStatuses` 不包含值 1 时,使用 `NOT EXISTS` 排除活跃运行时状态(`RuntimeStatus = 1`)的记录
- 支持所有与 `GetByDeviceWithFiltersAsync` 相同的过滤条件
- 高性能查询,不包含 `MessageDetailJson` 字段
5. **动态查询逻辑示例**
**当 runtimeStatuses 包含值 1 时(使用 EXISTS)**
```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 EXISTS (
SELECT 1
FROM "tb_cellular_device_runtimes" t
WHERE t."RuntimeStatus" = 1
AND t."RuntimeCode" = pl."RuntimeCode"
)
```
**当 runtimeStatuses 不包含值 1 时(使用 NOT EXISTS)**
```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 NOT EXISTS (
SELECT 1
FROM "tb_cellular_device_runtimes" t
WHERE t."RuntimeStatus" = 1
AND t."RuntimeCode" = pl."RuntimeCode"
)
```
#### 修改时间:
2024年
#### 修改原因:
用户需要一个新的方法来获取不在活跃运行时状态中的协议日志,同时保持与现有 `GetByDeviceWithFiltersAsync` 方法相同的参数和过滤条件。