CLAUDE.md 5.1 KB

CLAUDE.md

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.jsonRunMode 配置)

模式 行为
Direct 直连 PLC(默认)
Server 连 PLC + 启动 WebSocket 服务端(HubServer,端口 8765)
Client 连接 WebSocket 服务端接收数据,不直连 PLC
Mock 无 PLC 时使用 MockPlcService 生成模拟数据

服务层(YZWater.Core/Services)

  • 单例服务(需 ResetInstance() 后重建,用于登出/重登录):PlcPollingServiceAlarmService
  • 静态服务PlcService(HslCommunication 西门子 S7)、ConfigService(JSON 配置)、DatabaseService(SqlSugar + SQLite)、AuthServiceMockPlcService
  • HubServer / HubClient:WebSocket 中控通信,支持操作锁、远程命令(start_pump/stop_pump
  • PlcConfig:所有 PLC 地址映射集中管理,支持配置文件覆盖

启动流程(App.axaml.cs)

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() 方法直接读取。

自定义工业控件(YZWater.Avalonia/Controls)

全部继承 Control 并重写 Render(DrawingContext),使用 AffectsRender<> 声明触发重绘的属性:

  • WaterTankControl - 水箱液位
  • PumpControl - 泵(带旋转动画,OnAttachedToVisualTree 启动 DispatcherTimer)
  • FanControl - 风扇(同上)
  • PipeLineControl - 管道(虚线流动动画)
  • ValveControl - 阀门(三态)
  • GaugeControl - 仪表
  • StatusCard - 状态卡片

MVVM 约定

  • ViewModel 继承 ObservableObject,使用 [ObservableProperty][RelayCommand](CommunityToolkit.Mvvm 源生成器)
  • View 和 ViewModel 在 App.axaml.csMainViewModel 中通过 DataContext 绑定
  • MainViewModel 持有所有子 ViewModel 实例,通过 CurrentView 属性切换 Tab

数据库

  • ORM:SqlSugar(不是 README 中提到的 FreeSql,已迁移)
  • 文件:yzwater.db(SQLite)
  • 初始化:DatabaseService.Initialize() 中逐个建表,单表失败不影响其他表
  • 表:users, alarm_records, flow_records, analog_records, audit_logs, persons, equipment_statuses

认证

AuthService 管理登录状态,支持 4 种角色(Viewer / Operator / Engineer / Admin)。首次启动自动创建默认 admin 账户(admin/admin123)。登出时通过 UserLoggedOut 事件触发 StopServices() 并重新显示登录窗口。

自适应布局

AdaptiveContainer 控件实现等比缩放,设计基准 1280×800,缩放范围 0.6x–1.5x。

配置文件

yzwater-config.json(根目录,被 .gitignore 排除):

  • PLC 连接:PlcIp, PlcPort, AutoConnect
  • 报警阈值:LevelHighAlarm, LevelLowAlarm, FlowHighAlarm, FlowLowAlarm
  • 中控:RunMode, HubPort, HubServerUrl, HubToken
  • 主题/语言:IsDarkTheme, IsChinese
  • PLC 地址覆盖:PlcAddresses(Dictionary,key 为 PlcConfig 中的标签名)
  • 日志

    Serilog 输出到 Logs/log-{date}.txt(按天滚动)和控制台。崩溃日志写入根目录 crash.log