using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using System.Windows.Input; using NavisworksTransport.UI.WPF.ViewModels; using NavisworksTransport.UI.WPF.Collections; using NavisworksTransport.Core; using NavisworksTransport.Utils; using NavisworksTransport.Commands; namespace NavisworksTransport.UI.WPF.ViewModels { /// /// 系统管理ViewModel - 处理插件系统管理功能 /// public class SystemManagementViewModel : ViewModelBase, IDisposable { #region 私有字段 private readonly UIStateManager _uiStateManager; // 系统管理相关字段 private bool _isAutoSaveEnabled = true; private bool _isDebugModeEnabled = false; // 网格可视化开关字段 private bool _showWalkableGrid = false; private bool _showObstacleGrid = false; private bool _showUnknownGrid = false; private ObservableCollection _logLevels; private string _selectedLogLevel = "Info"; private string _pluginVersion = "v1.0"; private string _navisworksVersion = "2026"; private string _memoryUsage = "0 MB"; private string _runningTime = "00:00:00"; // 🔧 修复:添加定时器字段以便在清理时停止 // 性能监控相关字段 (已改为Idle事件管理) private DateTime _lastPerformanceUpdate = DateTime.MinValue; private DateTime _startTime; // 🔧 修复:添加释放状态标志 private bool _disposed = false; #endregion #region 公共属性 /// /// 是否启用自动保存 /// public bool IsAutoSaveEnabled { get => _isAutoSaveEnabled; set => SetProperty(ref _isAutoSaveEnabled, value); } /// /// 是否启用调试模式 /// public bool IsDebugModeEnabled { get => _isDebugModeEnabled; set => SetProperty(ref _isDebugModeEnabled, value); } /// /// 是否显示可通行网格点 /// public bool ShowWalkableGrid { get => _showWalkableGrid; set { if (SetProperty(ref _showWalkableGrid, value)) { OnGridVisualizationChanged(); } } } /// /// 是否显示障碍物网格点 /// public bool ShowObstacleGrid { get => _showObstacleGrid; set { if (SetProperty(ref _showObstacleGrid, value)) { OnGridVisualizationChanged(); } } } /// /// 是否显示未知区域网格点 /// public bool ShowUnknownGrid { get => _showUnknownGrid; set { if (SetProperty(ref _showUnknownGrid, value)) { OnGridVisualizationChanged(); } } } /// /// 日志级别集合 /// public ObservableCollection LogLevels { get => _logLevels; set => SetProperty(ref _logLevels, value); } /// /// 选中的日志级别 /// public string SelectedLogLevel { get => _selectedLogLevel; set => SetProperty(ref _selectedLogLevel, value); } /// /// 插件版本 /// public string PluginVersion { get => _pluginVersion; set => SetProperty(ref _pluginVersion, value); } /// /// Navisworks版本 /// public string NavisworksVersion { get => _navisworksVersion; set => SetProperty(ref _navisworksVersion, value); } /// /// 内存使用情况 /// public string MemoryUsage { get => _memoryUsage; set => SetProperty(ref _memoryUsage, value); } /// /// 运行时间 /// public string RunningTime { get => _runningTime; set => SetProperty(ref _runningTime, value); } #endregion #region 命令 public ICommand ClearLogCommand { get; private set; } public ICommand ExportLogCommand { get; private set; } public ICommand ViewLogCommand { get; private set; } public ICommand OpenSettingsCommand { get; private set; } public ICommand ResetSettingsCommand { get; private set; } public ICommand ImportConfigCommand { get; private set; } public ICommand CheckUpdateCommand { get; private set; } public ICommand GeneratePerformanceReportCommand { get; private set; } public ICommand DiagnosticCommand { get; private set; } #endregion #region 构造函数 public SystemManagementViewModel() : base() { try { // 获取UI状态管理器实例 _uiStateManager = UIStateManager.Instance; // 验证关键组件是否正常初始化 if (_uiStateManager == null) { LogManager.Error("UIStateManager初始化失败"); throw new InvalidOperationException("UIStateManager初始化失败"); } // 初始化线程安全的集合 LogLevels = new ThreadSafeObservableCollection(); // 初始化命令 InitializeCommands(); // 初始化系统管理设置 InitializeSystemManagementSettingsAsync(); LogManager.Info("SystemManagementViewModel构造函数执行完成"); } catch (Exception ex) { LogManager.Error($"SystemManagementViewModel构造函数异常: {ex.Message}", ex); // 在构造函数中尽量保证对象处于可用状态 UpdateMainStatus("初始化失败,请检查日志"); throw; } } /// /// 带主ViewModel参数的构造函数,支持统一状态栏 /// /// 主ViewModel,用于统一状态栏 public SystemManagementViewModel(LogisticsControlViewModel mainViewModel) : base() { try { // 设置主ViewModel引用到基类 SetMainViewModel(mainViewModel); // 获取UI状态管理器实例 _uiStateManager = UIStateManager.Instance; // 验证关键组件是否正常初始化 if (_uiStateManager == null) { LogManager.Error("UIStateManager初始化失败"); throw new InvalidOperationException("UIStateManager初始化失败"); } // 初始化线程安全的集合 LogLevels = new ThreadSafeObservableCollection(); // 初始化命令 InitializeCommands(); // 初始化系统管理设置 InitializeSystemManagementSettingsAsync(); LogManager.Info("SystemManagementViewModel构造函数执行完成 - 支持统一状态栏"); } catch (Exception ex) { LogManager.Error($"SystemManagementViewModel构造函数异常: {ex.Message}", ex); // 在构造函数中尽量保证对象处于可用状态 UpdateMainStatus("初始化失败,请检查日志"); throw; } } #endregion #region 初始化 /// /// 初始化命令 /// private void InitializeCommands() { try { // 系统管理命令 ViewLogCommand = new RelayCommand(() => ExecuteViewLog()); ClearLogCommand = new RelayCommand(() => ExecuteClearLog()); ExportLogCommand = new RelayCommand(() => ExecuteExportLog()); OpenSettingsCommand = new RelayCommand(() => ExecuteOpenSettings()); ResetSettingsCommand = new RelayCommand(() => ExecuteResetSettings()); ImportConfigCommand = new RelayCommand(() => ExecuteImportConfig()); CheckUpdateCommand = new RelayCommand(() => ExecuteCheckUpdate()); GeneratePerformanceReportCommand = new RelayCommand(() => ExecuteGeneratePerformanceReport()); DiagnosticCommand = new RelayCommand(() => ExecuteDiagnostic()); LogManager.Info("系统管理命令初始化完成"); } catch (Exception ex) { LogManager.Error($"初始化命令失败: {ex.Message}", ex); throw; } } /// /// 网格可视化设置变更事件处理 /// private void OnGridVisualizationChanged() { try { LogManager.Info($"网格可视化设置已更改: 通行={ShowWalkableGrid}, 障碍物={ShowObstacleGrid}, 未知={ShowUnknownGrid}"); // 通知路径规划管理器更新网格可视化 var pathPlanningManager = GetPathPlanningManager(); if (pathPlanningManager != null) { // 应用新的可视化设置 pathPlanningManager.UpdateGridVisualizationSettings( showWalkable: ShowWalkableGrid, showObstacle: ShowObstacleGrid, showUnknown: ShowUnknownGrid); UpdateMainStatus("网格可视化设置已更新"); } else { LogManager.Warning("无法获取路径规划管理器,网格可视化设置可能不会立即生效"); UpdateMainStatus("网格可视化设置已保存"); } } catch (Exception ex) { LogManager.Error($"应用网格可视化设置失败: {ex.Message}", ex); UpdateMainStatus("网格可视化设置应用失败"); } } /// /// 获取路径规划管理器实例 /// /// 路径规划管理器或null private PathPlanningManager GetPathPlanningManager() { try { // 使用PathPlanningManager的静态方法获取活动实例 var pathManager = PathPlanningManager.GetActivePathManager(); if (pathManager != null) { LogManager.Info("成功获取到活动的PathPlanningManager实例"); return pathManager; } else { LogManager.Warning("当前没有活动的PathPlanningManager实例"); return null; } } catch (Exception ex) { LogManager.Error($"获取PathPlanningManager失败: {ex.Message}", ex); return null; } } /// /// 初始化系统管理设置 /// private async Task InitializeSystemManagementSettingsAsync() { await SafeExecuteAsync(async () => { await _uiStateManager.ExecuteUIUpdateAsync(() => { // 初始化日志级别 LogLevels.Clear(); var logLevels = new[] { "Debug", "Info", "Warning", "Error" }; foreach (var level in logLevels) { LogLevels.Add(level); } SelectedLogLevel = "Info"; // 初始化系统信息 PluginVersion = "v1.0"; NavisworksVersion = "2026"; UpdateMainStatus("系统管理初始化完成"); }); // 启动性能监控 StartPerformanceMonitoring(); LogManager.Info("系统管理设置初始化完成"); }, "初始化系统管理设置"); } /// /// 启动性能监控 (已优化为Idle事件) /// private void StartPerformanceMonitoring() { // 如果已经释放,不启动监控 if (_disposed) { LogManager.Info("SystemManagementViewModel已释放,跳过性能监控启动"); return; } _startTime = DateTime.Now; _lastPerformanceUpdate = DateTime.MinValue; // 使用IdleEventManager注册性能监控任务,替代DispatcherTimer const string taskId = "SystemManagement_PerformanceMonitor"; IdleEventManager.Instance.RegisterTask( taskId, UpdatePerformanceMetrics, // 要执行的操作 30000, // 30秒间隔 (毫秒) 5 // 中等优先级 ); LogManager.Info("SystemManagementViewModel性能监控已启动 (Idle事件模式)"); } /// /// 更新性能指标 (Idle事件回调方法) /// private void UpdatePerformanceMetrics() { try { // 检查释放状态,避免在释放后继续更新UI if (_disposed) { LogManager.Info("SystemManagementViewModel已释放,停止性能监控更新"); IdleEventManager.Instance.UnregisterTask("SystemManagement_PerformanceMonitor"); return; } // 更新内存使用 var process = System.Diagnostics.Process.GetCurrentProcess(); var memoryMB = process.WorkingSet64 / (1024 * 1024); MemoryUsage = $"{memoryMB} MB"; // 更新运行时间 var runTime = DateTime.Now - _startTime; RunningTime = $"{runTime.Hours:D2}:{runTime.Minutes:D2}:{runTime.Seconds:D2}"; // 记录上次更新时间 _lastPerformanceUpdate = DateTime.Now; LogManager.Debug($"性能指标已更新: 内存={MemoryUsage}, 运行时间={RunningTime}"); } catch (Exception ex) { LogManager.Error($"性能监控更新失败: {ex.Message}"); // 发生异常时停止监控,避免持续错误 if (!_disposed) { IdleEventManager.Instance.UnregisterTask("SystemManagement_PerformanceMonitor"); } } } #endregion #region 命令实现 /// /// 查看日志 /// private void ExecuteViewLog() { SafeExecute(() => { try { // 创建并显示日志查看器对话框 var logViewerDialog = new NavisworksTransport.UI.WPF.Views.LogViewerDialog(); // 尝试设置窗口所有者,使用更安全的方式 try { // 查找当前活动的主窗口 var mainWindow = System.Windows.Application.Current.MainWindow; if (mainWindow != null && mainWindow.IsLoaded) { logViewerDialog.Owner = mainWindow; } else { // 如果主窗口不可用,查找当前活动的窗口 foreach (System.Windows.Window window in System.Windows.Application.Current.Windows) { if (window.IsActive && window.IsLoaded) { logViewerDialog.Owner = window; break; } } } } catch (Exception ownerEx) { // 如果设置Owner失败,记录警告但继续显示窗口 LogManager.Warning($"设置日志查看器Owner失败: {ownerEx.Message}"); } // 显示对话框(使用Show而不是ShowDialog以避免阻塞) logViewerDialog.Show(); UpdateMainStatus("日志查看器已打开"); LogManager.Info("通过系统管理打开日志查看器"); } catch (Exception ex) { UpdateMainStatus("打开日志查看器失败"); LogManager.Error($"打开日志查看器失败: {ex.Message}", ex); // 显示错误消息给用户 System.Windows.MessageBox.Show($"打开日志查看器失败: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); } }, "查看日志"); } /// /// 清空日志 /// private void ExecuteClearLog() { SafeExecute(() => { try { // 弹出确认对话框 var result = System.Windows.MessageBox.Show( "确定要清空日志吗?此操作不可撤销。", "确认清空日志", System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Question); if (result == System.Windows.MessageBoxResult.Yes) { // 调用LogManager清空日志 LogManager.ClearLog(); UpdateMainStatus("日志已清空"); LogManager.Info("通过系统管理清空日志"); // 显示成功消息 System.Windows.MessageBox.Show("日志已成功清空。", "操作完成", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Information); } else { UpdateMainStatus("取消清空日志"); LogManager.Info("用户取消清空日志操作"); } } catch (Exception ex) { UpdateMainStatus("清空日志失败"); LogManager.Error($"清空日志失败: {ex.Message}", ex); // 显示错误消息给用户 System.Windows.MessageBox.Show($"清空日志失败: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); } }, "清空日志"); } /// /// 导出日志 /// private void ExecuteExportLog() { SafeExecute(() => { try { // 创建保存文件对话框 var saveFileDialog = new Microsoft.Win32.SaveFileDialog { Title = "导出日志文件", Filter = "日志文件 (*.log)|*.log|文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*", DefaultExt = "log", FileName = $"NavisworksTransport_Log_{DateTime.Now:yyyyMMdd_HHmmss}.log" }; if (saveFileDialog.ShowDialog() == true) { var logFilePath = LogManager.LogFilePath; if (System.IO.File.Exists(logFilePath)) { // 从源日志文件复制到目标位置 System.IO.File.Copy(logFilePath, saveFileDialog.FileName, true); UpdateMainStatus($"日志已导出到: {System.IO.Path.GetFileName(saveFileDialog.FileName)}"); LogManager.Info($"日志已导出到: {saveFileDialog.FileName}"); // 显示成功消息并询问是否打开文件夹 var result = System.Windows.MessageBox.Show( $"日志已成功导出到:\n{saveFileDialog.FileName}\n\n是否打开文件所在文件夹?", "导出完成", System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Information); if (result == System.Windows.MessageBoxResult.Yes) { // 打开文件所在文件夹并选中文件 System.Diagnostics.Process.Start("explorer.exe", $"/select,\"{saveFileDialog.FileName}\""); } } else { // 如果日志文件不存在,创建一个空的日志文件 System.IO.File.WriteAllText(saveFileDialog.FileName, $"NavisworksTransport 日志文件\n导出时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}\n\n日志文件为空或不存在。\n"); UpdateMainStatus("日志文件不存在,已创建空文件"); LogManager.Warning("日志文件不存在,已创建空的导出文件"); System.Windows.MessageBox.Show("原始日志文件不存在,已创建空的导出文件。", "注意", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning); } } else { UpdateMainStatus("取消导出日志"); LogManager.Info("用户取消导出日志操作"); } } catch (Exception ex) { UpdateMainStatus("导出日志失败"); LogManager.Error($"导出日志失败: {ex.Message}", ex); // 显示错误消息给用户 System.Windows.MessageBox.Show($"导出日志失败: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); } }, "导出日志"); } /// /// 打开设置 /// private void ExecuteOpenSettings() { SafeExecute(() => { // TODO: 实现设置对话框 UpdateMainStatus("打开插件设置"); LogManager.Info("打开设置"); }, "打开设置"); } /// /// 重置设置 /// private void ExecuteResetSettings() { SafeExecute(() => { // TODO: 实现设置重置功能 UpdateMainStatus("设置已重置为默认值"); IsAutoSaveEnabled = true; IsDebugModeEnabled = false; LogManager.Info("重置设置"); }, "重置设置"); } /// /// 导入配置 /// private void ExecuteImportConfig() { SafeExecute(() => { // TODO: 实现配置导入功能 UpdateMainStatus("配置导入完成"); LogManager.Info("导入配置"); }, "导入配置"); } /// /// 检查更新 (已优化为Idle事件监听) /// private void ExecuteCheckUpdate() { SafeExecute(() => { UpdateMainStatus("正在检查更新..."); // 使用Idle事件监听替代Thread.Sleep(2000) const string taskId = "SystemManagement_CheckUpdate"; var startTime = DateTime.Now; IdleEventManager.Instance.RegisterOnceTask( taskId, () => (DateTime.Now - startTime).TotalMilliseconds >= 2000, // 2秒后条件满足 () => { try { // 检查释放状态,避免在释放后更新UI if (_disposed) { LogManager.Info("SystemManagementViewModel已释放,跳过更新检查UI更新"); return; } UpdateMainStatus("当前版本已是最新版本"); } catch (Exception ex) { LogManager.Error($"更新检查UI更新失败: {ex.Message}"); } }, 8 // 高优先级 ); LogManager.Info("检查更新 (使用Idle事件监听)"); }, "检查更新"); } /// /// 生成性能报告 (已优化为Idle事件监听) /// private void ExecuteGeneratePerformanceReport() { SafeExecute(() => { UpdateMainStatus("正在生成性能报告..."); // 使用Idle事件监听替代Thread.Sleep(1500) const string taskId = "SystemManagement_GenerateReport"; var startTime = DateTime.Now; IdleEventManager.Instance.RegisterOnceTask( taskId, () => (DateTime.Now - startTime).TotalMilliseconds >= 1500, // 1.5秒后条件满足 () => { try { // 检查释放状态,避免在释放后更新UI if (_disposed) { LogManager.Info("SystemManagementViewModel已释放,跳过性能报告UI更新"); return; } UpdateMainStatus("性能报告生成完成"); // 性能信息更新已合并到统一状态栏 } catch (Exception ex) { LogManager.Error($"性能报告UI更新失败: {ex.Message}"); } }, 8 // 高优先级 ); LogManager.Info("生成性能报告 (使用Idle事件监听)"); }, "生成性能报告"); } /// /// 执行环境诊断 /// private void ExecuteDiagnostic() { SafeExecute(() => { try { LogManager.Info("开始环境诊断"); // 直接调用本地的环境诊断方法 string diagnosticReport = DiagnoseEnvironment(); // 显示诊断结果对话框 System.Windows.MessageBox.Show( diagnosticReport, "环境诊断结果", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Information); LogManager.Info("环境诊断完成"); } catch (Exception ex) { LogManager.Error($"环境诊断失败: {ex.Message}", ex); System.Windows.MessageBox.Show( $"环境诊断失败: {ex.Message}", "错误", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); } }, "环境诊断"); } /// /// 环境诊断方法 - 快速检查API是否可用 /// /// 诊断报告 private string DiagnoseEnvironment() { var report = new System.Text.StringBuilder(); report.AppendLine("=== Navisworks API环境诊断报告 ==="); try { // 1. 线程状态 var apartmentState = System.Threading.Thread.CurrentThread.GetApartmentState(); report.AppendLine($"线程状态: {apartmentState} {(apartmentState == System.Threading.ApartmentState.STA ? "✓" : "✗")}"); // 2. API可用性 try { var app = Autodesk.Navisworks.Api.Application.ActiveDocument; report.AppendLine("API可用性: 可用 ✓"); } catch (Exception apiEx) { report.AppendLine($"API可用性: 异常 - {apiEx.Message} ✗"); } // 3. 文档状态 try { var document = Autodesk.Navisworks.Api.Application.ActiveDocument; if (document != null) { report.AppendLine($"活动文档: {document.FileName ?? "未命名"} ✓"); report.AppendLine($"模型数量: {document.Models?.Count ?? 0}"); } else { report.AppendLine("活动文档: 无 ✗"); } } catch (Exception docEx) { report.AppendLine($"活动文档: 异常 - {docEx.Message} ✗"); } // 4. 内存状态 long memoryMB = GC.GetTotalMemory(false) / 1024 / 1024; report.AppendLine($"当前内存: {memoryMB} MB"); // 5. 系统信息 report.AppendLine($"插件版本: {PluginVersion}"); report.AppendLine($"Navisworks版本: {NavisworksVersion}"); report.AppendLine("系统状态: 正常"); report.AppendLine("=== 诊断完成 ==="); string result = report.ToString(); LogManager.Info($"[SystemManagement] 环境诊断报告:\n{result}"); return result; } catch (Exception ex) { string error = $"诊断过程出错: {ex.Message}"; report.AppendLine(error); LogManager.Error($"[SystemManagement] {error}"); return report.ToString(); } } #endregion #region 辅助方法 /// /// 安全执行异步操作 /// private async Task SafeExecuteAsync(Func action, string operationName = "未知操作") { try { await action(); } catch (Exception ex) { LogManager.Error($"{operationName}发生异常: {ex.Message}", ex); UpdateMainStatus($"{operationName}失败: {ex.Message}"); } } /// /// 安全执行同步操作 /// private void SafeExecute(Action action, string operationName = "未知操作") { try { action(); } catch (Exception ex) { LogManager.Error($"{operationName}发生异常: {ex.Message}", ex); UpdateMainStatus($"{operationName}失败: {ex.Message}"); } } /// /// 验证ViewModel状态是否正常 /// public bool IsValidState() { return _uiStateManager != null && LogLevels != null; } /// /// 获取ViewModel状态信息 /// public string GetStateInfo() { return $"UIStateManager: {(_uiStateManager != null ? "已初始化" : "未初始化")}, " + $"日志级别数量: {LogLevels?.Count ?? 0}"; } #endregion #region 清理资源和IDisposable实现 /// /// 释放资源 /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// 释放资源的具体实现 /// /// 是否正在释放托管资源 protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { try { // 调用现有的清理逻辑 Cleanup(); LogManager.Info("SystemManagementViewModel已正确释放资源 (IDisposable)"); } catch (Exception ex) { LogManager.Error($"SystemManagementViewModel释放资源时发生异常: {ex.Message}", ex); } } _disposed = true; } } public void Cleanup() { try { LogManager.Info("开始清理SystemManagementViewModel资源"); // 停止性能监控Idle任务,替代DispatcherTimer清理 try { IdleEventManager.Instance.UnregisterTask("SystemManagement_PerformanceMonitor"); LogManager.Info("SystemManagementViewModel性能监控Idle任务已停止"); } catch (Exception ex) { LogManager.Warning($"停止性能监控Idle任务时出现警告: {ex.Message}"); } // 清理可能的一次性任务 try { IdleEventManager.Instance.UnregisterTask("SystemManagement_CheckUpdate"); IdleEventManager.Instance.UnregisterTask("SystemManagement_GenerateReport"); LogManager.Debug("SystemManagementViewModel一次性Idle任务已清理"); } catch (Exception ex) { LogManager.Debug($"清理一次性Idle任务时出现提示: {ex.Message}"); } LogManager.Info("SystemManagementViewModel资源清理完成"); } catch (Exception ex) { LogManager.Error($"SystemManagementViewModel清理失败: {ex.Message}"); } } #endregion } }