using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using SimpleCore; using SimpleCore.Library; namespace StandardScene.Charge { /// /// 充电桩管理辅助类 /// 提供简化的静态方法用于快速访问充电桩功能 /// public static class ChargeStationHelper { private static ChargeStationManagementForm _managementForm; /// /// 打开充电桩管理窗口(单例模式) /// public static void OpenManagementWindow() { if (_managementForm == null || _managementForm.IsDisposed) { _managementForm = new ChargeStationManagementForm(); _managementForm.FormClosed += (s, e) => _managementForm = null; _managementForm.Show(); } else { _managementForm.BringToFront(); _managementForm.Activate(); } } /// /// 打开充电桩管理窗口(对话框模式) /// public static DialogResult OpenManagementDialog() { using (var form = new ChargeStationManagementForm()) { return form.ShowDialog(); } } /// /// 获取指定站点的充电桩 /// /// 站点ID /// 充电桩对象,如果不存在则返回null public static ChargeStation GetStationBySiteId(int siteId) { var dataService = ChargeStationDataService.Instance; return dataService.GetAllStations() .FirstOrDefault(s => s.SiteId == siteId); } /// /// 获取指定IP的充电桩 /// /// IP地址 /// 充电桩对象,如果不存在则返回null public static ChargeStation GetStationByIp(string ipAddress) { var dataService = ChargeStationDataService.Instance; return dataService.GetAllStations() .FirstOrDefault(s => s.IpAddress == ipAddress); } /// /// 获取所有充电桩配置 /// /// 所有充电桩配置列表 public static List GetAllStationConfigs() { var dataService = ChargeStationDataService.Instance; return dataService.GetAllStations(); } /// /// 获取当前充电策略配置 /// /// 充电策略配置对象 public static ChargeStrategyConfig GetChargeStrategyConfig() { var configService = ChargeStrategyConfigService.Instance; return configService.LoadConfig(); } /// /// 保存充电策略配置 /// /// 充电策略配置对象 public static void SaveChargeStrategyConfig(ChargeStrategyConfig config) { var configService = ChargeStrategyConfigService.Instance; configService.SaveConfig(config); } /// /// 检查指定站点是否有可用的充电桩 /// /// 站点ID /// true表示有可用充电桩,false表示没有 public static bool IsSiteHasAvailableChargeStation(int siteId) { var station = GetStationBySiteId(siteId); return station != null && station.Enabled && station.Status == ChargeStationStatus.Idle; } /// /// 标记充电桩开始充电 /// /// 充电桩编号 /// 车辆ID /// 成功返回true,失败返回false public static bool StartCharging(string stationId, int carId) { try { var dataService = ChargeStationDataService.Instance; var station = dataService.GetStationById(stationId); if (station == null) { Diagnosis.Log($"充电桩 {stationId} 不存在", "ChargeStation", true); return false; } if (station.Status == ChargeStationStatus.Charging) { Diagnosis.Log($"充电桩 {station.Name} 已经在充电中", "ChargeStation", true); return false; } bool success = dataService.UpdateStationStatus(stationId, ChargeStationStatus.Charging); if (success) { Diagnosis.Log($"车辆 {carId} 开始在充电桩 {station.Name} 充电", "ChargeStation", true); } return success; } catch (Exception ex) { Diagnosis.Log($"启动充电失败: {ExceptionFormatter.FormatEx(ex)}", "ChargeStation", true); return false; } } /// /// 标记充电桩停止充电 /// /// 充电桩编号 /// 车辆ID /// 成功返回true,失败返回false public static bool StopCharging(string stationId, int carId) { try { var dataService = ChargeStationDataService.Instance; var station = dataService.GetStationById(stationId); if (station == null) { Diagnosis.Log($"充电桩 {stationId} 不存在", "ChargeStation", true); return false; } bool success = dataService.UpdateStationStatus(stationId, ChargeStationStatus.Idle); if (success) { Diagnosis.Log($"车辆 {carId} 在充电桩 {station.Name} 充电完成", "ChargeStation", true); } return success; } catch (Exception ex) { Diagnosis.Log($"停止充电失败: {ExceptionFormatter.FormatEx(ex)}", "ChargeStation", true); return false; } } /// /// 标记充电桩为故障状态 /// /// 充电桩编号 /// 故障原因 /// 成功返回true,失败返回false public static bool MarkAsFault(string stationId, string reason = "") { try { var dataService = ChargeStationDataService.Instance; bool success = dataService.UpdateStationStatus(stationId, ChargeStationStatus.Fault); if (success) { var station = dataService.GetStationById(stationId); var message = string.IsNullOrEmpty(reason) ? $"充电桩 {station.Name} 标记为故障" : $"充电桩 {station.Name} 标记为故障: {reason}"; Diagnosis.Log(message, "ChargeStation", true); } return success; } catch (Exception ex) { Diagnosis.Log($"标记故障失败: {ExceptionFormatter.FormatEx(ex)}", "ChargeStation", true); return false; } } /// /// 获取充电桩状态摘要信息 /// /// 格式化的状态字符串 public static string GetStatusSummary() { var dataService = ChargeStationDataService.Instance; var stations = dataService.GetAllStations(); var total = stations.Count; var idle = stations.Count(s => s.Status == ChargeStationStatus.Idle && s.Enabled); var charging = stations.Count(s => s.Status == ChargeStationStatus.Charging); var fault = stations.Count(s => s.Status == ChargeStationStatus.Fault); var offline = stations.Count(s => s.Status == ChargeStationStatus.Battery); return $"总数:{total} | 空闲:{idle} | 充电中:{charging} | 故障:{fault} | 离线:{offline}"; } /// /// 获取最近的空闲充电桩(基于站点ID) /// /// 当前站点ID /// 最近的充电桩,如果没有则返回null public static ChargeStation FindNearestIdleStation(int currentSiteId) { var dataService = ChargeStationDataService.Instance; var idleStations = dataService.GetIdleStations(); if (idleStations.Count == 0) return null; // 优先选择同站点的充电桩 var sameStation = idleStations.FirstOrDefault(s => s.SiteId == currentSiteId); if (sameStation != null) return sameStation; // 否则选择第一个可用的 return idleStations[0]; } /// /// 快速创建测试充电桩(用于测试) /// /// 名称 /// IP地址 /// 站点ID /// 创建成功返回true public static bool QuickAddStation(string name, string ip, int? siteId = null) { var dataService = ChargeStationDataService.Instance; var station = new ChargeStation { Name = name, IpAddress = ip, Port = 502, SetVoltage = 220.0, SetElectricCurrent = 32.0, Status = ChargeStationStatus.Idle, Enabled = true, SiteId = siteId, Remarks = $"快速创建于 {DateTime.Now}" }; bool success = dataService.AddStation(station, out string errorMsg); if (success) { Diagnosis.Log($"快速创建充电桩: {name}", "ChargeStation", true); } else { Diagnosis.Log($"快速创建充电桩失败: {errorMsg}", "ChargeStation", true); } return success; } /// /// 显示充电桩选择对话框 /// /// 按状态过滤(null表示显示全部) /// 选中的充电桩,取消则返回null public static ChargeStation ShowStationSelectionDialog(ChargeStationStatus? filterByStatus = null) { var dataService = ChargeStationDataService.Instance; var stations = dataService.GetAllStations(); if (filterByStatus.HasValue) { stations = stations.Where(s => s.Status == filterByStatus.Value).ToList(); } if (stations.Count == 0) { MessageBox.Show("没有符合条件的充电桩", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } // 创建简单的选择对话框 using (var dialog = new Form()) { dialog.Text = "选择充电桩"; dialog.Size = new System.Drawing.Size(500, 400); dialog.StartPosition = FormStartPosition.CenterParent; var listBox = new ListBox { Dock = DockStyle.Fill, Font = new System.Drawing.Font("微软雅黑", 10F) }; foreach (var station in stations) { listBox.Items.Add($"[{station.StationId}] {station.Name} - {station.IpAddress}:{station.Port} - {GetStatusText(station.Status)}"); } var btnOK = new Button { Text = "确定", DialogResult = DialogResult.OK, Dock = DockStyle.Bottom, Height = 40 }; dialog.Controls.Add(listBox); dialog.Controls.Add(btnOK); dialog.AcceptButton = btnOK; if (dialog.ShowDialog() == DialogResult.OK && listBox.SelectedIndex >= 0) { return stations[listBox.SelectedIndex]; } return null; } } /// /// 获取状态文本 /// private static string GetStatusText(ChargeStationStatus status) { switch (status) { case ChargeStationStatus.Idle: return "空闲"; case ChargeStationStatus.Charging: return "充电中"; case ChargeStationStatus.Fault: return "故障"; case ChargeStationStatus.Battery: return "离线"; default: return "未知"; } } /// /// 批量更新充电桩在线状态(用于定期监控) /// /// 超时时间(毫秒) /// 更新的充电桩数量 public static int UpdateOnlineStatus(int timeout = 3000) { var dataService = ChargeStationDataService.Instance; var stations = dataService.GetAllStations().Where(s => s.Enabled).ToList(); int updatedCount = 0; foreach (var station in stations) { try { // 这里应该实际ping充电桩,此处仅演示 bool isOnline = PingStation(station.IpAddress, station.Port, timeout); var expectedStatus = isOnline ? (station.Status == ChargeStationStatus.Battery ? ChargeStationStatus.Idle : station.Status) : ChargeStationStatus.Battery; if (station.Status != expectedStatus && (station.Status == ChargeStationStatus.Battery || expectedStatus == ChargeStationStatus.Battery)) { if (dataService.UpdateStationStatus(station.StationId, expectedStatus)) { updatedCount++; Diagnosis.Log($"充电桩 {station.Name} 状态更新为: {GetStatusText(expectedStatus)}", "ChargeStation", true); } } } catch (Exception ex) { Diagnosis.Log($"检查充电桩 {station.Name} 在线状态失败: {ex.Message}", "ChargeStation"); } } return updatedCount; } /// /// Ping 充电桩(检查连通性) /// private static bool PingStation(string ip, int port, int timeout) { try { using (var client = new System.Net.Sockets.TcpClient()) { var result = client.BeginConnect(ip, port, null, null); var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(timeout)); if (success) { client.EndConnect(result); return true; } return false; } } catch { return false; } } } }