using Microsoft.WindowsAPICodePack.Dialogs; using Panuon.WPF.UI; using SWRIS.Dtos; using SWRIS.Extensions; using SWRIS.Models.ViewModel; using SWRIS.Repository; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace SWRIS.Pages { /// /// RecordPage.xaml 的交互逻辑 /// public partial class RecordPage : Page { private readonly IRecordRepository _recordRepository; public RecordViewModel ViewModel { get; set; } = new RecordViewModel(); public RecordPage() { _recordRepository = new RecordRepository(); InitializeComponent(); BindTable(); DataContext = this; } void BindTable() { var records = _recordRepository.GetRecords(ViewModel.SearchInput.RopeNumber, ViewModel.SearchInput.StartTime, ViewModel.SearchInput.EndTime, ViewModel.SearchInput.RiskLevel, ViewModel.SearchInput.Limit, ViewModel.SearchInput.Offset, true); ViewModel.IsAllSelected = false; ViewModel.Records = new ObservableCollection(records); } private void Search_Click(object sender, RoutedEventArgs e) { BindTable(); } private void Report_Click(object sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is RecordDto record) { int reportedCount = Report(new List { record }); if (reportedCount > 0) { NoticeBox.Show("报告生成成功", "通知", MessageBoxIcon.Success, true, 2000); } else if (reportedCount == 0) { NoticeBox.Show("报告生成失败", "通知", MessageBoxIcon.Error, true, 5000); } } } private int Report(List records) { string reportPath = SelectExportFolder(); if (string.IsNullOrEmpty(reportPath)) { return -1; } return ExportMultipleReports(records, reportPath); } private int Export(List records) { string reportPath = SelectExportFolder(initialDirectory: "钢丝绳检测数据"); if (string.IsNullOrEmpty(reportPath)) { return -1; } return ExportMultipleRecords(records, reportPath); } private void Export_Click(object sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is RecordDto record) { int exportedCount = Export(new List { record }); if (exportedCount > 0) { NoticeBox.Show("记录导出成功", "通知", MessageBoxIcon.Success, true, 2000); } else if (exportedCount == 0) { NoticeBox.Show("记录导出失败", "通知", MessageBoxIcon.Error, true, 5000); } } } private void RecordDataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left && sender is DataGrid dataGrid && dataGrid.SelectedItem != null) { var selectedItem = dataGrid.SelectedItem as RecordDto; // 获取当前选中行的数据 (Application.Current.MainWindow as MainWindow).NavigatePage(new Uri($"Pages/DamagesPage.xaml?id=" + selectedItem.Id, uriKind: UriKind.Relative)); } } private void Delete_Click(object sender, RoutedEventArgs e) { if (sender is Button button) { int id = (int)button.Tag; var result = MessageBoxX.Show(Application.Current.MainWindow, "此操作不可恢复,是否确认删除记录?", "警告", MessageBoxButton.YesNo, MessageBoxIcon.Warning, DefaultButton.YesOK); if (result == MessageBoxResult.Yes) { var effect = _recordRepository.DeleteRecord(id); if (effect) { var deletedRecord = ViewModel.Records.FirstOrDefault(x => x.Id == id); if (deletedRecord != null) { ViewModel.Records.Remove(deletedRecord); DatFileHandler.DeleteDatFile(deletedRecord.DataFilePath); } NoticeBox.Show("记录删除成功", "通知", MessageBoxIcon.Success, true, 5000); } else { NoticeBox.Show("记录删除失败", "通知", MessageBoxIcon.Error, true, 5000); } } } } private int Delete(int[] recordIds) { var result = MessageBoxX.Show(Application.Current.MainWindow, "此操作不可恢复,是否确认删除记录?", "警告", MessageBoxButton.YesNo, MessageBoxIcon.Warning, DefaultButton.YesOK); if (result == MessageBoxResult.Yes) { return _recordRepository.DeleteRecords(recordIds); } return 0; } private void Batch_Report(object sender, RoutedEventArgs e) { var records = ViewModel.Records.Where(c => c.IsSelected).ToList(); if (records.Any()) { int reportCount = Report(records); if (reportCount > 0) { Application.Current.Dispatcher.Invoke(() => { NoticeBox.Show($"检测报告文件{(reportCount > 1 ? $"({reportCount})条" : "")}已生成成功", "通知", MessageBoxIcon.Success, true, 5000); }); } } else { MessageBoxX.Show(Application.Current.MainWindow, "请选择要生成报告的检测记录", "通知", MessageBoxButton.OK, MessageBoxIcon.Info, DefaultButton.YesOK); } } private void Batch_Delete(object sender, RoutedEventArgs e) { var records = ViewModel.Records.Where(c => c.IsSelected).ToList(); if (records.Any()) { int[] recordIds = records.Select(x => (int)x.Id).ToArray(); int deletedCount = Delete(recordIds); if (deletedCount > 0) { foreach (var record in records) { ViewModel.Records.Remove(record); DatFileHandler.DeleteDatFile(record.DataFilePath); } Application.Current.Dispatcher.Invoke(() => { NoticeBox.Show($"检测记录{(recordIds.Length > 1 ? $"({recordIds.Length}条)" : "")}已成功删除", "通知", MessageBoxIcon.Success, true, 5000); }); } } else { MessageBoxX.Show(Application.Current.MainWindow, "请选择要删除的检测记录", "提醒", MessageBoxButton.OK, MessageBoxIcon.Info, DefaultButton.YesOK); } } private void Batch_Export(object sender, RoutedEventArgs e) { var records = ViewModel.Records.Where(c => c.IsSelected).ToList(); if (records.Any()) { int exportCount = Export(records); if (exportCount > 0) { Application.Current.Dispatcher.Invoke(() => { NoticeBox.Show($"检测数据文件{(exportCount > 1 ? $"({exportCount})条" : "")}已成功导出", "通知", MessageBoxIcon.Success, true, 5000); }); } } else { MessageBoxX.Show(Application.Current.MainWindow, "请选择要导出的检测记录", "通知", MessageBoxButton.OK, MessageBoxIcon.Info, DefaultButton.YesOK); } } private string SelectExportFolder(string title = "选择文件夹", string initialDirectory = "钢丝绳检测报告") { using (var dialog = new CommonOpenFileDialog()) { dialog.Title = title; dialog.IsFolderPicker = true; dialog.EnsurePathExists = true; dialog.InitialDirectory = GetDefaultExportDirectory(initialDirectory); if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { return dialog.FileName; } } return null; } private int ExportMultipleReports(List records, string folderPath) { int savedCount = 0; string craneName = App.Config.Crane; // 按钢丝绳编号分组处理 var groupedRecords = records.OrderBy(r => r.RopeNumber).GroupBy(r => r.RopeNumber); foreach (var group in groupedRecords) { var equipment = App.Config.Equipments .FirstOrDefault(c => c.RopeNumber == group.Key); foreach (var record in group) { string fileName = GenerateReportFileName(record); string filePath = Path.Combine(folderPath, fileName); var export = new ReportPdfExporter(craneName, record, equipment); if (export.SavePdf(filePath)) { savedCount++; _recordRepository.AddRecordExportCount(record.Id.Value); } } } return savedCount; } private int ExportMultipleRecords(List records, string folderPath) { int exportedCount = 0; string craneName = App.Config.Crane; foreach (var record in records) { if (record != null && record.DataFilePath != null) { var damageData = DatFileHandler.ReadDatFile(record.DataFilePath); if ((damageData?.Length ?? 0) > 0) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(record.DataFilePath); string directroyName = Path.Combine(folderPath, fileNameWithoutExtension); Directory.CreateDirectory(directroyName); string datFileName = Path.Combine(directroyName, "data.dat"); File.WriteAllBytes(datFileName, damageData); string txtFileName = Path.Combine(directroyName, "info.txt"); File.WriteAllText(txtFileName, $"钢丝绳:{record.RopeName}\r\n" + $"起始位置:{record.StartPoint}\r\n" + $"结束位置:{record.EndPoint}\r\n" + $"检测长度:{record.DetectionLength}\r\n" + $"损伤数量:{record.DamageCount}处\r\n" + $"-------------------------------------------\r\n" + $"{string.Join("", record.Damages.Select(c => $"位置:{c.DamagePoint},损伤值:{c.DamageValue}\r\n"))}", Encoding.UTF8); exportedCount++; } } } return exportedCount; } private string GetDefaultExportDirectory(string folderName = "钢丝绳检测报告") { string docsPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), folderName, DateTime.Now.ToString("yyyy-MM")); // 确保目录存在 try { Directory.CreateDirectory(docsPath); return docsPath; } catch { // 失败时返回桌面 return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); } } private string GenerateReportFileName(RecordDto record) { // 清理文件名中的非法字符 string ropeName = CleanFileName(record.RopeName); string time = record.EndTime.ToString("yyyyMMdd_HHmmss"); return $"{ropeName}_{time}_检测报告.pdf"; } private string CleanFileName(string fileName) { if (string.IsNullOrEmpty(fileName)) return "未知"; // 移除非法字符 char[] invalidChars = Path.GetInvalidFileNameChars(); foreach (char c in invalidChars) { fileName = fileName.Replace(c, '_'); } // 限制长度 if (fileName.Length > 50) { fileName = fileName.Substring(0, 50); } return fileName.Trim(); } } }