基于对 AutoFMA(自动光学量测机上位机)项目的分析,提取可借鉴的架构设计和实现模式,应用到 YZWater3(污水处理厂监控系统)中,提升系统的健壮性、可维护性和性能。
| 序号 | 功能 | 来源 | 优先级 | 状态 |
|---|---|---|---|---|
| 1 | 数据库在线备份增强 | DatabaseBackupService | P0 | ✅ |
| 2 | 数据保留清理服务 | DataRetentionService | P0 | ✅ |
| 3 | 配置服务热加载 | ConfigService | P1 | ✅ |
| 4 | 审计日志 Channel 异步写入 | AuditService | P1 | ✅ |
| 5 | 日志缓冲服务 | LogBufferService | P2 | ✅ |
当前实现: BackupService.cs - 简单的 VACUUM INTO 备份
借鉴来源: AutoFMA.Core/Services/DatabaseBackupService.cs
改进内容:
Interlocked.CompareExchange 防重入实施文件:
src/YZWater.Core/Services/BackupService.cs - 增强现有实现当前实现: 无
借鉴来源: AutoFMA.Core/Services/DataRetentionService.cs
新增内容:
Interlocked 防重入清理范围:
alarm_records - 报警记录(默认 90 天)flow_records - 流量记录(默认 360 天)analog_records - 模拟量记录(默认 360 天)audit_logs - 审计日志(默认 365 天)实施文件:
src/YZWater.Core/Services/DataRetentionService.cs - 新增src/YZWater.Core/Models/SystemConfig.cs - 新增保留天数配置当前实现: ConfigService.cs - 手动加载/保存
借鉴来源: AutoFMA.Core/Services/ConfigService.cs
改进内容:
FileSystemWatcher 监听配置文件变更_isSaving 标记避免自己触发的变更SemaphoreSlim 读写互斥ConfigChanged 事件通知实施文件:
src/YZWater.Core/Services/ConfigService.cs - 增强现有实现当前实现: AuditService.cs - 直接写入数据库
借鉴来源: AutoFMA.Core/Services/AuditService.cs
改进内容:
Channel<AuditLog> 有界队列(防密集写入时线程池打满)_writerTask.Wait(5s))FullMode = DropOldest 防止队列满时阻塞实施文件:
src/YZWater.Core/Services/AuditService.cs - 重构为实例类当前实现: 无(各 ViewModel 各自订阅日志)
借鉴来源: AutoFMA.Core/Services/LogBufferService.cs
新增内容:
LogService,维护单一缓冲区TrimThreshold)再裁剪,减少 O(N) 移动频率LogAdded 事件通知实施文件:
src/YZWater.Core/Services/LogBufferService.cs - 新增Phase 1 (P0 - 数据安全) ✅ 已完成
├── 1.1 增强 BackupService ✅
└── 1.2 新增 DataRetentionService ✅
Phase 2 (P1 - 架构升级) ✅ 已完成
├── 2.1 增强 ConfigService ✅
└── 2.2 重构 AuditService ✅
Phase 3 (P2 - 性能优化) ✅ 已完成
└── 3.1 新增 LogBufferService ✅
2026-09-06
在 SystemConfig 中新增以下配置:
// 数据保留配置
public DataRetentionConfig DataRetention { get; set; } = new();
public class DataRetentionConfig
{
/// <summary>报警记录保留天数(默认 90 天)</summary>
public int AlarmRecordRetentionDays { get; set; } = 90;
/// <summary>流量记录保留天数(默认 360 天)</summary>
public int FlowRecordRetentionDays { get; set; } = 360;
/// <summary>模拟量记录保留天数(默认 360 天)</summary>
public int AnalogRecordRetentionDays { get; set; } = 360;
/// <summary>审计日志保留天数(默认 365 天)</summary>
public int AuditLogRetentionDays { get; set; } = 365;
}
// 备份配置
public BackupConfig Backup { get; set; } = new();
public class BackupConfig
{
/// <summary>是否启用定时备份</summary>
public bool EnableScheduledBackup { get; set; } = true;
/// <summary>定时备份间隔(小时,默认 24 小时)</summary>
public int BackupIntervalHours { get; set; } = 24;
/// <summary>保留备份数量(默认 7 个)</summary>
public int KeepBackupCount { get; set; } = 7;
}
每个功能实施后需验证:
BackupService 增强
DataRetentionService
ConfigService 热加载
ConfigChanged 事件正常触发AuditService Channel 写入
LogBufferService
LogAdded 事件正常触发E:\设备\自动光学量测机\AutoFMAE:\Source\YZWater3