diff --git a/src/BuildFlow.Host/Services/BackgroundServices/MonitoringSyncSchedulerService.cs b/src/BuildFlow.Host/Services/BackgroundServices/MonitoringSyncSchedulerService.cs index 62e1913..9694d83 100644 --- a/src/BuildFlow.Host/Services/BackgroundServices/MonitoringSyncSchedulerService.cs +++ b/src/BuildFlow.Host/Services/BackgroundServices/MonitoringSyncSchedulerService.cs @@ -7,7 +7,7 @@ namespace BuildFlow.Host.Services.BackgroundServices; /// /// 监控同步后台调度器:按 MonitoringOptions.Scheduler.PollIntervalSeconds 轮询, -/// 找出到期的启用 ExternalSystem(LastSyncedAt + PollInterval <= now), +/// 找出到期的启用 ExternalSystemEntity(LastSyncedAt + PollInterval <= now), /// 调用 SyncProcessor 执行同步。 /// /// 设计要点(与 WebhookDispatcherService 一致): diff --git a/src/modules/monitoring/Application/ExternalSystems/DTOs/ExternalSystemDetailDto.cs b/src/modules/monitoring/Application/ExternalSystems/DTOs/ExternalSystemDetailDto.cs index 049262b..068552d 100644 --- a/src/modules/monitoring/Application/ExternalSystems/DTOs/ExternalSystemDetailDto.cs +++ b/src/modules/monitoring/Application/ExternalSystems/DTOs/ExternalSystemDetailDto.cs @@ -1,4 +1,8 @@ -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Application.ExternalSystems.DTOs; diff --git a/src/modules/monitoring/Application/ExternalSystems/Handlers/CreateExternalSystemCommandHandler.cs b/src/modules/monitoring/Application/ExternalSystems/Handlers/CreateExternalSystemCommandHandler.cs index 2cfd78a..148d0c7 100644 --- a/src/modules/monitoring/Application/ExternalSystems/Handlers/CreateExternalSystemCommandHandler.cs +++ b/src/modules/monitoring/Application/ExternalSystems/Handlers/CreateExternalSystemCommandHandler.cs @@ -3,7 +3,11 @@ using BuildFlow.Shared.Domain.Errors; using MediatR; using Monitoring.Application.ExternalSystems.Commands; using Monitoring.Application.ExternalSystems.DTOs; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Enums; using Monitoring.Infrastructure.Persistence; using System.Text.Json; @@ -16,15 +20,15 @@ public class CreateExternalSystemCommandHandler(MonitoringDbContext db) { public async Task Handle(CreateExternalSystemCommand request, CancellationToken ct) { - if (!Enum.IsDefined(typeof(ExternalSystemType), request.SystemType)) + if (!Enum.IsDefined(typeof(ExternalSystemTypeEnum), request.SystemType)) throw new BusinessException(ErrorCode.InvalidParam, $"无效的系统类型: {request.SystemType}"); - var systemType = (ExternalSystemType)request.SystemType; + var systemType = (ExternalSystemTypeEnum)request.SystemType; var parameters = string.IsNullOrEmpty(request.ParametersJson) ? new Dictionary() : JsonSerializer.Deserialize>(request.ParametersJson) ?? new(); - var system = new ExternalSystem + var system = new ExternalSystemEntity { Data = new SystemData { diff --git a/src/modules/monitoring/Application/ExternalSystems/Handlers/LoginExternalSystemCommandHandler.cs b/src/modules/monitoring/Application/ExternalSystems/Handlers/LoginExternalSystemCommandHandler.cs index 04b3599..676250c 100644 --- a/src/modules/monitoring/Application/ExternalSystems/Handlers/LoginExternalSystemCommandHandler.cs +++ b/src/modules/monitoring/Application/ExternalSystems/Handlers/LoginExternalSystemCommandHandler.cs @@ -26,7 +26,7 @@ public class LoginExternalSystemCommandHandler( ?? throw new NotFoundException(ErrorCode.NotFound, $"外部系统 {request.SystemId} 不存在"); // 目前仅支持 u号租自动登录 - if (system.Data.SystemType != ExternalSystemType.UHaoZu) + if (system.Data.SystemType != ExternalSystemTypeEnum.UHaoZu) { return new LoginResult(false, $"{system.Data.SystemType} 类型暂不支持自动登录", 0); } diff --git a/src/modules/monitoring/Application/ExternalSystems/Handlers/UpdateExternalSystemCommandHandler.cs b/src/modules/monitoring/Application/ExternalSystems/Handlers/UpdateExternalSystemCommandHandler.cs index af13277..cce2d1e 100644 --- a/src/modules/monitoring/Application/ExternalSystems/Handlers/UpdateExternalSystemCommandHandler.cs +++ b/src/modules/monitoring/Application/ExternalSystems/Handlers/UpdateExternalSystemCommandHandler.cs @@ -5,7 +5,11 @@ using MediatR; using Microsoft.EntityFrameworkCore; using Monitoring.Application.ExternalSystems.Commands; using Monitoring.Application.ExternalSystems.DTOs; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Infrastructure.Persistence; namespace Monitoring.Application.ExternalSystems.Handlers; diff --git a/src/modules/monitoring/Application/MonitoringOptions.cs b/src/modules/monitoring/Application/MonitoringOptions.cs index 9927e90..0173493 100644 --- a/src/modules/monitoring/Application/MonitoringOptions.cs +++ b/src/modules/monitoring/Application/MonitoringOptions.cs @@ -12,7 +12,7 @@ public class MonitoringOptions /// 调度器配置节。 public class SchedulerSection { - /// 轮询间隔(秒)。调度器按此频率扫描到期的 ExternalSystem。 + /// 轮询间隔(秒)。调度器按此频率扫描到期的 ExternalSystemEntity。 public int PollIntervalSeconds { get; set; } = 60; /// 应用启动后延迟多少秒开始首次扫描,避免与启动初始化争抢资源。 diff --git a/src/modules/monitoring/Application/Reports/Handlers/GetSyncSummaryQueryHandler.cs b/src/modules/monitoring/Application/Reports/Handlers/GetSyncSummaryQueryHandler.cs index e9755ec..951c550 100644 --- a/src/modules/monitoring/Application/Reports/Handlers/GetSyncSummaryQueryHandler.cs +++ b/src/modules/monitoring/Application/Reports/Handlers/GetSyncSummaryQueryHandler.cs @@ -23,7 +23,7 @@ public class GetSyncSummaryQueryHandler(MonitoringDbContext db) // 最近一次成功的汇总指标(json_data 在表达式树里翻译不了,先物化再读 Data) var latestSuccess = await db.SyncJobs - .Where(j => j.ExternalSystemId == request.ExternalSystemId && j.Status == SyncJobStatus.Succeeded) + .Where(j => j.ExternalSystemId == request.ExternalSystemId && j.Status == SyncJobStatusEnum.Succeeded) .OrderByDescending(j => j.FinishedAt) .FirstOrDefaultAsync(ct); var metrics = latestSuccess?.Data.SummaryMetrics ?? new Dictionary(); diff --git a/src/modules/monitoring/Application/Reports/Queries/GetDailyTrendQuery.cs b/src/modules/monitoring/Application/Reports/Queries/GetDailyTrendQuery.cs index 39d5f1e..70cd5ba 100644 --- a/src/modules/monitoring/Application/Reports/Queries/GetDailyTrendQuery.cs +++ b/src/modules/monitoring/Application/Reports/Queries/GetDailyTrendQuery.cs @@ -3,7 +3,7 @@ using Monitoring.Application.Reports.DTOs; namespace Monitoring.Application.Reports.Queries; -/// 查询某外部系统按天的记录数趋势(基于 SyncedRecord.OccurredAt 聚合)。 +/// 查询某外部系统按天的记录数趋势(基于 SyncedRecordEntity.OccurredAt 聚合)。 /// 外部系统 Id。 /// 最近 N 天,默认 14。 public record GetDailyTrendQuery(Guid ExternalSystemId, int Days = 14) diff --git a/src/modules/monitoring/Application/Sync/Commands/TriggerSyncCommand.cs b/src/modules/monitoring/Application/Sync/Commands/TriggerSyncCommand.cs index 70ae6fb..e5ab0ae 100644 --- a/src/modules/monitoring/Application/Sync/Commands/TriggerSyncCommand.cs +++ b/src/modules/monitoring/Application/Sync/Commands/TriggerSyncCommand.cs @@ -3,6 +3,6 @@ using Monitoring.Application.Sync.DTOs; namespace Monitoring.Application.Sync.Commands; -/// 手动触发某外部系统立即同步。返回本次 SyncJob 概览。 +/// 手动触发某外部系统立即同步。返回本次 SyncJobEntity 概览。 /// 目标外部系统 Id。 public record TriggerSyncCommand(Guid ExternalSystemId) : IRequest; diff --git a/src/modules/monitoring/Application/Sync/SyncProcessor.cs b/src/modules/monitoring/Application/Sync/SyncProcessor.cs index d4ddd1d..c255780 100644 --- a/src/modules/monitoring/Application/Sync/SyncProcessor.cs +++ b/src/modules/monitoring/Application/Sync/SyncProcessor.cs @@ -2,7 +2,11 @@ using System.Text.Json; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Enums; using Monitoring.Domain.Services; using Monitoring.Infrastructure.Persistence; @@ -10,12 +14,12 @@ using Monitoring.Infrastructure.Persistence; namespace Monitoring.Application.Sync; /// -/// 同步编排核心。从 ExternalSystem 路由到对应 IExternalConnector,执行拉取→落库→记 SyncJob, +/// 同步编排核心。从 ExternalSystemEntity 路由到对应 IExternalConnector,执行拉取→落库→记 SyncJobEntity, /// 并在成功后触发告警评估。纯业务逻辑、无 HostedService 依赖,便于单元测试。 /// /// 设计要点: /// 1. Connector 路由:从 IServiceProvider 取 IEnumerable<IExternalConnector>,按 SystemType 选实现; -/// 2. 幂等落库:SyncedRecord 按 (ExternalSystemId, ExternalId, RecordType) UPSERT,重复拉取只保留最新快照; +/// 2. 幂等落库:SyncedRecordEntity 按 (ExternalSystemId, ExternalId, RecordType) UPSERT,重复拉取只保留最新快照; /// 3. 失败隔离:异常记录为 Failed 不抛出,单个系统失败不影响调度器后续系统。 /// json_data 模式:所有业务字段经实体 .Data 强类型视图读写,自动序列化进 JsonData 列。 /// @@ -24,8 +28,8 @@ public class SyncProcessor( IServiceProvider services, ILogger logger) { - /// 对单个外部系统执行一次同步。返回本次 SyncJob 记录(已落库)。 - public async Task ExecuteAsync(ExternalSystem system, string triggerSource, CancellationToken ct) + /// 对单个外部系统执行一次同步。返回本次 SyncJobEntity 记录(已落库)。 + public async Task ExecuteAsync(ExternalSystemEntity system, string triggerSource, CancellationToken ct) { var systemType = system.Data.SystemType; @@ -38,10 +42,10 @@ public class SyncProcessor( } // 2. 创建并标记 Running - var job = new SyncJob + var job = new SyncJobEntity { ExternalSystemId = system.Id, - Status = SyncJobStatus.Running, + Status = SyncJobStatusEnum.Running, StartedAt = DateTime.UtcNow, Data = new JobData { TriggerSource = triggerSource }, }; @@ -53,11 +57,11 @@ public class SyncProcessor( { var result = await connector.FetchAsync(system, ct); - // 4. 幂等落库 SyncedRecord + // 4. 幂等落库 SyncedRecordEntity await PersistRecordsAsync(system.Id, job.Id, result.Records, ct); - // 5. 更新 SyncJob 为 Succeeded(汇总指标写入 json_data) - job.Status = SyncJobStatus.Succeeded; + // 5. 更新 SyncJobEntity 为 Succeeded(汇总指标写入 json_data) + job.Status = SyncJobStatusEnum.Succeeded; job.FinishedAt = DateTime.UtcNow; job.DurationMs = (long)(job.FinishedAt.Value - job.StartedAt!.Value).TotalMilliseconds; job.RecordCount = result.RecordCount; @@ -69,7 +73,7 @@ public class SyncProcessor( }; await db.SaveChangesAsync(ct); - // 6. 更新 ExternalSystem 的最近同步信息(写入 json_data) + // 6. 更新 ExternalSystemEntity 的最近同步信息(写入 json_data) var sysData = system.Data; sysData.LastSyncedAt = new DateTimeOffset(job.FinishedAt.Value).ToUnixTimeMilliseconds(); sysData.LastSyncJobId = job.Id; @@ -124,7 +128,7 @@ public class SyncProcessor( } else { - db.SyncedRecords.Add(new SyncedRecord + db.SyncedRecords.Add(new SyncedRecordEntity { ExternalSystemId = systemId, SyncJobId = jobId, @@ -171,16 +175,16 @@ public class SyncProcessor( } /// 记录失败任务(job 已存在则更新,否则新建)。 - private async Task RecordFailureAsync( - ExternalSystem system, string triggerSource, string error, SyncJob? job, CancellationToken ct) + private async Task RecordFailureAsync( + ExternalSystemEntity system, string triggerSource, string error, SyncJobEntity? job, CancellationToken ct) { var now = DateTime.UtcNow; if (job is null) { - job = new SyncJob + job = new SyncJobEntity { ExternalSystemId = system.Id, - Status = SyncJobStatus.Failed, + Status = SyncJobStatusEnum.Failed, StartedAt = now, Data = new JobData { TriggerSource = triggerSource }, }; @@ -188,7 +192,7 @@ public class SyncProcessor( } else { - job.Status = SyncJobStatus.Failed; + job.Status = SyncJobStatusEnum.Failed; } job.FinishedAt = now; job.DurationMs = job.StartedAt.HasValue ? (long)(now - job.StartedAt.Value).TotalMilliseconds : 0; diff --git a/src/modules/monitoring/Domain/Enums/AlertSeverity.cs b/src/modules/monitoring/Domain/Enums/AlertSeverityEnum.cs similarity index 94% rename from src/modules/monitoring/Domain/Enums/AlertSeverity.cs rename to src/modules/monitoring/Domain/Enums/AlertSeverityEnum.cs index 3bba5fe..68e4777 100644 --- a/src/modules/monitoring/Domain/Enums/AlertSeverity.cs +++ b/src/modules/monitoring/Domain/Enums/AlertSeverityEnum.cs @@ -3,7 +3,7 @@ namespace Monitoring.Domain.Enums; /// /// 告警严重级别。影响通知渠道与展示排序(Critical 通常触发即时推送,Info 仅记录)。 /// -public enum AlertSeverity +public enum AlertSeverityEnum { /// 信息级:仅记录,不打扰。 Info = 0, diff --git a/src/modules/monitoring/Domain/Enums/ExternalSystemType.cs b/src/modules/monitoring/Domain/Enums/ExternalSystemTypeEnum.cs similarity index 93% rename from src/modules/monitoring/Domain/Enums/ExternalSystemType.cs rename to src/modules/monitoring/Domain/Enums/ExternalSystemTypeEnum.cs index a0f6e8f..be52afd 100644 --- a/src/modules/monitoring/Domain/Enums/ExternalSystemType.cs +++ b/src/modules/monitoring/Domain/Enums/ExternalSystemTypeEnum.cs @@ -6,7 +6,7 @@ namespace Monitoring.Domain.Enums; /// 1) 在此枚举登记; /// 2) 实现 IExternalConnector 并在 DI 注册。 /// -public enum ExternalSystemType +public enum ExternalSystemTypeEnum { /// u号租商家后台(订单/资金报表拉取)。 UHaoZu = 1, diff --git a/src/modules/monitoring/Domain/Enums/SyncJobStatus.cs b/src/modules/monitoring/Domain/Enums/SyncJobStatusEnum.cs similarity index 94% rename from src/modules/monitoring/Domain/Enums/SyncJobStatus.cs rename to src/modules/monitoring/Domain/Enums/SyncJobStatusEnum.cs index 9745241..1fdeaed 100644 --- a/src/modules/monitoring/Domain/Enums/SyncJobStatus.cs +++ b/src/modules/monitoring/Domain/Enums/SyncJobStatusEnum.cs @@ -6,7 +6,7 @@ namespace Monitoring.Domain.Enums; /// ↘ Failed /// 由 SyncProcessor 在执行前后驱动转换,SyncedRecord/SyncJob 据此统计成功率与历史。 /// -public enum SyncJobStatus +public enum SyncJobStatusEnum { /// 已入队待执行。 Pending = 0, diff --git a/src/modules/monitoring/Domain/Services/ConnectorContracts.cs b/src/modules/monitoring/Domain/Services/ConnectorContracts.cs index 41b0f93..8a0c524 100644 --- a/src/modules/monitoring/Domain/Services/ConnectorContracts.cs +++ b/src/modules/monitoring/Domain/Services/ConnectorContracts.cs @@ -1,4 +1,8 @@ -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Enums; namespace Monitoring.Domain.Services; @@ -11,13 +15,13 @@ namespace Monitoring.Domain.Services; public interface IExternalConnector { /// 本连接器处理的系统类型。ConnectorRegistry 据此建立 SystemType → 实现的路由表。 - ExternalSystemType SystemType { get; } + ExternalSystemTypeEnum SystemType { get; } /// /// 执行一次拉取。从 读取 BaseUrl/参数与关联凭证, /// 调用外部接口,返回汇总指标 + 明细记录。失败应抛异常,由 SyncProcessor 统一记录为 Failed。 /// - Task FetchAsync(ExternalSystem system, CancellationToken ct); + Task FetchAsync(ExternalSystemEntity system, CancellationToken ct); } /// @@ -25,7 +29,7 @@ public interface IExternalConnector /// 明细记录放 Records(如各订单的原始 JSON)。 /// /// 本次拉取的明细行数。 -/// 汇总指标键值对(值为数值或字符串,序列化进 SyncJob.SummaryMetricsJson)。 +/// 汇总指标键值对(值为数值或字符串,序列化进 SyncJobEntity.SummaryMetricsJson)。 /// 明细记录列表;若仅拉汇总可为空。 public record FetchResult( int RecordCount, @@ -33,7 +37,7 @@ public record FetchResult( IReadOnlyList Records); /// -/// 一条明细记录数据(由 Connector 产出,SyncProcessor 据此落库 SyncedRecord)。 +/// 一条明细记录数据(由 Connector 产出,SyncProcessor 据此落库 SyncedRecordEntity)。 /// /// 外部业务 Id(订单号/流水号),幂等去重依据。 /// 记录类型("order" / "finance" 等)。 diff --git a/src/modules/monitoring/Domain/Services/IAlertEvaluator.cs b/src/modules/monitoring/Domain/Services/IAlertEvaluator.cs index d149233..a328903 100644 --- a/src/modules/monitoring/Domain/Services/IAlertEvaluator.cs +++ b/src/modules/monitoring/Domain/Services/IAlertEvaluator.cs @@ -1,4 +1,8 @@ -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Domain.Services; @@ -15,7 +19,7 @@ public interface IAlertEvaluator /// 最新一次同步的汇总指标。 /// 该系统下启用的告警规则。 /// 命中的规则列表(调用方负责后续通知与 LastTriggeredAt 更新)。 - IReadOnlyList Evaluate( + IReadOnlyList Evaluate( Dictionary summaryMetrics, - IReadOnlyList rules); + IReadOnlyList rules); } diff --git a/src/modules/monitoring/Domain/Values/CredentialEntry.cs b/src/modules/monitoring/Domain/Values/CredentialEntry.cs index 99b834f..b405e8f 100644 --- a/src/modules/monitoring/Domain/Values/CredentialEntry.cs +++ b/src/modules/monitoring/Domain/Values/CredentialEntry.cs @@ -1,4 +1,4 @@ -namespace Monitoring.Domain.Entities; +namespace Monitoring.Domain.Values; /// 凭证条目(内聚于 SystemData,无独立表)。 public class CredentialEntry diff --git a/src/modules/monitoring/Domain/Values/JobData.cs b/src/modules/monitoring/Domain/Values/JobData.cs index f905670..423511c 100644 --- a/src/modules/monitoring/Domain/Values/JobData.cs +++ b/src/modules/monitoring/Domain/Values/JobData.cs @@ -1,4 +1,4 @@ -namespace Monitoring.Domain.Entities; +namespace Monitoring.Domain.Values; /// 同步任务 json_data 投影。 public class JobData diff --git a/src/modules/monitoring/Domain/Values/RecordData.cs b/src/modules/monitoring/Domain/Values/RecordData.cs index 4d4012a..7f72845 100644 --- a/src/modules/monitoring/Domain/Values/RecordData.cs +++ b/src/modules/monitoring/Domain/Values/RecordData.cs @@ -1,4 +1,4 @@ -namespace Monitoring.Domain.Entities; +namespace Monitoring.Domain.Values; /// 同步记录 json_data 投影:拉取到的外部原始数据。 public class RecordData diff --git a/src/modules/monitoring/Domain/Values/RuleData.cs b/src/modules/monitoring/Domain/Values/RuleData.cs index c324731..adaf3f5 100644 --- a/src/modules/monitoring/Domain/Values/RuleData.cs +++ b/src/modules/monitoring/Domain/Values/RuleData.cs @@ -1,6 +1,6 @@ using Monitoring.Domain.Enums; -namespace Monitoring.Domain.Entities; +namespace Monitoring.Domain.Values; /// 告警规则 json_data 投影。 public class RuleData @@ -18,7 +18,7 @@ public class RuleData public string Threshold { get; set; } = default!; /// 严重级别。 - public AlertSeverity Severity { get; set; } = AlertSeverity.Warning; + public AlertSeverityEnum Severity { get; set; } = AlertSeverityEnum.Warning; /// 是否启用。 public bool IsEnabled { get; set; } = true; diff --git a/src/modules/monitoring/Infrastructure/Alerting/DefaultAlertEvaluator.cs b/src/modules/monitoring/Infrastructure/Alerting/DefaultAlertEvaluator.cs index a85fecb..cc4b7f9 100644 --- a/src/modules/monitoring/Infrastructure/Alerting/DefaultAlertEvaluator.cs +++ b/src/modules/monitoring/Infrastructure/Alerting/DefaultAlertEvaluator.cs @@ -1,5 +1,9 @@ using System.Globalization; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Services; namespace Monitoring.Infrastructure.Alerting; @@ -7,17 +11,17 @@ namespace Monitoring.Infrastructure.Alerting; /// /// 默认告警评估器:对每条规则,从汇总指标取出 MetricName 的值, /// 按 Operator 与 Threshold 比较;命中且度过冷却期则纳入返回列表。 -/// 字段读取自 AlertRule.Data(json_data 强类型视图)。 +/// 字段读取自 AlertRuleEntity.Data(json_data 强类型视图)。 /// 比较失败(指标缺失/非数值)的规则静默跳过,不视为命中也不抛异常。 /// public class DefaultAlertEvaluator : IAlertEvaluator { - public IReadOnlyList Evaluate( + public IReadOnlyList Evaluate( Dictionary summaryMetrics, - IReadOnlyList rules) + IReadOnlyList rules) { var nowMs = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); - var hit = new List(); + var hit = new List(); foreach (var rule in rules) { diff --git a/src/modules/monitoring/Infrastructure/Connectors/ConnectorCredentialResolver.cs b/src/modules/monitoring/Infrastructure/Connectors/ConnectorCredentialResolver.cs index 4eb2721..47a3662 100644 --- a/src/modules/monitoring/Infrastructure/Connectors/ConnectorCredentialResolver.cs +++ b/src/modules/monitoring/Infrastructure/Connectors/ConnectorCredentialResolver.cs @@ -1,13 +1,17 @@ using System.Text.Json; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Connectors; /// -/// Connector 公共辅助:从 ExternalSystem.JsonData 解析凭证与参数,构造带凭证的 HttpClient。 +/// Connector 公共辅助:从 ExternalSystemEntity.JsonData 解析凭证与参数,构造带凭证的 HttpClient。 /// /// 设计取向:把 PG 当 Mongo 用——业务字段全在 jsonb,本类只做 JSON 反序列化 + HttpClient 拼装, -/// 不再访问 DbContext(凭证内聚于 ExternalSystem,无独立表)。 +/// 不再访问 DbContext(凭证内聚于 ExternalSystemEntity,无独立表)。 /// /// HttpClient 命名约定:"Monitoring." + SystemType 名(已在 MonitoringInfrastructureModule 注册工厂)。 /// @@ -16,7 +20,7 @@ public class ConnectorCredentialResolver(IHttpClientFactory httpClientFactory) private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNameCaseInsensitive = true }; /// 创建挂好 BaseUrl + 凭证的 HttpClient。 - public HttpClient CreateClient(ExternalSystem system) + public HttpClient CreateClient(ExternalSystemEntity system) { var clientName = $"Monitoring.{system.Data.SystemType}"; var client = httpClientFactory.CreateClient(clientName); diff --git a/src/modules/monitoring/Infrastructure/Connectors/GenericHttpConnector.cs b/src/modules/monitoring/Infrastructure/Connectors/GenericHttpConnector.cs index b99a2cd..33f9f0a 100644 --- a/src/modules/monitoring/Infrastructure/Connectors/GenericHttpConnector.cs +++ b/src/modules/monitoring/Infrastructure/Connectors/GenericHttpConnector.cs @@ -1,6 +1,10 @@ using System.Net.Http.Json; using System.Text.Json; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Enums; using Monitoring.Domain.Services; @@ -8,7 +12,7 @@ namespace Monitoring.Infrastructure.Connectors; /// /// 通用 HTTP Connector:POST JSON + 配置化解析。 -/// 通过 ExternalSystem.Data.Parameters 配置 path/body/响应字段路径,覆盖未定制对接的简单接口。 +/// 通过 ExternalSystemEntity.Data.Parameters 配置 path/body/响应字段路径,覆盖未定制对接的简单接口。 /// /// 配置示例(Parameters): /// { @@ -19,9 +23,9 @@ namespace Monitoring.Infrastructure.Connectors; /// public class GenericHttpConnector(ConnectorCredentialResolver resolver) : IExternalConnector { - public ExternalSystemType SystemType => ExternalSystemType.GenericHttp; + public ExternalSystemTypeEnum SystemType => ExternalSystemTypeEnum.GenericHttp; - public async Task FetchAsync(ExternalSystem system, CancellationToken ct) + public async Task FetchAsync(ExternalSystemEntity system, CancellationToken ct) { var p = system.Data.Parameters; var path = p.GetValueOrDefault("path") ?? "/"; diff --git a/src/modules/monitoring/Infrastructure/Connectors/UHaoZuConnector.cs b/src/modules/monitoring/Infrastructure/Connectors/UHaoZuConnector.cs index 48b9824..1d48753 100644 --- a/src/modules/monitoring/Infrastructure/Connectors/UHaoZuConnector.cs +++ b/src/modules/monitoring/Infrastructure/Connectors/UHaoZuConnector.cs @@ -2,7 +2,11 @@ using System.Net.Http.Json; using System.Text; using System.Text.Json; using Microsoft.Extensions.Logging; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; using Monitoring.Domain.Enums; using Monitoring.Domain.Services; @@ -16,8 +20,8 @@ namespace Monitoring.Infrastructure.Connectors; /// 1) POST {BaseUrl}/merchants/orderReport/ajax/selectOrderReport → 汇总指标 /// 2) POST {BaseUrl}/merchants/orderReport/ajax/orderReportList → 订单明细(分页全量) /// -/// 凭证:Cookie(JSESSIONID/uid 等)从 ExternalSystem.Data.Credentials 读取(json_data 内聚)。 -/// 参数(ExternalSystem.Data.Parameters):reportPath/lookbackDays/maxPages。 +/// 凭证:Cookie(JSESSIONID/uid 等)从 ExternalSystemEntity.Data.Credentials 读取(json_data 内聚)。 +/// 参数(ExternalSystemEntity.Data.Parameters):reportPath/lookbackDays/maxPages。 /// 金额单位说明:外部接口金额字段单位为"分",本 Connector 统一除以100转"元"后入库。 /// public class UHaoZuConnector(ConnectorCredentialResolver resolver, ILogger logger) @@ -29,9 +33,9 @@ public class UHaoZuConnector(ConnectorCredentialResolver resolver, ILogger ExternalSystemType.UHaoZu; + public ExternalSystemTypeEnum SystemType => ExternalSystemTypeEnum.UHaoZu; - public async Task FetchAsync(ExternalSystem system, CancellationToken ct) + public async Task FetchAsync(ExternalSystemEntity system, CancellationToken ct) { var p = system.Data.Parameters; var reportPath = p.GetValueOrDefault("reportPath") ?? DefaultReportPath; diff --git a/src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginService.cs b/src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginService.cs index 501de40..df9c852 100644 --- a/src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginService.cs +++ b/src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginService.cs @@ -2,7 +2,11 @@ using System.Net; using System.Text; using System.Text.Json; using Microsoft.Extensions.Logging; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Connectors; @@ -30,7 +34,7 @@ public class UHaoZuLoginService(ILogger logger) /// 执行登录,返回提取到的凭证列表(失败抛异常)。 /// public async Task> LoginAsync( - ExternalSystem system, string account, string password, + ExternalSystemEntity system, string account, string password, string ticket, string randstr, CancellationToken ct) { // 用 HttpClientHandler 捕获 Set-Cookie。 diff --git a/src/modules/monitoring/Infrastructure/Persistence/Configurations/AlertRuleConfiguration.cs b/src/modules/monitoring/Infrastructure/Persistence/Configurations/AlertRuleConfiguration.cs index 60bfa1b..2789d28 100644 --- a/src/modules/monitoring/Infrastructure/Persistence/Configurations/AlertRuleConfiguration.cs +++ b/src/modules/monitoring/Infrastructure/Persistence/Configurations/AlertRuleConfiguration.cs @@ -1,13 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Persistence.Configurations; /// 告警规则表映射(id + 外键索引列 + json_data + 审计)。 -public class AlertRuleConfiguration : IEntityTypeConfiguration +public class AlertRuleConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { builder.ToTable("b_alert_rules"); builder.HasKey(e => e.Id); diff --git a/src/modules/monitoring/Infrastructure/Persistence/Configurations/ExternalSystemConfiguration.cs b/src/modules/monitoring/Infrastructure/Persistence/Configurations/ExternalSystemConfiguration.cs index 7f915b0..e80eb97 100644 --- a/src/modules/monitoring/Infrastructure/Persistence/Configurations/ExternalSystemConfiguration.cs +++ b/src/modules/monitoring/Infrastructure/Persistence/Configurations/ExternalSystemConfiguration.cs @@ -1,13 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Persistence.Configurations; /// 外部系统配置表映射(极简文档模式:id + json_data + 审计)。 -public class ExternalSystemConfiguration : IEntityTypeConfiguration +public class ExternalSystemConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { builder.ToTable("b_external_systems"); builder.HasKey(e => e.Id); diff --git a/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncJobConfiguration.cs b/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncJobConfiguration.cs index 9d27979..54f8f0e 100644 --- a/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncJobConfiguration.cs +++ b/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncJobConfiguration.cs @@ -1,13 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Persistence.Configurations; /// 同步任务记录表映射(id + 外键索引列 + json_data + 审计)。 -public class SyncJobConfiguration : IEntityTypeConfiguration +public class SyncJobConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { builder.ToTable("b_sync_jobs"); builder.HasKey(e => e.Id); diff --git a/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncedRecordConfiguration.cs b/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncedRecordConfiguration.cs index 9431c47..a2d26d5 100644 --- a/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncedRecordConfiguration.cs +++ b/src/modules/monitoring/Infrastructure/Persistence/Configurations/SyncedRecordConfiguration.cs @@ -1,13 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Persistence.Configurations; /// 同步记录表映射(id + 去重/分类/时间索引列 + json_data + 审计)。 -public class SyncedRecordConfiguration : IEntityTypeConfiguration +public class SyncedRecordConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { builder.ToTable("b_synced_records"); builder.HasKey(e => e.Id); diff --git a/src/modules/monitoring/Infrastructure/Persistence/MonitoringDbContext.cs b/src/modules/monitoring/Infrastructure/Persistence/MonitoringDbContext.cs index 5545d28..1cd04d4 100644 --- a/src/modules/monitoring/Infrastructure/Persistence/MonitoringDbContext.cs +++ b/src/modules/monitoring/Infrastructure/Persistence/MonitoringDbContext.cs @@ -1,6 +1,10 @@ using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; -using Monitoring.Domain.Entities; +using Monitoring.Domain.Entities.AlertRule; +using Monitoring.Domain.Entities.ExternalSystem; +using Monitoring.Domain.Entities.SyncJob; +using Monitoring.Domain.Entities.SyncedRecord; +using Monitoring.Domain.Values; namespace Monitoring.Infrastructure.Persistence; @@ -13,10 +17,10 @@ public class MonitoringDbContext : DbContext { public MonitoringDbContext(DbContextOptions options) : base(options) { } - public DbSet ExternalSystems => Set(); - public DbSet SyncJobs => Set(); - public DbSet SyncedRecords => Set(); - public DbSet AlertRules => Set(); + public DbSet ExternalSystems => Set(); + public DbSet SyncJobs => Set(); + public DbSet SyncedRecords => Set(); + public DbSet AlertRules => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { diff --git a/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeConverter.cs b/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeConverter.cs index 8dcb49c..0614a3e 100644 --- a/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeConverter.cs +++ b/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeConverter.cs @@ -11,18 +11,14 @@ public sealed class TimestampDateTimeConverter : JsonConverter { public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - // 兼容数字(毫秒时间戳)与字符串(ISO 8601,向后兼容旧客户端) - if (reader.TokenType == JsonTokenType.Number) + return reader.TokenType switch { - return DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64()).UtcDateTime; - } - - if (reader.TokenType == JsonTokenType.String) - { - return DateTime.Parse(reader.GetString()!, null, System.Globalization.DateTimeStyles.RoundtripKind); - } - - throw new JsonException("Expected a number (ms timestamp) or string (ISO date) for DateTime field."); + // 兼容数字(毫秒时间戳)与字符串(ISO 8601,向后兼容旧客户端) + JsonTokenType.Number => DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64()).UtcDateTime, + JsonTokenType.String => DateTime.Parse(reader.GetString()!, null, + System.Globalization.DateTimeStyles.RoundtripKind), + _ => throw new JsonException("Expected a number (ms timestamp) or string (ISO date) for DateTime field.") + }; } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) diff --git a/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeOffsetConverter.cs b/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeOffsetConverter.cs index dc8e238..765a716 100644 --- a/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeOffsetConverter.cs +++ b/src/shared/BuildFlow.Shared/Infrastructure/Serialization/TimestampDateTimeOffsetConverter.cs @@ -11,17 +11,13 @@ public sealed class TimestampDateTimeOffsetConverter : JsonConverter DateTimeOffset.FromUnixTimeMilliseconds(reader.GetInt64()), + JsonTokenType.String => DateTimeOffset.Parse(reader.GetString()!), + _ => throw new JsonException( + "Expected a number (ms timestamp) or string (ISO date) for DateTimeOffset field.") + }; } public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)