using System; using System.Collections.Generic; using System.Linq; using CycleGUI; using SimpleCore; using SimpleCore.Library; using StandardScene.Utils; namespace StandardScene.Charge { /// /// 充电桩管理辅助类 /// 提供简化的静态方法用于快速访问充电桩功能 /// public static class ChargeStationHelper { /// 打开充电桩管理面板(单实例)。 public static void OpenManagementWindow() => ChargeStationManagementForm.Open(); /// 打开充电桩管理面板(兼容旧 API)。 public static void OpenManagementDialog() => ChargeStationManagementForm.Open(); /// /// 获取指定站点的充电桩 /// /// 站点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; } /// 显示充电桩选择面板(非阻塞;通过 回调返回结果)。 public static void ShowStationSelectionDialog(ChargeStationStatus? filterByStatus, System.Action onSelected) { var stations = ChargeStationDataService.Instance.GetAllStations(); if (filterByStatus.HasValue) stations = stations.Where(s => s.Status == filterByStatus.Value).ToList(); if (stations.Count == 0) { CycleUiHelper.Alert("提示", "没有符合条件的充电桩"); onSelected?.Invoke(null); return; } var labels = stations.Select(s => $"[{s.StationId}] {s.Name} - {s.IpAddress}:{s.Port} - {GetStatusText(s.Status)}").ToArray(); int sel = 0; var dlg = GUI.DeclarePanel() .ShowTitle("选择充电桩") .TopMost(true) .InitSize(520, 400) .InitPos(false, 0, 0, 0.5f, 0.5f, 0.5f, 0.5f); dlg.Define(pb => { if (pb.Closing()) { dlg.Exit(); onSelected?.Invoke(null); return; } sel = pb.ListBox("充电桩", labels, height: 12); if (pb.Button("确定", distinct: "cs-pick-ok")) { dlg.Exit(); onSelected?.Invoke(sel >= 0 && sel < stations.Count ? stations[sel] : null); } pb.SameLine(8); if (pb.Button("取消", distinct: "cs-pick-cancel")) { dlg.Exit(); onSelected?.Invoke(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; } } } }