This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
YZWater3 是扬州旭轩科技有限公司开发的跨平台污水处理厂监控系统,基于 Avalonia UI 12 + .NET 8,支持 Windows/Linux/macOS。
# 还原依赖
dotnet restore
# 构建
dotnet build
# 运行(默认从 src/YZWater.Avalonia 启动)
dotnet run --project src/YZWater.Avalonia
# 发布单文件(Windows)
dotnet publish src/YZWater.Avalonia -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
两个项目,Avalonia 依赖 Core:
YZWater3.sln
src/
├── YZWater.Core/ # 核心业务逻辑(UI 无关)
│ ├── Models/ # 数据模型(SqlSugar ORM)
│ ├── Services/ # 所有业务服务(单例模式为主)
│ ├── ViewModels/ # CommunityToolkit.Mvvm ViewModel
│ └── Utils/ # WinSize、ResolutionManager
│
└── YZWater.Avalonia/ # UI 层
├── Views/ # AXAML 视图(ViewA~ViewF + Login + Main)
├── Controls/ # 自定义工业控件 + ThemeHelper
├── Themes/ # IndustrialTheme / IndustrialThemeLight / IndustrialStyles
├── Converters/
└── Services/
yzwater-config.json → RunMode 配置)| 模式 | 行为 |
|---|---|
Direct |
直连 PLC(默认) |
Server |
连 PLC + 启动 WebSocket 服务端(HubServer,端口 8765) |
Client |
连接 WebSocket 服务端接收数据,不直连 PLC |
Mock |
无 PLC 时使用 MockPlcService 生成模拟数据 |
ResetInstance() 后重建,用于登出/重登录):PlcPollingService、AlarmServicePlcService(HslCommunication 西门子 S7)、ConfigService(JSON 配置)、DatabaseService(SqlSugar + SQLite)、AuthService、MockPlcServicestart_pump/stop_pump)LogService.Initialize() → DatabaseService.Initialize() → 加载主题/语言/PLC配置
→ ShowLoginWindow → [登录成功] → StartServices() → ShowMainWindow()
StartServices() 根据 RunMode 选择 Direct/Server/Client,均会调用 StartPlcServices() 启动 PlcPolling + Alarm + DataLogging。
双主题通过 ResourceInclude 切换 Application.Resources.MergedDictionaries:
Themes/IndustrialTheme.axaml(深色)Themes/IndustrialThemeLight.axaml(浅色)自定义控件不用 DynamicResource,而是订阅 ThemeHelper.ThemeChanged 事件后调用 InvalidateVisual() 重绘。ThemeHelper 内部用静态 IBrush 属性缓存当前主题颜色,供 Render() 方法直接读取。
全部继承 Control 并重写 Render(DrawingContext),使用 AffectsRender<> 声明触发重绘的属性:
WaterTankControl - 水箱液位PumpControl - 泵(带旋转动画,OnAttachedToVisualTree 启动 DispatcherTimer)FanControl - 风扇(同上)PipeLineControl - 管道(虚线流动动画)ValveControl - 阀门(三态)GaugeControl - 仪表StatusCard - 状态卡片ObservableObject,使用 [ObservableProperty] 和 [RelayCommand](CommunityToolkit.Mvvm 源生成器)App.axaml.cs 或 MainViewModel 中通过 DataContext 绑定MainViewModel 持有所有子 ViewModel 实例,通过 CurrentView 属性切换 Tabyzwater.db(SQLite)DatabaseService.Initialize() 中逐个建表,单表失败不影响其他表users, alarm_records, flow_records, analog_records, audit_logs, persons, equipment_statusesAuthService 管理登录状态,支持 4 种角色(Viewer / Operator / Engineer / Admin)。首次启动自动创建默认 admin 账户(admin/admin123)。登出时通过 UserLoggedOut 事件触发 StopServices() 并重新显示登录窗口。
AdaptiveContainer 控件实现等比缩放,设计基准 1280×800,缩放范围 0.6x–1.5x。
yzwater-config.json(根目录,被 .gitignore 排除):
PlcIp, PlcPort, AutoConnectLevelHighAlarm, LevelLowAlarm, FlowHighAlarm, FlowLowAlarmRunMode, HubPort, HubServerUrl, HubTokenIsDarkTheme, IsChinesePlcAddresses(Dictionary,key 为 PlcConfig 中的标签名)
Serilog 输出到 Logs/log-{date}.txt(按天滚动)和控制台。崩溃日志写入根目录 crash.log。