using HMI.UI.Util;
using Panuon.WPF.UI;
using Plugin.DeviceConfig.Entity;
using Plugin.DeviceConfig.Model;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
namespace Plugin.DeviceConfig
{
///
/// VersionManageModal.xaml 的交互逻辑
///
public partial class VersionManageModal : WindowX
{
private DeviceConfigModel _model;
private ObservableCollection _versions = new();
private bool _changed;
public VersionManageModal()
{
DataContext = this;
InitializeComponent();
}
///
/// 打开弹窗
///
public bool? Open(DeviceConfigModel model)
{
_model = model;
versionListView.ItemsSource = _versions;
LoadVersions();
return ShowDialog();
}
private void LoadVersions()
{
try
{
var list = _model.GetConfigVersions();
_versions.Clear();
foreach (var v in list)
{
_versions.Add(new VersionDisplayItem
{
VersionId = v.VersionId,
Status = v.Status,
Hash = v.Hash,
HashShort = v.Hash.Length > 16 ? v.Hash.Substring(0, 16) + "..." : v.Hash,
Author = v.Author,
Timestamp = v.Timestamp,
DiffDescription = v.DiffDescription,
});
}
}
catch (Exception ex)
{
ToastHelper.Error($"加载版本列表失败: {ex.Message}");
}
}
#region 操作
private void PublishBtn_Click(object sender, RoutedEventArgs e)
{
try
{
var selected = versionListView.SelectedItem as VersionDisplayItem;
if (selected == null)
{
ToastHelper.Warning("请先选中一个版本");
return;
}
if (selected.Status != VersionStatus.Draft)
{
ToastHelper.Warning("只有 Draft 状态的版本可以发布");
return;
}
if (MsgBoxHelper.WarnMessage(this, $"确定要发布版本 [{selected.VersionId}] 吗?") != MessageBoxResult.OK)
return;
// 计算最新 Hash
var hash = _model.ComputeConfigHash();
selected.Hash = hash;
selected.HashShort = hash.Length > 16 ? hash.Substring(0, 16) + "..." : hash;
selected.Status = VersionStatus.Published;
selected.Timestamp = DateTime.Now;
var ver = new DeviceConfigVersion
{
VersionId = selected.VersionId,
Status = VersionStatus.Published,
Hash = hash,
Author = selected.Author,
Timestamp = DateTime.Now,
DiffDescription = selected.DiffDescription,
};
_model.SaveConfigVersion(ver);
_changed = true;
LoadVersions();
ToastHelper.Success($"版本 [{selected.VersionId}] 已发布");
}
catch (Exception ex)
{
ToastHelper.Error($"发布失败: {ex.Message}");
}
}
private void ApplyBtn_Click(object sender, RoutedEventArgs e)
{
try
{
var selected = versionListView.SelectedItem as VersionDisplayItem;
if (selected == null)
{
ToastHelper.Warning("请先选中一个版本");
return;
}
if (selected.Status != VersionStatus.Published)
{
ToastHelper.Warning("只有 Published 状态的版本可以应用");
return;
}
// 检查当前 Effective 版本
var currentEffective = _versions.FirstOrDefault(v => v.Status == VersionStatus.Effective);
if (currentEffective != null)
{
if (MsgBoxHelper.WarnMessage(this,
$"当前已有生效版本 [{currentEffective.VersionId}],应用新版本将替换它。\n是否继续?") != MessageBoxResult.OK)
{
return;
}
// 将原 Effective 改回 Published
_model.UpdateVersionStatus(currentEffective.VersionId, VersionStatus.Published.ToString());
}
if (MsgBoxHelper.WarnMessage(this, $"确定要将 [{selected.VersionId}] 设为生效版本吗?") != MessageBoxResult.OK)
return;
_model.UpdateVersionStatus(selected.VersionId, VersionStatus.Effective.ToString());
_changed = true;
LoadVersions();
ToastHelper.Success($"版本 [{selected.VersionId}] 已设为生效版本");
}
catch (Exception ex)
{
ToastHelper.Error($"应用版本失败: {ex.Message}");
}
}
private void DetailBtn_Click(object sender, RoutedEventArgs e)
{
try
{
var selected = versionListView.SelectedItem as VersionDisplayItem;
if (selected == null)
{
ToastHelper.Warning("请先选中一个版本");
return;
}
tbDetailHash.Text = selected.Hash;
tbDetailDiff.Text = selected.DiffDescription;
tbDetailAuthor.Text = $"{selected.Author} @ {selected.Timestamp:yyyy-MM-dd HH:mm:ss}";
detailPanel.Visibility = Visibility.Visible;
}
catch (Exception ex)
{
ToastHelper.Error($"加载详情失败: {ex.Message}");
}
}
private void RfhBtn_Click(object sender, RoutedEventArgs e)
{
LoadVersions();
ToastHelper.Success("已刷新");
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
DialogResult = _changed;
Close();
}
#endregion
}
///
/// 版本显示项
///
public class VersionDisplayItem
{
public string VersionId { get; set; } = string.Empty;
public VersionStatus Status { get; set; }
public string Hash { get; set; } = string.Empty;
public string HashShort { get; set; } = string.Empty;
public string Author { get; set; } = string.Empty;
public DateTime Timestamp { get; set; }
public string DiffDescription { get; set; } = string.Empty;
}
}