# 发现与决策 ## 需求 - 集成三个库:Stateless(状态机)、Elsa Workflows(工作流)、Quartz.NET(定时任务) - 目标:完善项目架构,提升设备状态管理、工艺流程编排、任务调度能力 - 完成后编译提交,问题归档到 docs/ ## 研究发现 ### 项目现状 - **框架**:.NET 8 + Avalonia UI 12 + CommunityToolkit.Mvvm - **状态机库**:❌ 未安装 - **任务编排库**:❌ 未安装 - **自定义状态机**:❌ 无(仅有枚举 + 三元表达式描述设备状态) - **任务调度方式**:手写 `while` + `Task.Delay` 轮询循环,`System.Timers.Timer` 做 UI 定时 ### 现有设备状态 - `DeviceStatus` 枚举:`Stopped / Running / Fault / Maintenance` - `ValveStatus` 枚举:`Open / Closed / Middle` - `MainViewModel` 中用三元表达式映射状态到 UI 文本/颜色 - 位置:`Models/EquipmentStatus.cs` ### 现有任务调度 | 组件 | 方式 | 文件位置 | |---|---|---| | `PlcPollingService` | `Task.Run` + `while(!ct)` + `Task.Delay(PollingIntervalMs)` | `Services/PlcPollingService.cs` | | `DataLoggingService` | `while(!ct)` + `Task.Delay(1000)` + 计数器 | `Services/DataLoggingService.cs` | | `MainViewModel` | `System.Timers.Timer(1000)` | `ViewModels/MainViewModel.cs` | ### 启动流程(App.axaml.cs) ``` OnFrameworkInitializationCompleted() → DatabaseService.Initialize() → ShowLoginWindow() → [登录成功] → StartServices() → ShowMainWindow() StartServices() → 根据 RunMode 选择: - Direct: StartPlcServices() - Server: StartPlcServices() + HubServer - Client: HubClient + DataLoggingService StartPlcServices(): - Mock模式: MockPlcService.Enable() - 真实模式: PlcService.Initialize() - PlcPollingService.Instance.Start() - AlarmService.Instance.Start() - DataLoggingService.Start() ``` ### 集成点分析 #### 1. Stateless 状态机 - **目标**:为泵、阀门、报警创建设备状态机 - **替换**:`DeviceStatus` 枚举的三元表达式映射 - **新增**:状态转换规则(如 Stopped → Running、Running → Fault) - **位置**:创建 `Services/DeviceStateMachine.cs` #### 2. Quartz.NET 定时任务 - **目标**:替代手写的 `while+Task.Delay` 轮询 - **替换**: - `PlcPollingService.PollingLoopAsync()` → `PlcPollingJob` - `DataLoggingService.LoggingLoopAsync()` → `DataLoggingJob` - `MainViewModel._clockTimer` → 保持原样(UI 时钟不适合 Quartz) - **位置**:创建 `Services/QuartzSchedulerService.cs` 和 Jobs 目录 #### 3. Elsa Workflows 工作流 - **目标**:支持工艺流程编排(如污水处理流程) - **新增**:配置 Elsa 服务,创建示例工作流 - **位置**:创建 `Services/WorkflowService.cs` 和 `Workflows/` 目录 ## 技术决策 | 决策 | 理由 | |------|------| | Stateless 用于设备状态建模 | 轻量零依赖,Fluent API 适合工业设备 | | Quartz.NET 用于定时任务 | 成熟稳定,支持 cron 表达式,替代手写轮询 | | Elsa Workflows 用于流程编排 | .NET 生态最活跃的工作流引擎,支持可视化 | | MainViewModel 的 UI 时钟保留 System.Timers.Timer | UI 定时器不适合用 Quartz(需要与 UI 线程交互) | ## 遇到的问题 | 问题 | 解决方案 | |------|---------| | | | ## 资源 - Stateless: https://github.com/dotnet-state-machine/stateless - Elsa Workflows: https://www.elsa-workflows.io/ - Quartz.NET: https://www.quartz-scheduler.net/ --- *每执行2次查看/浏览器/搜索操作后更新此文件* *防止视觉信息丢失*