using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using MessageBox = System.Windows.MessageBox;
namespace CopyRou
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
private readonly IFileService _fileService;
private readonly ILogger _logger;
private AppConfig _config;
private bool _isProcessing = false;
public MainWindow()
{
InitializeComponent();
_fileService = new FileService();
_logger = new Logger();
_config = AppConfig.Load();
InitializeUI();
SubscribeToEvents();
}
private void InitializeUI()
{
// 加载配置到UI
SourcePathsTextBox.Text = _config.GetSourcePathsText();
DestPathTextBox.Text = _config.DestPath;
// 设置初始状态
StartButton.IsEnabled = true;
ProgressBar.Value = 0;
}
private void SubscribeToEvents()
{
// 订阅日志事件
_logger.MessageLogged += (sender, message) =>
{
Dispatcher.Invoke(() =>
{
LogTextBox.AppendText(message + Environment.NewLine);
LogTextBox.ScrollToEnd();
});
};
}
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
if (_isProcessing)
return;
var codesText = CodesTextBox.Text;
if (string.IsNullOrWhiteSpace(codesText))
{
System.Windows.MessageBox.Show("请输入要处理的料号", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
var sourcePaths = GetSourcePaths();
if (!sourcePaths.Any())
{
System.Windows.MessageBox.Show("请至少配置一个源路径", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
var destPath = DestPathTextBox.Text;
if (string.IsNullOrWhiteSpace(destPath))
{
System.Windows.MessageBox.Show("请配置目标路径", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
_isProcessing = true;
StartButton.IsEnabled = false;
ProgressBar.Value = 0;
LogTextBox.Clear();
try
{
_logger.Log("=== 开始处理 ===");
_logger.Log($"源路径: {string.Join(", ", sourcePaths)}");
_logger.Log($"目标路径: {destPath}");
var materialNumbers = codesText.Split(new[] { Environment.NewLine, "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)
.ToList();
var progress = new Progress(value =>
{
ProgressBar.Value = value;
});
await _fileService.ProcessCodes(materialNumbers, sourcePaths, destPath, progress, _logger);
_logger.Log("=== 处理完成 ===");
System.Windows.MessageBox.Show("处理完成!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
_logger.LogError($"处理过程中发生错误: {ex.Message}");
System.Windows.MessageBox.Show($"处理过程中发生错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
_isProcessing = false;
StartButton.IsEnabled = true;
}
}
private void ClearButton_Click(object sender, RoutedEventArgs e)
{
CodesTextBox.Clear();
LogTextBox.Clear();
ProgressBar.Value = 0;
}
private void SaveConfigButton_Click(object sender, RoutedEventArgs e)
{
_config.SetSourcePathsFromText(SourcePathsTextBox.Text);
_config.DestPath = DestPathTextBox.Text;
_config.Save();
System.Windows.MessageBox.Show("配置已保存", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void AddSourceButton_Click(object sender, RoutedEventArgs e)
{
var dialog = new System.Windows.Forms.FolderBrowserDialog();
dialog.Description = "选择源路径";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var currentPaths = GetSourcePaths();
if (!currentPaths.Contains(dialog.SelectedPath))
{
currentPaths.Add(dialog.SelectedPath);
SourcePathsTextBox.Text = string.Join(Environment.NewLine, currentPaths);
}
}
}
private void BrowseDestButton_Click(object sender, RoutedEventArgs e)
{
var dialog = new System.Windows.Forms.FolderBrowserDialog();
dialog.Description = "选择目标路径";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
DestPathTextBox.Text = dialog.SelectedPath;
}
}
private List GetSourcePaths()
{
var paths = new List();
if (!string.IsNullOrWhiteSpace(SourcePathsTextBox.Text))
{
paths = SourcePathsTextBox.Text.Split(new[] { Environment.NewLine, "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)
.Select(p => p.Trim())
.Where(p => !string.IsNullOrEmpty(p))
.ToList();
}
return paths;
}
private void SingleCodeTextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Enter)
{
ProcessSingleCode();
}
}
private async void AddSingleCodeButton_Click(object sender, RoutedEventArgs e)
{
await ProcessSingleCodeAsync();
}
private void ProcessSingleCode()
{
if (_isProcessing)
return;
var code = SingleCodeTextBox.Text.Trim();
if (string.IsNullOrWhiteSpace(code))
{
System.Windows.MessageBox.Show("请输入要处理的料号", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
// 异步处理单个料号
_ = ProcessSingleCodeAsync();
}
private async Task ProcessSingleCodeAsync()
{
if (_isProcessing)
return;
var code = SingleCodeTextBox.Text.Trim();
if (string.IsNullOrWhiteSpace(code))
{
System.Windows.MessageBox.Show("请输入要处理的料号", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
var sourcePaths = GetSourcePaths();
if (!sourcePaths.Any())
{
System.Windows.MessageBox.Show("请至少配置一个源路径", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
var destPath = DestPathTextBox.Text;
if (string.IsNullOrWhiteSpace(destPath))
{
System.Windows.MessageBox.Show("请配置目标路径", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
_isProcessing = true;
AddSingleCodeButton.IsEnabled = false;
SingleCodeTextBox.IsEnabled = false;
try
{
_logger.Log($"=== 开始处理单个料号: {code} ===");
_logger.Log($"源路径: {string.Join(", ", sourcePaths)}");
_logger.Log($"目标路径: {destPath}");
var materialNumbers = new List { code };
// 创建一个简单的进度报告器,单个料号处理时直接设置为100%
var progress = new Progress(value =>
{
// 对于单个料号,我们可以直接设置进度条
ProgressBar.Value = value;
});
await _fileService.ProcessCodes(materialNumbers, sourcePaths, destPath, progress, _logger);
_logger.Log("=== 单个料号处理完成 ===");
// 清空输入框
SingleCodeTextBox.Clear();
// 将焦点返回到输入框,方便继续输入
SingleCodeTextBox.Focus();
}
catch (Exception ex)
{
_logger.LogError($"处理单个料号时发生错误: {ex.Message}");
System.Windows.MessageBox.Show($"处理单个料号时发生错误: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
_isProcessing = false;
AddSingleCodeButton.IsEnabled = true;
SingleCodeTextBox.IsEnabled = true;
}
}
protected override void OnClosed(EventArgs e)
{
// 自动保存配置
_config.SetSourcePathsFromText(SourcePathsTextBox.Text);
_config.DestPath = DestPathTextBox.Text;
_config.Save();
base.OnClosed(e);
}
}
}