# 软件开发文档 - 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<VariableTable> 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<Variable> 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<MqttServer> 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<Variable> 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<T>` - 基础仓储接口

```csharp
// 文件: DMS.Core/Interfaces/IBaseRepository.cs
namespace DMS.Core.Interfaces;

public interface IBaseRepository<T> where T : class
{
    Task<T> GetByIdAsync(int id);
    Task<List<T>> 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<Device>
{
    // 获取所有激活的设备，并包含其变量表和变量
    Task<List<Device>> GetActiveDevicesWithDetailsAsync();
    // 根据协议类型获取设备
    Task<List<Device>> GetDevicesByProtocolAsync(ProtocolType protocol);
}

// 文件: DMS.Core/Interfaces/IVariableRepository.cs
namespace DMS.Core.Interfaces;

public interface IVariableRepository : IBaseRepository<Variable>
{
    // 获取一个变量及其关联的MQTT服务器
    Task<Variable> GetVariableWithMqttServersAsync(int variableId);
}

// 文件: DMS.Core/Interfaces/IMqttServerRepository.cs
namespace DMS.Core.Interfaces;

public interface IMqttServerRepository : IBaseRepository<MqttServer>
{
    // 获取一个MQTT服务器及其关联的所有变量
    Task<MqttServer> GetMqttServerWithVariablesAsync(int serverId);
}

// 其他仓储接口，如 IVariableTableRepository, IVariableHistoryRepository 等，结构类似。
```
