# 充电桩管理系统使用说明

## 📋 概述

充电桩管理系统是一个基于 WinForms 的可视化管理工具，用于管理 AGV 系统中的充电桩设备。

## 🚀 快速开始

### 打开管理窗口

```csharp
// 在代码中打开充电桩管理窗口
var form = new StandardScene.Charge.ChargeStationManagementForm();
form.ShowDialog();

// 或者在按钮点击事件中
private void btnOpenChargeManagement_Click(object sender, EventArgs e)
{
    var form = new StandardScene.Charge.ChargeStationManagementForm();
    form.Show();
}
```

### 添加菜单项（推荐）

在主窗口的菜单栏中添加：

```csharp
// 在主窗口的初始化代码中
var menuItem = new ToolStripMenuItem("充电桩管理");
menuItem.Click += (s, e) => {
    var form = new StandardScene.Charge.ChargeStationManagementForm();
    form.Show();
};
// 将 menuItem 添加到主菜单
```

## 📖 功能说明

### 1. 充电桩列表（左侧面板）

#### 功能特性
- **实时显示**：显示所有充电桩的详细信息
- **颜色标识**：
  - 🟢 **绿色**：充电中
  - 🔴 **红色**：故障
  - ⚫ **灰色**：离线
  - ⚪ **白色**：空闲/其他状态
- **搜索功能**：支持按编号、名称、IP地址搜索
- **双击编辑**：双击列表项可快速编辑

#### 列表字段
| 字段 | 说明 | 示例 |
|-----|------|------|
| 编号 | 充电桩唯一标识 | CS20240115123456 |
| 名称 | 充电桩名称 | 1号充电桩 |
| IP地址 | 设备IP | 192.168.1.100 |
| 端口 | 通信端口 | 502 |
| 电压(V) | 额定电压 | 220.0 |
| 电流(A) | 额定电流 | 32.0 |
| 功率(W) | 计算功率 | 7040.0 |
| 状态 | 当前状态 | 空闲/充电中/故障 |
| 启用 | 是否启用 | 是/否 |
| 站点ID | 关联站点 | 1001 |
| 备注 | 备注信息 | 南区1号充电桩 |

### 2. 充电桩编辑（右侧面板）

#### 必填字段
- ✅ **编号**：自动生成（格式：CS+时间戳+随机数）
- ✅ **名称**：充电桩名称，便于识别
- ✅ **IP地址**：设备IP，必须为有效IP格式
- ✅ **端口**：通信端口（1-65535）
- ✅ **电压**：额定电压（0-1000V）
- ✅ **电流**：额定电流（0-500A）

#### 选填字段
- 📌 **状态**：空闲/充电中/故障/离线/维护中/预约中
- 📌 **启用**：是否启用该充电桩
- 📌 **站点ID**：关联的站点编号（与地图站点关联）
- 📌 **备注**：额外说明信息

#### 自动计算
- ⚡ **功率**：自动计算（电压 × 电流）

### 3. 操作按钮

#### 右侧编辑区
- 🆕 **新增**：清空表单，准备添加新充电桩
- 💾 **保存**：保存当前充电桩信息（新增或更新）
- 🗑️ **删除**：删除当前选中的充电桩
- ❌ **取消**：清空表单

#### 左侧列表区
- 🔄 **刷新**：重新加载数据
- 📤 **导出**：导出充电桩数据为 JSON 或 CSV 文件

## 🔒 数据验证规则

### IP地址验证
```
✅ 有效：192.168.1.100, 10.0.0.1, 172.16.0.1
❌ 无效：192.168.1, 256.1.1.1, abc.def.ghi.jkl
```

### 端口验证
```
✅ 有效：502, 8080, 1234
❌ 无效：0, 70000, -1
```

### 电压验证
```
✅ 有效：220V, 380V, 110V
❌ 无效：-10V, 1500V, 0V
```

### 电流验证
```
✅ 有效：32A, 16A, 63A
❌ 无效：-5A, 600A, 0A
```

### 唯一性验证
- ❌ 编号不能重复
- ❌ IP地址+端口组合不能重复

## 💾 数据存储

### 存储位置
```
项目根目录/Data/ChargeStations.json
```

### 数据格式
```json
[
  {
    "StationId": "CS20240115123456",
    "Name": "1号充电桩",
    "IpAddress": "192.168.1.100",
    "Port": 502,
    "Voltage": 220.0,
    "Current": 32.0,
    "Status": 0,
    "Enabled": true,
    "SiteId": 1001,
    "Remarks": "南区1号充电桩",
    "CreatedTime": "2024-01-15T12:34:56",
    "ModifiedTime": "2024-01-15T14:20:30"
  }
]
```

## 📊 代码集成

### 获取充电桩数据

```csharp
using StandardScene.Charge;

// 获取数据服务实例
var dataService = ChargeStationDataService.Instance;

// 获取所有充电桩
var allStations = dataService.GetAllStations();

// 获取空闲充电桩
var idleStations = dataService.GetIdleStations();

// 根据编号获取充电桩
var station = dataService.GetStationById("CS20240115123456");

// 获取充电中的充电桩数量
int chargingCount = dataService.GetChargingCount();
```

### 添加/更新充电桩

```csharp
// 创建新充电桩
var newStation = new ChargeStation
{
    Name = "2号充电桩",
    IpAddress = "192.168.1.101",
    Port = 502,
    Voltage = 220.0,
    Current = 32.0
};

// 添加
if (dataService.AddStation(newStation, out string errorMsg))
{
    Console.WriteLine("添加成功");
}
else
{
    Console.WriteLine($"添加失败: {errorMsg}");
}

// 更新状态
dataService.UpdateStationStatus("CS20240115123456", ChargeStationStatus.Charging);
```

### 删除充电桩

```csharp
// 删除充电桩
if (dataService.DeleteStation("CS20240115123456", out string errorMsg))
{
    Console.WriteLine("删除成功");
}
else
{
    Console.WriteLine($"删除失败: {errorMsg}");
}
```

## ⚠️ 注意事项

1. **数据持久化**：所有数据自动保存到 JSON 文件，重启后数据不会丢失
2. **线程安全**：数据服务使用单例模式和锁机制，支持多线程访问
3. **状态管理**：充电中的充电桩无法删除，需先停止充电
4. **IP冲突检测**：系统会自动检测IP和端口的冲突
5. **数据备份**：建议定期备份 `Data/ChargeStations.json` 文件

## 🔧 扩展功能建议

### 与充电任务集成

在 `AbstractChargeMission.cs` 中集成充电桩数据：

```csharp
// 在充电任务中获取充电桩信息
private void SelectChargeStation(Car car)
{
    var dataService = ChargeStationDataService.Instance;
    var idleStations = dataService.GetIdleStations();
    
    if (idleStations.Count > 0)
    {
        var nearestStation = FindNearestStation(car, idleStations);
        
        // 更新充电桩状态
        dataService.UpdateStationStatus(
            nearestStation.StationId, 
            ChargeStationStatus.Reserved
        );
        
        // 分配车辆到充电桩
        AssignCarToStation(car, nearestStation);
    }
}

// 充电完成后
private void OnChargeComplete(Car car, ChargeStation station)
{
    var dataService = ChargeStationDataService.Instance;
    dataService.UpdateStationStatus(
        station.StationId, 
        ChargeStationStatus.Idle
    );
}
```

### 监控充电桩状态

```csharp
// 定期检查充电桩在线状态
private void MonitorChargeStations()
{
    var dataService = ChargeStationDataService.Instance;
    var stations = dataService.GetAllStations();
    
    foreach (var station in stations)
    {
        if (station.Enabled)
        {
            bool isOnline = PingStation(station.IpAddress, station.Port);
            
            var newStatus = isOnline 
                ? ChargeStationStatus.Idle 
                : ChargeStationStatus.Offline;
            
            if (station.Status != newStatus)
            {
                dataService.UpdateStationStatus(station.StationId, newStatus);
                Diagnosis.Log($"充电桩 {station.Name} 状态变更: {newStatus}", 
                    "ChargeStation", true);
            }
        }
    }
}
```

## 📞 技术支持

如有问题，请检查：
1. `Data` 文件夹是否有写入权限
2. JSON 文件格式是否正确
3. 日志中的错误信息（标签：`ChargeStation`）

---

**版本**: 1.0.0  
**最后更新**: 2024-01-15  
**作者**: MDCS System



