using CapMachine.Core;
using CapMachine.Wpf.PrismEvent;
using CapMachine.Wpf.Services;
using Microsoft.Win32;
using Prism.Commands;
using Prism.Events;
using Prism.Services.Dialogs;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
namespace CapMachine.Wpf.ViewModels
{
///
/// CAN/CANFD/LIN 配置导入导出弹窗 ViewModel。
///
public class DialogCanLinConfigImExportViewModel : DialogViewModel
{
///
/// 初始化导入导出弹窗。
///
/// 导入导出服务。
/// 事件聚合器。
public DialogCanLinConfigImExportViewModel(
CanLinConfigImExportService canLinConfigImExportService,
IEventAggregator eventAggregator)
{
CanLinConfigImExportService = canLinConfigImExportService;
EventAggregator = eventAggregator;
Title = "CAN/CANFD/LIN配置导入导出";
ImportModes = new ObservableCollection
{
new ImportModeOption { Text = "覆盖导入(同名同类型先删除后导入)", Mode = CanLinImportMode.Overwrite },
new ImportModeOption { Text = "增量导入(同名同类型自动重命名)", Mode = CanLinImportMode.IncrementalRename },
};
SelectedImportMode = ImportModes.FirstOrDefault();
}
///
/// 导入导出服务。
///
public CanLinConfigImExportService CanLinConfigImExportService { get; }
///
/// 事件聚合器。
///
public IEventAggregator EventAggregator { get; }
private string _importFilePath = string.Empty;
///
/// 导入文件路径。
///
public string ImportFilePath
{
get { return _importFilePath; }
set { _importFilePath = value; RaisePropertyChanged(); }
}
private ObservableCollection _importModes = new ObservableCollection();
///
/// 导入模式集合。
///
public ObservableCollection ImportModes
{
get { return _importModes; }
set { _importModes = value; RaisePropertyChanged(); }
}
private ImportModeOption? _selectedImportMode;
///
/// 当前选中的导入模式。
///
public ImportModeOption? SelectedImportMode
{
get { return _selectedImportMode; }
set { _selectedImportMode = value; RaisePropertyChanged(); }
}
private string _resultMessage = string.Empty;
///
/// 操作结果消息。
///
public string ResultMessage
{
get { return _resultMessage; }
set { _resultMessage = value; RaisePropertyChanged(); }
}
private DelegateCommand? _browseImportFileCmd;
///
/// 选择导入文件命令。
///
public DelegateCommand BrowseImportFileCmd
{
get
{
if (_browseImportFileCmd == null)
{
_browseImportFileCmd = new DelegateCommand(BrowseImportFile);
}
return _browseImportFileCmd;
}
}
private DelegateCommand? _importCmd;
///
/// 导入命令。
///
public DelegateCommand ImportCmd
{
get
{
if (_importCmd == null)
{
_importCmd = new DelegateCommand(ImportConfig);
}
return _importCmd;
}
}
private DelegateCommand? _exportCmd;
///
/// 导出命令。
///
public DelegateCommand ExportCmd
{
get
{
if (_exportCmd == null)
{
_exportCmd = new DelegateCommand(ExportConfig);
}
return _exportCmd;
}
}
private DelegateCommand? _closeCmd;
///
/// 关闭命令。
///
public DelegateCommand CloseCmd
{
get
{
if (_closeCmd == null)
{
_closeCmd = new DelegateCommand(CloseDialog);
}
return _closeCmd;
}
}
///
/// 打开文件选择框并选择导入文件。
///
private void BrowseImportFile()
{
try
{
var openFileDialog = new OpenFileDialog
{
Filter = "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*",
CheckFileExists = true,
CheckPathExists = true,
};
var ok = openFileDialog.ShowDialog();
if (ok == true)
{
ImportFilePath = openFileDialog.FileName;
}
}
catch (Exception ex)
{
MessageBox.Show($"选择导入文件失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
///
/// 执行配置导入。
///
private void ImportConfig()
{
try
{
if (string.IsNullOrWhiteSpace(ImportFilePath))
{
MessageBox.Show("请先选择导入文件", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (SelectedImportMode == null)
{
MessageBox.Show("请选择导入模式", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var result = CanLinConfigImExportService.ImportFromFile(ImportFilePath, SelectedImportMode.Mode);
ResultMessage = BuildResultText(result);
if (!result.IsSuccess)
{
MessageBox.Show(ResultMessage, "导入失败", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
EventAggregator.GetEvent().Publish("import");
EventAggregator.GetEvent().Publish("import");
MessageBox.Show(ResultMessage, "导入成功", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
ResultMessage = $"导入失败:{ex.Message}";
MessageBox.Show(ResultMessage, "导入失败", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
///
/// 执行配置导出。
///
private void ExportConfig()
{
try
{
var saveFileDialog = new SaveFileDialog
{
Filter = "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*",
DefaultExt = "json",
FileName = $"CanLinConfigExport_{DateTime.Now:yyyyMMddHHmmss}.json",
};
var ok = saveFileDialog.ShowDialog();
if (ok != true)
{
return;
}
var result = CanLinConfigImExportService.ExportToFile(saveFileDialog.FileName);
ResultMessage = BuildResultText(result);
if (!result.IsSuccess)
{
MessageBox.Show(ResultMessage, "导出失败", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
MessageBox.Show(ResultMessage, "导出成功", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
ResultMessage = $"导出失败:{ex.Message}";
MessageBox.Show(ResultMessage, "导出失败", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
///
/// 关闭弹窗。
///
private void CloseDialog()
{
RaiseRequestClose(new DialogResult(ButtonResult.Cancel));
}
///
/// 构建结果文本。
///
/// 执行结果。
/// 显示文本。
private static string BuildResultText(CanLinConfigImExportResult result)
{
var builder = new StringBuilder();
builder.AppendLine(result.Message);
if (result.RenamedConfigs != null && result.RenamedConfigs.Count > 0)
{
builder.AppendLine("重命名明细:");
foreach (var line in result.RenamedConfigs)
{
builder.AppendLine($"- {line}");
}
}
return builder.ToString();
}
///
/// 弹窗打开回调。
///
/// 弹窗参数。
public override void OnDialogOpened(IDialogParameters parameters)
{
ResultMessage = string.Empty;
}
///
/// 导入模式选项。
///
public class ImportModeOption
{
///
/// 文本。
///
public string Text { get; set; } = string.Empty;
///
/// 模式值。
///
public CanLinImportMode Mode { get; set; }
}
}
}