findings.md 3.5 KB

发现与决策

需求

  • 集成三个库: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 线程交互)

遇到的问题

问题 解决方案

资源


每执行2次查看/浏览器/搜索操作后更新此文件 防止视觉信息丢失