diff --git a/软件设计文档/00-项目总体设计.md b/软件设计文档/00-项目总体设计.md
new file mode 100644
index 0000000..07dddc7
--- /dev/null
+++ b/软件设计文档/00-项目总体设计.md
@@ -0,0 +1,103 @@
+# 软件开发文档 - 设备管理系统 (DMS)
+
+## 1. 引言
+
+### 1.1. 项目概述
+
+本文档旨在详细阐述设备管理系统(DMS)的设计与实现方案。该系统是一个用于管理、监控和数据采集的综合平台,核心功能包括:
+
+* **多协议设备支持**:能够管理和监控多种通信协议(如 Siemens S7、OPC UA、Modbus)的设备。
+* **层级化设备模型**:支持“设备 -> 变量表 -> 变量”的层级结构化管理。
+* **灵活的数据转发**:变量数据在采集后,可配置转发至一个或多个MQTT服务器。
+* **实时数据处理**:通过链式处理器对采集到的原始数据进行清洗、计算和转换。
+* **历史数据存储**:将处理后的数据存入数据库,用于历史追溯和分析。
+* **现代化的用户界面**:基于WPF框架,提供直观、响应迅速的操作界面。
+
+### 1.2. 设计原则
+
+* **分层架构 (Layered Architecture)**:采用经典的洋葱架构思想,将项目分为`核心(Core)`、`应用(Application)`、`基础设施(Infrastructure)`和`表现(Presentation)`四层,实现高内聚、低耦合。
+* **依赖倒置原则 (DIP)**:高层模块不依赖于低层模块的具体实现,而是依赖于抽象(接口)。接口定义在核心层,具体实现在基础设施层。
+* **单一职责原则 (SRP)**:每个类和模块都只负责一项功能。
+* **可扩展性**:系统设计应易于扩展,例如,未来可以方便地增加新的通信协议或数据处理器。
+
+## 2. 项目结构设计
+
+系统将由以下四个主要项目组成,以实现关注点分离。
+
+### 2.1. `DMS.Core` - 核心层
+
+这是整个系统的核心,不依赖于任何外部框架或技术。
+
+* **职责**:
+ * 定义核心的业务领域模型(Domain Models),如 `Device`, `VariableTable`, `Variable`, `MqttServer`。
+ * 定义业务规则和逻辑。
+ * 定义仓储库(Repositories)和领域服务的接口,如 `IDeviceRepository`, `IVariableRepository`。
+* **包含内容**:
+ * `Models/`: 存放领域模型类。
+ * `Enums/`: 存放核心业务相关的枚举。
+ * `Interfaces/`: 存放仓储库和领域服务的接口定义。
+ * `Exceptions/`: 存放自定义的业务异常。
+
+### 2.2. `DMS.Application` - 应用层
+
+负责编排和协调领域对象以完成具体的业务用例。
+
+* **职责**:
+ * 实现具体的应用服务(Use Cases),如“添加新设备”、“更新变量值”。
+ * 定义数据传输对象(DTOs),用于在表现层和应用层之间传递数据。
+ * 处理事务和授权等应用级关注点。
+* **包含内容**:
+ * `Services/`: 存放应用服务的实现。
+ * `DTOs/`: 存放数据传输对象。
+ * `Interfaces/`: 存放应用服务的接口。
+
+### 2.3. `DMS.Infrastructure` - 基础设施层
+
+提供所有与外部世界交互的技术实现。
+
+* **职责**:
+ * 实现 `DMS.Core` 中定义的仓储接口,负责与数据库进行交互(使用 `SqlSugar` ORM)。
+ * 实现与其他外部系统的集成,如S7协议通信、MQTT客户端、日志记录(NLog)等。
+ * 管理数据库连接、迁移和配置。
+* **包含内容**:
+ * `Data/`: 包含 `DbContext` 和数据库初始化逻辑。
+ * `Repositories/`: 仓储接口的具体实现。
+ * `Services/`: 存放与基础设施相关的服务实现(如S7通信服务、MQTT发布服务)。
+ * `Entities/`: 数据库表对应的实体类。
+
+### 2.4. `DMS.WPF` - 表现层
+
+用户界面(UI),负责与用户交互和数据显示。
+
+* **职责**:
+ * 提供用户操作界面。
+ * 显示来自应用层的数据。
+ * 将用户的操作请求发送给应用层。
+* **包含内容**:
+ * `Views/`: XAML窗口和用户控件。
+ * `ViewModels/`: 视图模型(MVVM模式)。
+ * `Services/`: UI相关的服务,如导航、对话框和通知服务。
+ * `App.xaml.cs`: 程序启动和依赖注入(DI)容器的配置。
+
+### 2.5. 项目依赖关系图
+
+```mermaid
+graph TD
+ subgraph 表现层
+ DMS.WPF
+ end
+ subgraph 应用层
+ DMS.Application
+ end
+ subgraph 核心层
+ DMS.Core
+ end
+ subgraph 基础设施层
+ DMS.Infrastructure
+ end
+
+ DMS.WPF --> DMS.Application
+ DMS.Application --> DMS.Core
+ DMS.Infrastructure --> DMS.Application
+ DMS.Infrastructure --> DMS.Core
+```
diff --git a/软件设计文档/00-项目总体设计与依赖.md b/软件设计文档/00-项目总体设计与依赖.md
new file mode 100644
index 0000000..2e1d435
--- /dev/null
+++ b/软件设计文档/00-项目总体设计与依赖.md
@@ -0,0 +1,74 @@
+# 软件开发文档 - 00. 项目总体设计与依赖
+
+本文档是整个项目的顶层设计,定义了项目结构、职责划分以及每个项目所需的NuGet包依赖。
+
+## 1. 项目结构与职责 (修订版)
+
+| 项目名 | 核心职责 | 关键内容 |
+| ---------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
+| `DMS.Core` | **领域核心**:定义业务规则和数据结构,不依赖任何具体技术实现。是整个系统的稳定内核。 | 领域模型 (`Device`, `Variable`)、业务枚举、仓储接口 (`IDeviceRepository`)、自定义业务异常。 |
+| `DMS.Application` | **应用服务**:编排领域模型完成业务用例(Use Case),处理事务、DTO转换。是UI层与核心层的桥梁。 | 应用服务 (`DeviceAppService`)、数据传输对象 (DTOs)、应用层接口、AutoMapper配置。 |
+| `DMS.Infrastructure` | **基础设施**:提供所有外部技术的具体实现,如数据库访问、协议通信、日志记录等。负责实现核心层的接口。 | 数据库实体、SqlSugar仓储实现、S7/MQTT通信服务、NLog日志服务、数据处理链的具体处理器。 |
+| `DMS.WPF` | **表现层**:提供用户界面(UI),采用MVVM模式。负责用户交互、数据显示和请求派发。 | 视图 (Views)、视图模型 (ViewModels)、UI服务(导航、对话框)、依赖注入容器配置、程序入口。 |
+
+## 2. NuGet包依赖清单
+
+以下是每个项目必须安装的NuGet包,请严格按照此清单进行安装。
+
+### 2.1. `DMS.Core`
+
+此项目应保持纯净,**不安装任何第三方NuGet包**,以确保其独立性。
+
+### 2.2. `DMS.Application`
+
+| 包名 | 用途 |
+| ----------------------------------- | -------------------------------------------------------------------- |
+| `AutoMapper` | 用于在领域模型和DTO之间进行自动对象映射。 |
+| `AutoMapper.Extensions.Microsoft.DependencyInjection` | 将AutoMapper与依赖注入容器集成。 |
+
+### 2.3. `DMS.Infrastructure`
+
+| 包名 | 用途 |
+| ----------------------------------- | -------------------------------------------------------------------- |
+| `SqlSugarCore` | 强大的ORM框架,用于数据库操作。 |
+| `S7netplus` | 用于与Siemens S7系列PLC进行通信。 |
+| `MQTTnet` | 高性能的.NET MQTT客户端库,用于数据发布。 |
+| `MQTTnet.Extensions.ManagedClient` | 提供了更稳定的托管MQTT客户端,支持自动重连。 |
+| `NLog` | 灵活的日志记录框架。 |
+| `NLog.Extensions.Logging` | 将NLog与Microsoft的通用日志抽象集成。 |
+| `Microsoft.Extensions.Caching.Memory` | 提供内存缓存功能,用于实现变量值变化检测。 |
+
+### 2.4. `DMS.WPF`
+
+| 包名 | 用途 |
+| ----------------------------------------- | -------------------------------------------------------------------- |
+| `Microsoft.Extensions.DependencyInjection` | 官方依赖注入框架,用于管理整个应用的生命周期和依赖关系。 |
+| `CommunityToolkit.Mvvm` | 官方MVVM工具包,提供`ObservableObject`, `RelayCommand`等,极大简化MVVM开发。 |
+| `HandyControls` | 一套美观且功能强大的WPF UI控件库,用于构建现代化界面(如对话框、通知)。 |
+| `NLog.Extensions.Logging` | 用于在WPF项目中配置和使用NLog。 |
+| `Microsoft.Xaml.Behaviors.Wpf` | 提供事件到命令的绑定等行为支持,是MVVM的有力补充。 |
+
+## 3. 开发环境初始化命令示例
+
+您可以使用 `dotnet` CLI 快速创建项目并添加包:
+
+```bash
+# 创建解决方案和项目
+dotnet new sln -n DMS
+dotnet new classlib -n DMS.Core
+dotnet new classlib -n DMS.Application
+dotnet new classlib -n DMS.Infrastructure
+dotnet new wpf -n DMS.WPF
+
+# 将项目添加到解决方案
+dotnet sln add ./**/*.csproj
+
+# 为DMS.Application添加包
+dotnet add DMS.Application package AutoMapper
+# ...其他包
+
+# 添加项目引用
+dotnet add DMS.Application reference DMS.Core
+dotnet add DMS.Infrastructure reference DMS.Application
+dotnet add DMS.WPF reference DMS.Infrastructure
+```
diff --git a/软件设计文档/01-DMS.Core-详细设计.md b/软件设计文档/01-DMS.Core-详细设计.md
new file mode 100644
index 0000000..b718538
--- /dev/null
+++ b/软件设计文档/01-DMS.Core-详细设计.md
@@ -0,0 +1,232 @@
+# 软件开发文档 - 01. DMS.Core 详细设计
+
+`DMS.Core` 是系统的核心,定义了所有业务逻辑的蓝图。它不包含任何具体实现,确保了业务规则的独立性和可移植性。
+
+## 1. 目录结构
+
+```
+DMS.Core/
+├── Enums/
+│ ├── ProtocolType.cs
+│ └── SignalType.cs
+├── Models/
+│ ├── Device.cs
+│ ├── MqttServer.cs
+│ ├── Variable.cs
+│ ├── VariableHistory.cs
+│ └── VariableTable.cs
+├── Interfaces/
+│ ├── IBaseRepository.cs
+│ ├── IDeviceRepository.cs
+│ ├── IMqttServerRepository.cs
+│ ├── IVariableHistoryRepository.cs
+│ ├── IVariableRepository.cs
+│ └── IVariableTableRepository.cs
+└── DMS.Core.csproj
+```
+
+## 2. 文件详解
+
+### 2.1. 枚举 (`Enums/`)
+
+#### `ProtocolType.cs`
+
+```csharp
+// 文件: DMS.Core/Enums/ProtocolType.cs
+namespace DMS.Core.Enums;
+
+///
+/// 定义了设备支持的通信协议类型。
+///
+public enum ProtocolType
+{
+ ///
+ /// Siemens S7 通信协议。
+ ///
+ S7,
+
+ ///
+ /// OPC UA (Unified Architecture) 协议。
+ ///
+ OpcUa,
+
+ ///
+ /// Modbus TCP 协议。
+ ///
+ ModbusTcp
+}
+```
+
+#### `SignalType.cs`
+
+```csharp
+// 文件: DMS.Core/Enums/SignalType.cs
+namespace DMS.Core.Enums;
+
+///
+/// 定义了变量支持的数据类型。
+///
+public enum SignalType
+{
+ ///
+ /// 布尔值 (true/false)。
+ ///
+ Boolean,
+
+ ///
+ /// 字节 (8-bit 无符号整数)。
+ ///
+ Byte,
+
+ ///
+ /// 16位有符号整数。
+ ///
+ Int16,
+
+ ///
+ /// 32位有符号整数。
+ ///
+ Int32,
+
+ ///
+ /// 单精度浮点数。
+ ///
+ Float,
+
+ ///
+ /// 字符串。
+ ///
+ String
+}
+```
+
+### 2.2. 领域模型 (`Models/`)
+
+#### `Device.cs`
+
+```csharp
+// 文件: DMS.Core/Models/Device.cs
+namespace DMS.Core.Models;
+
+///
+/// 代表一个可管理的物理或逻辑设备。
+///
+public class Device
+{
+ ///
+ /// 唯一标识符。
+ ///
+ public int Id { get; set; }
+
+ ///
+ /// 设备名称,用于UI显示和识别。
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 设备使用的通信协议。
+ ///
+ public ProtocolType Protocol { get; set; }
+
+ ///
+ /// 设备的IP地址。
+ ///
+ public string IpAddress { get; set; }
+
+ ///
+ /// 设备的通信端口号。
+ ///
+ public int Port { get; set; }
+
+ ///
+ /// 指示此设备是否处于激活状态。只有激活的设备才会被轮询。
+ ///
+ public bool IsActive { get; set; }
+
+ ///
+ /// 此设备包含的变量表集合。
+ ///
+ public List VariableTables { get; set; } = new();
+}
+```
+
+... (其他模型 `MqttServer.cs`, `Variable.cs`, `VariableHistory.cs`, `VariableTable.cs` 的代码结构与此类似,包含详细的属性和注释) ...
+
+### 2.3. 仓储接口 (`Interfaces/`)
+
+#### `IBaseRepository.cs`
+
+```csharp
+// 文件: DMS.Core/Interfaces/IBaseRepository.cs
+namespace DMS.Core.Interfaces;
+
+///
+/// 提供泛型数据访问操作的基础仓储接口。
+///
+/// 领域模型的类型。
+public interface IBaseRepository where T : class
+{
+ ///
+ /// 异步根据ID获取单个实体。
+ ///
+ /// 实体的主键ID。
+ /// 找到的实体,如果不存在则返回null。
+ Task GetByIdAsync(int id);
+
+ ///
+ /// 异步获取所有实体。
+ ///
+ /// 所有实体的列表。
+ Task> GetAllAsync();
+
+ ///
+ /// 异步添加一个新实体。
+ ///
+ /// 要添加的实体。
+ Task AddAsync(T entity);
+
+ ///
+ /// 异步更新一个已存在的实体。
+ ///
+ /// 要更新的实体。
+ Task UpdateAsync(T entity);
+
+ ///
+ /// 异步根据ID删除一个实体。
+ ///
+ /// 要删除的实体的主键ID。
+ Task DeleteAsync(int id);
+}
+```
+
+#### `IDeviceRepository.cs`
+
+```csharp
+// 文件: DMS.Core/Interfaces/IDeviceRepository.cs
+using DMS.Core.Models;
+
+namespace DMS.Core.Interfaces;
+
+///
+/// 继承自IBaseRepository,提供设备相关的特定数据查询功能。
+///
+public interface IDeviceRepository : IBaseRepository
+{
+ ///
+ /// 异步获取所有激活的设备,并级联加载其下的变量表和变量。
+ /// 这是后台轮询服务需要的主要数据。
+ ///
+ /// 包含完整层级结构的激活设备列表。
+ Task> GetActiveDevicesWithDetailsAsync();
+
+ ///
+ /// 异步根据协议类型获取设备列表。
+ ///
+ /// 协议类型。
+ /// 符合条件的设备列表。
+ Task> GetDevicesByProtocolAsync(ProtocolType protocol);
+}
+```
+
+... (其他仓储接口 `IMqttServerRepository.cs`, `IVariableRepository.cs` 等的代码结构与此类似) ...
+
diff --git a/软件设计文档/01-核心领域模型与接口.md b/软件设计文档/01-核心领域模型与接口.md
new file mode 100644
index 0000000..5d73888
--- /dev/null
+++ b/软件设计文档/01-核心领域模型与接口.md
@@ -0,0 +1,190 @@
+# 软件开发文档 - 01. 核心领域模型与接口
+
+本文档详细定义 `DMS.Core` 项目中的领域模型、仓储接口和核心枚举。
+
+## 1. 核心枚举 (`Enums/`)
+
+```csharp
+// 文件: DMS.Core/Enums/ProtocolType.cs
+namespace DMS.Core.Enums;
+
+public enum ProtocolType
+{
+ S7,
+ OpcUa,
+ ModbusTcp
+}
+
+// 文件: DMS.Core/Enums/SignalType.cs
+namespace DMS.Core.Enums;
+
+public enum SignalType
+{
+ Boolean,
+ Byte,
+ Int16,
+ Int32,
+ Float,
+ String
+}
+```
+
+## 2. 领域模型 (`Models/`)
+
+领域模型是业务核心的C#类表示。
+
+### 2.1. `Device` - 设备
+
+代表一个物理或逻辑设备。
+
+```csharp
+// 文件: DMS.Core/Models/Device.cs
+namespace DMS.Core.Models;
+
+public class Device
+{
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public ProtocolType Protocol { get; set; }
+ public string IpAddress { get; set; } // 设备IP地址
+ public int Port { get; set; } // 端口号
+ public bool IsActive { get; set; } // 是否启用
+ public List VariableTables { get; set; } = new();
+}
+```
+
+### 2.2. `VariableTable` - 变量表
+
+组织和管理一组相关的变量。
+
+```csharp
+// 文件: DMS.Core/Models/VariableTable.cs
+namespace DMS.Core.Models;
+
+public class VariableTable
+{
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public string Description { get; set; }
+ public bool IsActive { get; set; } // 是否启用
+ public int DeviceId { get; set; }
+ public Device Device { get; set; }
+ public List Variables { get; set; } = new();
+}
+```
+
+### 2.3. `Variable` - 变量
+
+核心数据点,代表从设备读取的单个值。
+
+```csharp
+// 文件: DMS.Core/Models/Variable.cs
+namespace DMS.Core.Models;
+
+public class Variable
+{
+ public int Id { get; set; }
+ public string Name { get; set; } // 变量名
+ public string Address { get; set; } // 在设备中的地址 (例如: DB1.DBD0, M100.0)
+ public SignalType DataType { get; set; } // 数据类型
+ public bool IsActive { get; set; } // 是否启用
+ public int VariableTableId { get; set; }
+ public VariableTable VariableTable { get; set; }
+ public List MqttServers { get; set; } = new(); // 关联的MQTT服务器
+}
+```
+
+### 2.4. `MqttServer` - MQTT服务器
+
+代表一个MQTT Broker的配置。
+
+```csharp
+// 文件: DMS.Core/Models/MqttServer.cs
+namespace DMS.Core.Models;
+
+public class MqttServer
+{
+ public int Id { get; set; }
+ public string ServerName { get; set; }
+ public string BrokerAddress { get; set; } // Broker地址
+ public int Port { get; set; } // 端口
+ public string Username { get; set; }
+ public string Password { get; set; }
+ public bool IsActive { get; set; } // 是否启用
+ public List Variables { get; set; } = new(); // 关联的变量
+}
+```
+
+### 2.5. `VariableHistory` - 变量历史记录
+
+用于存储变量值的变化记录。
+
+```csharp
+// 文件: DMS.Core/Models/VariableHistory.cs
+namespace DMS.Core.Models;
+
+public class VariableHistory
+{
+ public long Id { get; set; }
+ public int VariableId { get; set; }
+ public string Value { get; set; } // 以字符串形式存储,便于通用性
+ public DateTime Timestamp { get; set; }
+}
+```
+
+## 3. 仓储接口 (`Interfaces/`)
+
+仓储接口定义了数据持久化的契约,由基础设施层实现。
+
+### 3.1. `IBaseRepository` - 基础仓储接口
+
+```csharp
+// 文件: DMS.Core/Interfaces/IBaseRepository.cs
+namespace DMS.Core.Interfaces;
+
+public interface IBaseRepository where T : class
+{
+ Task GetByIdAsync(int id);
+ Task> GetAllAsync();
+ Task AddAsync(T entity);
+ Task UpdateAsync(T entity);
+ Task DeleteAsync(int id);
+}
+```
+
+### 3.2. 专用仓储接口
+
+这些接口继承自 `IBaseRepository` 并可以添加特定于该模型的查询方法。
+
+```csharp
+// 文件: DMS.Core/Interfaces/IDeviceRepository.cs
+namespace DMS.Core.Interfaces;
+
+public interface IDeviceRepository : IBaseRepository
+{
+ // 获取所有激活的设备,并包含其变量表和变量
+ Task> GetActiveDevicesWithDetailsAsync();
+ // 根据协议类型获取设备
+ Task> GetDevicesByProtocolAsync(ProtocolType protocol);
+}
+
+// 文件: DMS.Core/Interfaces/IVariableRepository.cs
+namespace DMS.Core.Interfaces;
+
+public interface IVariableRepository : IBaseRepository
+{
+ // 获取一个变量及其关联的MQTT服务器
+ Task GetVariableWithMqttServersAsync(int variableId);
+}
+
+// 文件: DMS.Core/Interfaces/IMqttServerRepository.cs
+namespace DMS.Core.Interfaces;
+
+public interface IMqttServerRepository : IBaseRepository
+{
+ // 获取一个MQTT服务器及其关联的所有变量
+ Task GetMqttServerWithVariablesAsync(int serverId);
+}
+
+// 其他仓储接口,如 IVariableTableRepository, IVariableHistoryRepository 等,结构类似。
+```
diff --git a/软件设计文档/02-DMS.Application-详细设计.md b/软件设计文档/02-DMS.Application-详细设计.md
new file mode 100644
index 0000000..0d80589
--- /dev/null
+++ b/软件设计文档/02-DMS.Application-详细设计.md
@@ -0,0 +1,175 @@
+# 软件开发文档 - 02. DMS.Application 详细设计
+
+`DMS.Application` 层是业务逻辑的执行者和协调者。它接收来自表现层的请求,使用 `DMS.Core` 的领域模型和接口来完成任务,并向上层返回DTOs。
+
+## 1. 目录结构
+
+```
+DMS.Application/
+├── DTOs/
+│ ├── DeviceDto.cs
+│ ├── MqttServerDto.cs
+│ ├── VariableDto.cs
+│ └── ... (其他增、删、改、查相关的DTO)
+├── Interfaces/
+│ ├── IDeviceAppService.cs
+│ ├── IMqttAppService.cs
+│ └── ... (其他应用服务接口)
+├── Services/
+│ ├── DeviceAppService.cs
+│ ├── MqttAppService.cs
+│ └── ... (其他应用服务实现)
+├── Profiles/
+│ └── MappingProfile.cs
+└── DMS.Application.csproj
+```
+
+## 2. 文件详解
+
+### 2.1. 数据传输对象 (`DTOs/`)
+
+DTOs 是为了隔离领域模型和UI而设计的简单数据容器。
+
+#### `DeviceDto.cs`
+
+```csharp
+// 文件: DMS.Application/DTOs/DeviceDto.cs
+namespace DMS.Application.DTOs;
+
+///
+/// 用于在UI上显示设备基本信息的DTO。
+///
+public class DeviceDto
+{
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public string Protocol { get; set; }
+ public string IpAddress { get; set; }
+ public int Port { get; set; }
+ public bool IsActive { get; set; }
+ public string Status { get; set; } // "在线", "离线", "连接中..."
+}
+```
+
+#### `CreateDeviceDto.cs`
+
+```csharp
+// 文件: DMS.Application/DTOs/CreateDeviceDto.cs
+using DMS.Core.Enums;
+
+namespace DMS.Application.DTOs;
+
+///
+/// 用于创建新设备时传输数据的DTO。
+///
+public class CreateDeviceDto
+{
+ public string Name { get; set; }
+ public ProtocolType Protocol { get; set; }
+ public string IpAddress { get; set; }
+ public int Port { get; set; }
+}
+```
+
+... (其他DTOs如 `UpdateDeviceDto`, `VariableTableDto`, `MqttServerDto` 等结构类似) ...
+
+### 2.2. 应用服务接口 (`Interfaces/`)
+
+#### `IDeviceAppService.cs`
+
+```csharp
+// 文件: DMS.Application/Interfaces/IDeviceAppService.cs
+using DMS.Application.DTOs;
+
+namespace DMS.Application.Interfaces;
+
+///
+/// 定义设备管理相关的应用服务操作。
+///
+public interface IDeviceAppService
+{
+ Task GetDeviceByIdAsync(int id);
+ Task> GetAllDevicesAsync();
+ Task CreateDeviceAsync(CreateDeviceDto deviceDto);
+ Task UpdateDeviceAsync(UpdateDeviceDto deviceDto);
+ Task DeleteDeviceAsync(int id);
+ Task ToggleDeviceActiveStateAsync(int id);
+}
+```
+
+### 2.3. 应用服务实现 (`Services/`)
+
+#### `DeviceAppService.cs`
+
+```csharp
+// 文件: DMS.Application/Services/DeviceAppService.cs
+using AutoMapper;
+using DMS.Core.Interfaces;
+using DMS.Core.Models;
+
+namespace DMS.Application.Services;
+
+///
+/// 实现设备管理的应用服务。
+///
+public class DeviceAppService : IDeviceAppService
+{
+ private readonly IDeviceRepository _deviceRepository;
+ private readonly IMapper _mapper;
+
+ public DeviceAppService(IDeviceRepository deviceRepository, IMapper mapper)
+ {
+ _deviceRepository = deviceRepository;
+ _mapper = mapper;
+ }
+
+ public async Task CreateDeviceAsync(CreateDeviceDto deviceDto)
+ {
+ var device = _mapper.Map(deviceDto);
+ device.IsActive = true; // 默认激活
+ await _deviceRepository.AddAsync(device);
+ return device.Id; // 返回新创建的ID
+ }
+
+ // ... 其他方法的完整实现
+}
+```
+
+### 2.4. AutoMapper配置 (`Profiles/`)
+
+#### `MappingProfile.cs`
+
+```csharp
+// 文件: DMS.Application/Profiles/MappingProfile.cs
+using AutoMapper;
+using DMS.Core.Models;
+using DMS.Application.DTOs;
+using DMS.Core.Enums;
+
+namespace DMS.Application.Profiles;
+
+///
+/// 配置AutoMapper的映射规则。
+///
+public class MappingProfile : Profile
+{
+ public MappingProfile()
+ {
+ // Device 映射
+ CreateMap();
+ CreateMap();
+ CreateMap()
+ .ForMember(dest => dest.Protocol, opt => opt.MapFrom(src => src.Protocol.ToString()));
+
+ // VariableTable 映射
+ CreateMap();
+
+ // Variable 映射
+ CreateMap()
+ .ForMember(dest => dest.DataType, opt => opt.MapFrom(src => src.DataType.ToString()));
+
+ // MqttServer 映射
+ CreateMap();
+ }
+}
+```
diff --git a/软件设计文档/02-数据库设计.md b/软件设计文档/02-数据库设计.md
new file mode 100644
index 0000000..c0168c8
--- /dev/null
+++ b/软件设计文档/02-数据库设计.md
@@ -0,0 +1,215 @@
+# 软件开发文档 - 02. 数据库设计
+
+本文档详细描述了DMS系统的数据库结构,包括表、字段和关系。数据库实体类将放在 `DMS.Infrastructure/Entities/` 目录下。
+
+## 1. 数据库关系图 (ERD)
+
+```mermaid
+erDiagram
+ DEVICE {
+ int Id PK
+ varchar Name
+ int Protocol
+ varchar IpAddress
+ int Port
+ bool IsActive
+ }
+
+ VARIABLE_TABLE {
+ int Id PK
+ varchar Name
+ varchar Description
+ bool IsActive
+ int DeviceId FK
+ }
+
+ VARIABLE {
+ int Id PK
+ varchar Name
+ varchar Address
+ int DataType
+ bool IsActive
+ int VariableTableId FK
+ }
+
+ MQTT_SERVER {
+ int Id PK
+ varchar ServerName
+ varchar BrokerAddress
+ int Port
+ varchar Username
+ varchar Password
+ bool IsActive
+ }
+
+ VARIABLE_HISTORY {
+ bigint Id PK
+ int VariableId FK
+ varchar Value
+ datetime Timestamp
+ }
+
+ VARIABLE_MQTT_SERVER_MAP {
+ int VariableId PK, FK
+ int MqttServerId PK, FK
+ }
+
+ DEVICE ||--o{ VARIABLE_TABLE : "包含"
+ VARIABLE_TABLE ||--o{ VARIABLE : "包含"
+ VARIABLE ||--o{ VARIABLE_HISTORY : "记录"
+ VARIABLE }o--o{ MQTT_SERVER : "关联 (多对多)"
+ VARIABLE_MQTT_SERVER_MAP }|..|{ VARIABLE : ""
+ VARIABLE_MQTT_SERVER_MAP }|..|{ MQTT_SERVER : ""
+
+```
+
+## 2. 数据库实体类 (`Entities/`)
+
+这些是与数据库表一一对应的C#类,使用了 `SqlSugar` 的特性(Attribute)来定义主键、外键等。
+
+### 2.1. `DbDevice`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbDevice.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("Devices")]
+public class DbDevice
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public int Protocol { get; set; } // 对应 ProtocolType 枚举
+ public string IpAddress { get; set; }
+ public int Port { get; set; }
+ public bool IsActive { get; set; }
+}
+```
+
+### 2.2. `DbVariableTable`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbVariableTable.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("VariableTables")]
+public class DbVariableTable
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public string Description { get; set; }
+ public bool IsActive { get; set; }
+ public int DeviceId { get; set; }
+}
+```
+
+### 2.3. `DbVariable`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbVariable.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("Variables")]
+public class DbVariable
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public string Address { get; set; }
+ public int DataType { get; set; } // 对应 SignalType 枚举
+ public bool IsActive { get; set; }
+ public int VariableTableId { get; set; }
+}
+```
+
+### 2.4. `DbMqttServer`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbMqttServer.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("MqttServers")]
+public class DbMqttServer
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string ServerName { get; set; }
+ public string BrokerAddress { get; set; }
+ public int Port { get; set; }
+ public string Username { get; set; }
+ public string Password { get; set; }
+ public bool IsActive { get; set; }
+}
+```
+
+### 2.5. `DbVariableHistory`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbVariableHistory.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("VariableHistories")]
+public class DbVariableHistory
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public long Id { get; set; }
+ public int VariableId { get; set; }
+ public string Value { get; set; }
+ public DateTime Timestamp { get; set; }
+}
+```
+
+### 2.6. `DbVariableMqttMap` - 多对多关系映射表
+
+用于连接 `Variable` 和 `MqttServer`。
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbVariableMqttMap.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("VariableMqttMap")]
+public class DbVariableMqttMap
+{
+ [SugarColumn(IsPrimaryKey = true)]
+ public int VariableId { get; set; }
+
+ [SugarColumn(IsPrimaryKey = true)]
+ public int MqttServerId { get; set; }
+}
+```
+
+## 3. 数据映射 (Mapping)
+
+为了在领域模型 (`DMS.Core.Models`) 和数据库实体 (`DMS.Infrastructure.Entities`) 之间进行转换,我们将使用 `AutoMapper`。映射配置将放在 `DMS.Infrastructure/Profiles/MappingProfile.cs` 中。
+
+```csharp
+// 文件: DMS.Infrastructure/Profiles/MappingProfile.cs
+using AutoMapper;
+using DMS.Core.Models;
+using DMS.Infrastructure.Entities;
+
+public class MappingProfile : Profile
+{
+ public MappingProfile()
+ {
+ CreateMap().ReverseMap();
+ CreateMap().ReverseMap();
+ CreateMap().ReverseMap();
+ CreateMap().ReverseMap();
+ // 注意:对于复杂的嵌套映射,可能需要更详细的配置。
+ }
+}
+```
diff --git a/软件设计文档/03-DMS.Infrastructure-详细设计.md b/软件设计文档/03-DMS.Infrastructure-详细设计.md
new file mode 100644
index 0000000..6efb1e4
--- /dev/null
+++ b/软件设计文档/03-DMS.Infrastructure-详细设计.md
@@ -0,0 +1,164 @@
+# 软件开发文档 - 03. DMS.Infrastructure 详细设计
+
+`DMS.Infrastructure` 层是所有外部技术和服务的具体实现地。它实现了 `DMS.Core` 定义的接口,为 `DMS.Application` 层提供数据和功能支持。
+
+## 1. 目录结构
+
+```
+DMS.Infrastructure/
+├── Data/
+│ └── SqlSugarDbContext.cs
+├── Entities/
+│ ├── DbDevice.cs
+│ ├── DbMqttServer.cs
+│ ├── DbVariable.cs
+│ └── ... (所有数据库表对应的实体)
+├── Repositories/
+│ ├── BaseRepository.cs
+│ ├── DeviceRepository.cs
+│ └── ... (所有仓储接口的实现)
+├── Services/
+│ ├── Communication/
+│ │ ├── S7CommunicationService.cs
+│ │ └── MqttPublishService.cs
+│ ├── Processing/
+│ │ ├── ChangeDetectionProcessor.cs
+│ │ ├── HistoryStorageProcessor.cs
+│ │ └── MqttPublishProcessor.cs
+│ └── DatabaseInitializerService.cs
+└── DMS.Infrastructure.csproj
+```
+
+## 2. 文件详解
+
+### 2.1. 数据库实体 (`Entities/`)
+
+#### `DbDevice.cs`
+
+```csharp
+// 文件: DMS.Infrastructure/Entities/DbDevice.cs
+using SqlSugar;
+
+namespace DMS.Infrastructure.Entities;
+
+[SugarTable("Devices")]
+public class DbDevice
+{
+ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public int Protocol { get; set; }
+ public string IpAddress { get; set; }
+ public int Port { get; set; }
+ public bool IsActive { get; set; }
+}
+```
+... (其他实体 `DbVariableTable`, `DbVariable`, `DbMqttServer`, `DbVariableHistory`, `DbVariableMqttMap` 结构类似) ...
+
+### 2.2. 仓储实现 (`Repositories/`)
+
+#### `BaseRepository.cs`
+
+```csharp
+// 文件: DMS.Infrastructure/Repositories/BaseRepository.cs
+// 注意:这里需要一个从领域模型到数据库实体的映射,实际项目中通常使用AutoMapper的ProjectTo或手动映射。
+// 为简化示例,此处仅做基础实现。
+```
+
+#### `DeviceRepository.cs`
+
+```csharp
+// 文件: DMS.Infrastructure/Repositories/DeviceRepository.cs
+using AutoMapper;
+using DMS.Core.Interfaces;
+using DMS.Core.Models;
+using DMS.Infrastructure.Entities;
+using SqlSugar;
+
+public class DeviceRepository : IDeviceRepository
+{
+ private readonly ISqlSugarClient _db;
+ private readonly IMapper _mapper;
+
+ public DeviceRepository(ISqlSugarClient db, IMapper mapper) { /* ... */ }
+
+ public async Task> GetActiveDevicesWithDetailsAsync()
+ {
+ var dbResult = await _db.Queryable()
+ .Where(d => d.IsActive)
+ .ToListAsync();
+ // 此处需要手动或通过AutoMapper加载关联的变量表和变量
+ return _mapper.Map>(dbResult);
+ }
+ // ... 其他方法的实现
+}
+```
+
+### 2.3. 外部服务 (`Services/`)
+
+#### `S7CommunicationService.cs`
+
+```csharp
+// 文件: DMS.Infrastructure/Services/Communication/S7CommunicationService.cs
+using S7.Net;
+using System.Collections.Concurrent;
+
+public class S7CommunicationService : IS7CommunicationService
+{
+ private readonly ConcurrentDictionary _clients = new();
+
+ public async Task