using DocumentFormat.OpenXml.Bibliography; using Newtonsoft.Json; using SimpleCore; using SimpleCore.Library; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace StandardScene.Charge { /// /// 充电桩数据服务 - 负责数据的持久化和管理 /// public class ChargeStationDataService { private static ChargeStationDataService _instance; private static readonly object lockObj = new object(); private List chargeStations; private readonly string dataFilePath; // 单例模式 public static ChargeStationDataService Instance { get { if (_instance == null) { lock (lockObj) { if (_instance == null) { _instance = new ChargeStationDataService(); } } } return _instance; } } private ChargeStationDataService() { // 数据文件路径:项目根目录/Config/ChargeStations.json var dataDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"); if (!Directory.Exists(dataDir)) { Directory.CreateDirectory(dataDir); } dataFilePath = Path.Combine(dataDir, "ChargeStations.json"); chargeStations = new List(); LoadData(); } /// /// 加载数据 /// private void LoadData() { try { if (File.Exists(dataFilePath)) { var json = File.ReadAllText(dataFilePath); chargeStations = JsonConvert.DeserializeObject>(json) ?? new List(); Diagnosis.Log($"加载充电桩数据成功,共 {chargeStations.Count} 条记录", "ChargeStation"); } else { chargeStations = new List(); Diagnosis.Log("充电桩数据文件不存在,已创建新列表", "ChargeStation"); } } catch (Exception ex) { Diagnosis.Log($"加载充电桩数据失败: {ExceptionFormatter.FormatEx(ex)}", "ChargeStation", true); chargeStations = new List(); } } /// /// 保存数据 /// private bool SaveData() { try { lock (lockObj) { var json = JsonConvert.SerializeObject(chargeStations, Formatting.Indented); File.WriteAllText(dataFilePath, json); //Diagnosis.Log($"保存充电桩数据成功,共 {chargeStations.Count} 条记录", "ChargeStation"); return true; } } catch (Exception ex) { Diagnosis.Log($"保存充电桩数据失败: {ExceptionFormatter.FormatEx(ex)}", "ChargeStation", true); return false; } } /// /// 获取所有充电桩 /// public List GetAllStations() { lock (lockObj) { return new List(chargeStations); } } /// /// 根据编号获取充电桩 /// public ChargeStation GetStationById(string stationId) { lock (lockObj) { return chargeStations.FirstOrDefault(s => s.StationId == stationId); } } /// /// 根据IP地址获取充电桩 /// public ChargeStation GetStationByIp(string ipAddress, int port) { lock (lockObj) { return chargeStations.FirstOrDefault(s => s.IpAddress == ipAddress && s.Port == port); } } public ChargeStation GetStationByIp(string ipAddress) { lock (lockObj) { return chargeStations.FirstOrDefault(s => s.IpAddress == ipAddress); } } /// /// 添加充电桩 /// public bool AddStation(ChargeStation station, out string errorMessage) { if (station == null) { errorMessage = "充电桩数据不能为空"; return false; } // 验证数据 if (!station.IsValid(out errorMessage)) { return false; } lock (lockObj) { // 检查编号是否已存在 if (chargeStations.Any(s => s.StationId == station.StationId)) { errorMessage = $"充电桩编号 {station.StationId} 已存在"; return false; } // 检查IP和端口是否已被使用 if (chargeStations.Any(s => s.IpAddress == station.IpAddress && s.Port == station.Port)) { errorMessage = $"IP地址 {station.IpAddress}:{station.Port} 已被使用"; return false; } if (chargeStations.Any(s => s.SiteId == station.SiteId)) { errorMessage = $"SiteID {station.SiteId} 已被使用"; return false; } station.CreatedTime = DateTime.Now; station.ModifiedTime = DateTime.Now; chargeStations.Add(station); if (SaveData()) { Diagnosis.Log($"添加充电桩成功: {station}", "ChargeStation", true); errorMessage = string.Empty; return true; } else { chargeStations.Remove(station); errorMessage = "保存数据失败"; return false; } } } /// /// 更新充电桩 /// public bool UpdateStation(ChargeStation station, out string errorMessage, bool isSave = false) { if (station == null) { errorMessage = "充电桩数据不能为空"; return false; } // 验证数据 if (!station.IsValid(out errorMessage)) { return false; } lock (lockObj) { var existingStation = chargeStations.FirstOrDefault(s => s.StationId == station.StationId); if (existingStation == null) { errorMessage = $"充电桩编号 {station.StationId} 不存在"; return false; } // 检查IP和端口是否与其他充电桩冲突 if (chargeStations.Any(s => s.StationId != station.StationId && s.IpAddress == station.IpAddress && s.Port == station.Port)) { errorMessage = $"IP地址 {station.IpAddress}:{station.Port} 已被其他充电桩使用"; return false; } if (chargeStations.Any(s => s.StationId != station.StationId && s.SiteId == station.SiteId)) { errorMessage = $"SiteID {station.SiteId} 已被使用"; return false; } // 保留创建时间 station.CreatedTime = existingStation.CreatedTime; station.ModifiedTime = DateTime.Now; var index = chargeStations.IndexOf(existingStation); //进行赋值 if (isSave) { existingStation.StationId = station.StationId; existingStation.Name = station.Name; existingStation.Type = station.Type; existingStation.ChargeMethod = station.ChargeMethod; existingStation.IpAddress = station.IpAddress; existingStation.Port = station.Port; existingStation.SetVoltage = station.SetVoltage; existingStation.SetElectricCurrent = station.SetElectricCurrent; existingStation.Enabled = station.Enabled; existingStation.ShieldSiteMechanismStatus = station.ShieldSiteMechanismStatus; existingStation.GroupCarType = station.GroupCarType; existingStation.SiteId = station.SiteId; existingStation.Remarks = station.Remarks; station = existingStation; station.ModifiedTime = DateTime.Now; } chargeStations[index] = station; if (SaveData()) { //Diagnosis.Log($"更新充电桩成功: {station}", "ChargeStation", true); errorMessage = string.Empty; return true; } else { chargeStations[index] = existingStation; errorMessage = "保存数据失败"; return false; } } } /// /// 删除充电桩 /// public bool DeleteStation(string stationId, out string errorMessage) { lock (lockObj) { var station = chargeStations.FirstOrDefault(s => s.StationId == stationId); if (station == null) { errorMessage = $"充电桩编号 {stationId} 不存在"; return false; } // 检查是否正在充电 //if (station.Status == ChargeStationStatus.Charging) //{ // errorMessage = $"充电桩 {station.Name} 正在充电中,无法删除"; // return false; //} chargeStations.Remove(station); if (SaveData()) { Diagnosis.Log($"删除充电桩成功: {station}", "ChargeStation", true); errorMessage = string.Empty; return true; } else { chargeStations.Add(station); errorMessage = "保存数据失败"; return false; } } } /// /// 更新充电桩状态 /// public bool UpdateStationStatus(string stationId, ChargeStationStatus status) { lock (lockObj) { var station = chargeStations.FirstOrDefault(s => s.StationId == stationId); if (station == null) { return false; } station.Status = status; station.ModifiedTime = DateTime.Now; return SaveData(); } } /// /// 获取空闲的充电桩 /// public List GetIdleStations() { lock (lockObj) { return chargeStations .Where(s => s.Enabled && s.Status == ChargeStationStatus.Idle) .ToList(); } } /// /// 获取充电中的充电桩数量 /// public int GetChargingCount() { lock (lockObj) { return chargeStations.Count(s => s.Status == ChargeStationStatus.Charging); } } /// /// 重新加载数据 /// public void Reload() { LoadData(); } } }