# PetWashControl 项目结构说明
## 文件夹组织
```
PetWashControl/
├── Converters/ # 值转换器
│ └── BoolToStatusConverter.cs
├── Models/ # 数据模型
│ ├── Order.cs
│ └── Package.cs
├── Services/ # 业务服务层
│ ├── ApiService.cs # API通信服务
│ ├── MqttClientService.cs # MQTT客户端服务
│ ├── ConfigurationService.cs # 配置管理
│ └── LogService.cs # 日志服务
├── ViewModels/ # 视图模型(MVVM)
│ └── MainViewModel.cs
├── Views/ # 视图(XAML界面)
│ ├── MainWindow.xaml
│ └── MainWindow.xaml.cs
├── Resources/ # 资源文件
│ └── Styles.xaml # 样式定义
├── App.xaml # 应用程序入口
├── App.xaml.cs
└── AssemblyInfo.cs
```
## 架构模式
### MVVM (Model-View-ViewModel)
- **Model**: 数据模型,定义业务实体(Package, Order)
- **View**: XAML界面,负责UI展示
- **ViewModel**: 视图模型,处理业务逻辑和数据绑定
### 依赖注入
使用构造函数注入服务依赖:
- ConfigurationService: 配置管理
- ApiService: HTTP API通信
- MqttClientService: MQTT消息通信
- LogService: 日志记录
## 核心组件
### 1. Services(服务层)
#### ApiService
- 负责与后端API通信
- 提供套餐查询、订单管理等接口
- 统一异常处理
#### MqttClientService
- MQTT客户端封装
- 订阅设备状态和命令主题
- 自动重连机制
#### ConfigurationService
- 集中管理配置参数
- API地址、MQTT连接信息等
#### LogService
- 日志记录到文件和调试窗口
- 按日期分割日志文件
### 2. ViewModels(视图模型)
#### MainViewModel
- 使用 CommunityToolkit.Mvvm 实现MVVM
- ObservableProperty: 自动属性通知
- RelayCommand: 命令绑定
- 业务流程控制
### 3. Converters(值转换器)
#### BoolToStatusConverter
- 将布尔值转换为状态文本
- 用于UI显示
### 4. Resources(资源)
#### Styles.xaml
- 统一的UI样式定义
- 颜色主题
- 按钮、文本等控件样式
## NuGet 依赖包
```xml
```
### 包说明
- **CommunityToolkit.Mvvm**: MVVM框架,提供ObservableObject、RelayCommand等
- **MQTTnet**: MQTT客户端库(4.3.7版本)
- **Microsoft.Extensions.Hosting**: 依赖注入和托管服务
- **System.Net.Http.Json**: HTTP JSON扩展方法
- **System.Text.Json**: JSON序列化
### 版本兼容性说明
#### MQTTnet 4.3.7 重要变更
1. **ConnectAsync**: 需要传入 `CancellationToken` 参数
```csharp
await _mqttClient.ConnectAsync(_options, CancellationToken.None);
```
2. **SubscribeAsync**: 使用 Builder 模式
```csharp
var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
.WithTopicFilter("device/status")
.WithTopicFilter("device/command")
.Build();
await _mqttClient.SubscribeAsync(subscribeOptions, CancellationToken.None);
```
3. **PublishAsync**: 需要传入 `CancellationToken` 参数
```csharp
await _mqttClient.PublishAsync(message, CancellationToken.None);
```
4. **Payload 属性**: `PayloadSegment` 返回 `ArraySegment`
```csharp
var payloadBytes = args.ApplicationMessage.PayloadSegment.ToArray();
var payload = Encoding.UTF8.GetString(payloadBytes);
```
## 数据流
1. **初始化**: MainViewModel.InitializeAsync()
- 连接MQTT Broker
- 加载套餐列表
2. **创建订单**: CreateOrderCommand
- 调用API创建订单
- 更新UI状态
3. **支付**: SimulatePaymentCommand
- 确认支付
- 接收MQTT开门指令
4. **关门**: CloseDoorCommand
- 发送MQTT关门状态
- 更新订单状态
- 接收开始清洗指令
5. **完成**: 自动流程
- 模拟清洗时间
- 发送完成状态
- 更新订单
## 配置说明
### ConfigurationService 默认配置
```csharp
ApiBaseUrl = "https://localhost:7001/"
MqttBrokerHost = "localhost"
MqttBrokerPort = 1883
MqttClientId = "PetWashControl"
WashSimulationSeconds = 10
```
## 日志
日志文件位置: `{应用目录}/Logs/log_yyyyMMdd.txt`
日志级别:
- INFO: 一般信息
- WARN: 警告
- ERROR: 错误(包含异常堆栈)
## 开发建议
1. 新增功能时遵循MVVM模式
2. 服务层保持单一职责
3. 使用依赖注入管理服务
4. 异常处理要友好提示用户
5. 重要操作记录日志
6. UI样式统一使用资源字典
## 扩展点
- 添加新视图: Views文件夹
- 添加新服务: Services文件夹
- 自定义样式: Resources/Styles.xaml
- 配置参数: ConfigurationService