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();
}
}
}