更改初版
This commit is contained in:
@@ -11,8 +11,10 @@ using Prism.Mvvm;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Documents;
|
||||
|
||||
@@ -68,6 +70,9 @@ namespace OrpaonEMS.App.Services
|
||||
ListEnergyStoragePeakValleyTimeConfig = FreeSql.Select<PeakValleyConfig>().ToList();
|
||||
//削峰填谷模式的时间监视线程
|
||||
var ListenPeakValleyTimeTaskInfo = Task.Run(() => ListenPeakValleyTimeCycle());
|
||||
|
||||
//加载控制参数配置
|
||||
LoadControlConfigValue();
|
||||
}
|
||||
|
||||
|
||||
@@ -427,5 +432,421 @@ namespace OrpaonEMS.App.Services
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 控制参数配置
|
||||
|
||||
/// <summary>
|
||||
/// 控制参数配置文件路径
|
||||
/// </summary>
|
||||
private readonly string _controlConfigFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "ControlConfigValue.json");
|
||||
|
||||
/// <summary>
|
||||
/// 控制参数配置值
|
||||
/// </summary>
|
||||
public ControlConfigValue ControlConfigValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 加载控制参数配置
|
||||
/// </summary>
|
||||
/// <returns>返回加载结果,true表示成功,false表示失败</returns>
|
||||
public bool LoadControlConfigValue()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 确保目录存在
|
||||
string directory = Path.GetDirectoryName(_controlConfigFilePath);
|
||||
if (!Directory.Exists(directory))
|
||||
{
|
||||
Directory.CreateDirectory(directory);
|
||||
LogService.Info($"创建配置目录: {directory}");
|
||||
}
|
||||
|
||||
// 检查文件是否存在
|
||||
if (File.Exists(_controlConfigFilePath))
|
||||
{
|
||||
// 读取JSON文件内容
|
||||
string jsonContent = File.ReadAllText(_controlConfigFilePath, Encoding.UTF8);
|
||||
|
||||
// 检查文件是否为空或只包含空对象
|
||||
if (string.IsNullOrWhiteSpace(jsonContent) || jsonContent.Trim() == "{}" || jsonContent.Trim() == "{\r\n \r\n}")
|
||||
{
|
||||
// 文件为空,创建默认配置
|
||||
LogService.Info("控制参数配置文件为空,创建默认配置");
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
SaveControlConfigValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 反序列化JSON到对象
|
||||
var options = new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true,
|
||||
WriteIndented = true,
|
||||
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
||||
};
|
||||
|
||||
ControlConfigValue = JsonSerializer.Deserialize<ControlConfigValue>(jsonContent, options);
|
||||
|
||||
// 验证反序列化结果
|
||||
if (ControlConfigValue == null)
|
||||
{
|
||||
LogService.Warn("控制参数配置反序列化失败,使用默认配置");
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
SaveControlConfigValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
LogService.Info("成功加载控制参数配置");
|
||||
|
||||
// 兼容键名末尾带空格的 SelectedDisChargeModel
|
||||
try
|
||||
{
|
||||
using (var doc = JsonDocument.Parse(jsonContent))
|
||||
{
|
||||
var root = doc.RootElement;
|
||||
if (root.TryGetProperty("SelectedDisChargeModel ", out var selectedProp))
|
||||
{
|
||||
if (selectedProp.ValueKind == JsonValueKind.Number)
|
||||
{
|
||||
ControlConfigValue.SelectedDisChargeModel = selectedProp.GetInt32();
|
||||
}
|
||||
else if (selectedProp.ValueKind == JsonValueKind.String && int.TryParse(selectedProp.GetString(), out var selInt))
|
||||
{
|
||||
ControlConfigValue.SelectedDisChargeModel = selInt;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogService.Warn($"SelectedDisChargeModel(带空格) 兼容解析失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 文件不存在,创建默认配置
|
||||
LogService.Info($"控制参数配置文件不存在,创建默认配置: {_controlConfigFilePath}");
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
SaveControlConfigValue();
|
||||
}
|
||||
|
||||
// 兼容旧配置:确保 DisChargeModel 非空,并在为空列表时注入默认项
|
||||
if (ControlConfigValue != null)
|
||||
{
|
||||
if (ControlConfigValue.DisChargeModel == null)
|
||||
{
|
||||
ControlConfigValue.DisChargeModel = new List<DisChargeModelItem>();
|
||||
}
|
||||
if (ControlConfigValue.DisChargeModel.Count == 0)
|
||||
{
|
||||
ControlConfigValue.DisChargeModel.Add(new DisChargeModelItem { Model = 1, DisChargeTime = "08:00" });
|
||||
ControlConfigValue.DisChargeModel.Add(new DisChargeModelItem { Model = 2, DisChargeTime = "11:00" });
|
||||
if (ControlConfigValue.SelectedDisChargeModel <= 0)
|
||||
{
|
||||
ControlConfigValue.SelectedDisChargeModel = 1;
|
||||
}
|
||||
// 保存注入的默认配置
|
||||
SaveControlConfigValue();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (JsonException jsonEx)
|
||||
{
|
||||
// JSON解析错误
|
||||
LogService.Error($"控制参数配置JSON解析错误: {jsonEx.Message}");
|
||||
LogService.Error($"异常堆栈: {jsonEx.StackTrace}");
|
||||
|
||||
// 使用默认配置
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
|
||||
// 尝试备份损坏的文件
|
||||
try
|
||||
{
|
||||
if (File.Exists(_controlConfigFilePath))
|
||||
{
|
||||
string backupPath = $"{_controlConfigFilePath}.backup_{DateTime.Now:yyyyMMddHHmmss}";
|
||||
File.Copy(_controlConfigFilePath, backupPath, true);
|
||||
LogService.Info($"已备份损坏的配置文件到: {backupPath}");
|
||||
}
|
||||
}
|
||||
catch (Exception backupEx)
|
||||
{
|
||||
LogService.Error($"备份损坏的配置文件失败: {backupEx.Message}");
|
||||
}
|
||||
|
||||
// 保存默认配置
|
||||
SaveControlConfigValue();
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 其他异常
|
||||
LogService.Error($"加载控制参数配置时发生异常: {ex.Message}");
|
||||
LogService.Error($"异常类型: {ex.GetType().Name}");
|
||||
LogService.Error($"异常堆栈: {ex.StackTrace}");
|
||||
|
||||
// 使用默认配置
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存控制参数配置
|
||||
/// </summary>
|
||||
/// <returns>返回保存结果,true表示成功,false表示失败</returns>
|
||||
public bool SaveControlConfigValue()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 验证配置对象
|
||||
if (ControlConfigValue == null)
|
||||
{
|
||||
LogService.Error("控制参数配置对象为空,无法保存");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 确保目录存在
|
||||
string directory = Path.GetDirectoryName(_controlConfigFilePath);
|
||||
if (!Directory.Exists(directory))
|
||||
{
|
||||
Directory.CreateDirectory(directory);
|
||||
LogService.Info($"创建配置目录: {directory}");
|
||||
}
|
||||
|
||||
// 序列化对象到JSON
|
||||
var options = new JsonSerializerOptions
|
||||
{
|
||||
WriteIndented = true,
|
||||
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
||||
};
|
||||
|
||||
string jsonContent = JsonSerializer.Serialize(ControlConfigValue, options);
|
||||
|
||||
// 写入文件前先写入临时文件
|
||||
string tempFilePath = $"{_controlConfigFilePath}.tmp";
|
||||
File.WriteAllText(tempFilePath, jsonContent, Encoding.UTF8);
|
||||
|
||||
// 验证临时文件是否写入成功
|
||||
if (File.Exists(tempFilePath))
|
||||
{
|
||||
// 备份原文件(如果存在)
|
||||
if (File.Exists(_controlConfigFilePath))
|
||||
{
|
||||
string backupPath = $"{_controlConfigFilePath}.bak";
|
||||
File.Copy(_controlConfigFilePath, backupPath, true);
|
||||
}
|
||||
|
||||
// 用临时文件替换原文件
|
||||
File.Copy(tempFilePath, _controlConfigFilePath, true);
|
||||
File.Delete(tempFilePath);
|
||||
|
||||
LogService.Info($"成功保存控制参数配置到: {_controlConfigFilePath}");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LogService.Error("临时配置文件写入失败");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (IOException ioEx)
|
||||
{
|
||||
// 文件IO异常
|
||||
LogService.Error($"保存控制参数配置时发生IO异常: {ioEx.Message}");
|
||||
LogService.Error($"异常堆栈: {ioEx.StackTrace}");
|
||||
return false;
|
||||
}
|
||||
catch (JsonException jsonEx)
|
||||
{
|
||||
// JSON序列化异常
|
||||
LogService.Error($"控制参数配置JSON序列化错误: {jsonEx.Message}");
|
||||
LogService.Error($"异常堆栈: {jsonEx.StackTrace}");
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 其他异常
|
||||
LogService.Error($"保存控制参数配置时发生异常: {ex.Message}");
|
||||
LogService.Error($"异常类型: {ex.GetType().Name}");
|
||||
LogService.Error($"异常堆栈: {ex.StackTrace}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新控制参数配置的值并保存
|
||||
/// </summary>
|
||||
/// <param name="configValue">要更新的控制参数配置对象</param>
|
||||
/// <returns>返回更新结果,true表示成功,false表示失败</returns>
|
||||
public bool UpdateControlConfigValue(ControlConfigValue configValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (configValue == null)
|
||||
{
|
||||
LogService.Error("传入的控制参数配置对象为空");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 更新配置值
|
||||
ControlConfigValue.SolarToEsAsFullSoc = configValue.SolarToEsAsFullSoc;
|
||||
ControlConfigValue.Master_ToSlaveByMasterSoc = configValue.Master_ToSlaveByMasterSoc;
|
||||
ControlConfigValue.Master_ToSlaveBySlaveSoc = configValue.Master_ToSlaveBySlaveSoc;
|
||||
ControlConfigValue.Master_SolarToSlaveEsFullByMasterSoc = configValue.Master_SolarToSlaveEsFullByMasterSoc;
|
||||
ControlConfigValue.Slave_ToMasterBySlaveSoc = configValue.Slave_ToMasterBySlaveSoc;
|
||||
ControlConfigValue.Slave_ToMasterByMasterSoc = configValue.Slave_ToMasterByMasterSoc;
|
||||
ControlConfigValue.Slave_SolarToMasterEsFullBySlaverSoc = configValue.Slave_SolarToMasterEsFullBySlaverSoc;
|
||||
ControlConfigValue.NightMaster_ToMasterFullSoc = configValue.NightMaster_ToMasterFullSoc;
|
||||
ControlConfigValue.NightSlave_ToSlaveFullSoc = configValue.NightSlave_ToSlaveFullSoc;
|
||||
|
||||
// 保存到文件
|
||||
bool saveResult = SaveControlConfigValue();
|
||||
|
||||
if (saveResult)
|
||||
{
|
||||
LogService.Info("成功更新并保存控制参数配置");
|
||||
}
|
||||
else
|
||||
{
|
||||
LogService.Error("更新控制参数配置后保存失败");
|
||||
}
|
||||
|
||||
return saveResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogService.Error($"更新控制参数配置时发生异常: {ex.Message}");
|
||||
LogService.Error($"异常堆栈: {ex.StackTrace}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取放电时间配置集合
|
||||
/// </summary>
|
||||
/// <returns>放电时间配置列表(永不返回 null)</returns>
|
||||
public List<DisChargeModelItem> GetDisChargeModel()
|
||||
{
|
||||
if (ControlConfigValue == null)
|
||||
{
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
}
|
||||
|
||||
if (ControlConfigValue.DisChargeModel == null)
|
||||
{
|
||||
ControlConfigValue.DisChargeModel = new List<DisChargeModelItem>();
|
||||
}
|
||||
|
||||
return ControlConfigValue.DisChargeModel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存放电时间配置集合
|
||||
/// </summary>
|
||||
/// <param name="items">放电时间配置列表</param>
|
||||
/// <returns>保存结果</returns>
|
||||
public bool SaveDisChargeModel(List<DisChargeModelItem> items)
|
||||
{
|
||||
if (ControlConfigValue == null)
|
||||
{
|
||||
ControlConfigValue = new ControlConfigValue();
|
||||
}
|
||||
|
||||
// 基础校验
|
||||
var list = items ?? new List<DisChargeModelItem>();
|
||||
foreach (var it in list)
|
||||
{
|
||||
if (it == null)
|
||||
{
|
||||
LogService.Error("DisChargeModel 中存在空项");
|
||||
return false;
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(it.DisChargeTime))
|
||||
{
|
||||
LogService.Error("DisChargeModel.DisChargeTime 为空");
|
||||
return false;
|
||||
}
|
||||
if (!TimeSpan.TryParse(it.DisChargeTime, out _))
|
||||
{
|
||||
LogService.Error($"DisChargeModel.DisChargeTime 格式非法: {it.DisChargeTime},期望 HH:mm");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ControlConfigValue.DisChargeModel = list;
|
||||
return SaveControlConfigValue();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 时间上是否可以放电
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsTimeCanDischarge()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 确保配置加载
|
||||
if (ControlConfigValue == null)
|
||||
{
|
||||
LoadControlConfigValue();
|
||||
}
|
||||
|
||||
// 获取放电时间集合(内部已保证非 null)
|
||||
var list = GetDisChargeModel();
|
||||
|
||||
// 选中模式 Id(缺省=1)
|
||||
int selectedId = 1;
|
||||
try
|
||||
{
|
||||
selectedId = ControlConfigValue?.SelectedDisChargeModel ?? 1;
|
||||
}
|
||||
catch { selectedId = 1; }
|
||||
|
||||
// 查找选中项,找不到回退第一项
|
||||
DisChargeModelItem selected = null;
|
||||
if (list != null && list.Count > 0)
|
||||
{
|
||||
foreach (var it in list)
|
||||
{
|
||||
if (it != null && it.Model == selectedId)
|
||||
{
|
||||
selected = it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (selected == null)
|
||||
{
|
||||
selected = list[0];
|
||||
}
|
||||
}
|
||||
|
||||
// 解析时间(HH:mm),失败回退 08:00
|
||||
TimeSpan target;
|
||||
if (selected != null && !string.IsNullOrWhiteSpace(selected.DisChargeTime) && TimeSpan.TryParse(selected.DisChargeTime, out target))
|
||||
{
|
||||
return DateTime.Now.TimeOfDay >= target;
|
||||
}
|
||||
else
|
||||
{
|
||||
LogService.Warn("IsTimeCanDischarge: 配置时间缺失或格式非法,使用默认 08:00 进行比较");
|
||||
target = new TimeSpan(8, 0, 0);
|
||||
return DateTime.Now.TimeOfDay >= target;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogService.Error($"IsTimeCanDischarge 执行失败: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user