using WorkCameraExport.Models; using WorkCameraExport.Services; using WorkCameraExport.Services.Interfaces; namespace WorkCameraExport.Forms { /// /// 主页窗体 - 显示统计信息和功能入口 /// public partial class HomeForm : Form { private readonly ApiService _apiService; private readonly ILogService? _logService; private readonly LoginStateManager? _loginStateManager; private readonly NetworkMonitor? _networkMonitor; private bool _isLoading; public HomeForm(ApiService apiService, ILogService? logService = null, LoginStateManager? loginStateManager = null, NetworkMonitor? networkMonitor = null) { InitializeComponent(); _apiService = apiService; _logService = logService; _loginStateManager = loginStateManager; _networkMonitor = networkMonitor; // 订阅登录失效事件 if (_loginStateManager != null) { _loginStateManager.LoginExpired += OnLoginExpired; } // 订阅网络状态变化事件 if (_networkMonitor != null) { _networkMonitor.NetworkStatusChanged += OnNetworkStatusChanged; } } /// /// 窗体加载事件 /// private async void HomeForm_Load(object sender, EventArgs e) { await LoadStatisticsAsync(); } #region 统计数据加载 /// /// 加载统计数据 /// public async Task LoadStatisticsAsync() { if (_isLoading) return; _isLoading = true; SetLoadingState(true); try { _logService?.Info("开始加载统计数据"); var (success, message, data) = await _apiService.GetStatisticsAsync(); if (success && data != null) { DisplayStatistics(data); lblStatus.Text = $"数据更新时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"; lblStatus.ForeColor = Color.Gray; _logService?.Info("统计数据加载成功"); } else { ShowError(message); _logService?.Warn($"统计数据加载失败: {message}"); } } catch (Exception ex) { ShowError($"加载统计数据异常: {ex.Message}"); _logService?.Error($"加载统计数据异常: {ex.Message}", ex); } finally { _isLoading = false; SetLoadingState(false); } } /// /// 显示统计数据 /// private void DisplayStatistics(StatisticsDto data) { lblMonthRecordCount.Text = data.MonthRecordCount.ToString("N0"); lblMonthImageCount.Text = data.MonthImageCount.ToString("N0"); lblMonthWorkerCount.Text = data.MonthWorkerCount.ToString("N0"); lblTodayRecordCount.Text = data.TodayRecordCount.ToString("N0"); lblTotalRecordCount.Text = data.TotalRecordCount.ToString("N0"); lblPendingMigrationCount.Text = data.PendingMigrationCount.ToString("N0"); } /// /// 设置加载状态 /// private void SetLoadingState(bool loading) { btnRefresh.Enabled = !loading; btnWorkRecord.Enabled = !loading; btnMonthReport.Enabled = !loading; btnMigration.Enabled = !loading; if (loading) { lblStatus.Text = "正在加载统计数据..."; lblStatus.ForeColor = Color.Blue; } } /// /// 显示错误信息 /// private void ShowError(string message) { lblStatus.Text = message; lblStatus.ForeColor = Color.Red; // 显示重试按钮 btnRetry.Visible = true; } #endregion #region 导航功能 /// /// 工作记录按钮点击事件 /// private void btnWorkRecord_Click(object sender, EventArgs e) { NavigateToWorkRecord(); } /// /// 导航到工作记录管理界面 /// public void NavigateToWorkRecord() { _logService?.Info("导航到工作记录管理界面"); // 创建导出服务 var configService = new ConfigService(); var imageService = new ImageService(_logService); var exportService = new ExportService(_apiService, imageService, configService, _logService); using var form = new WorkRecordForm(_apiService, _logService, exportService); form.ShowDialog(this); } /// /// 月报表按钮点击事件 /// private void btnMonthReport_Click(object sender, EventArgs e) { NavigateToMonthReport(); } /// /// 导航到月报表界面 /// public void NavigateToMonthReport() { _logService?.Info("导航到月报表界面"); // 创建导出服务 var configService = new ConfigService(); var imageService = new ImageService(_logService); var exportService = new ExportService(_apiService, imageService, configService, _logService); using var form = new MonthReportForm(_apiService, _logService, exportService); form.ShowDialog(this); } /// /// 历史数据迁移按钮点击事件 /// private void btnMigration_Click(object sender, EventArgs e) { NavigateToMigration(); } /// /// 导航到数据迁移界面 /// public void NavigateToMigration() { _logService?.Info("导航到数据迁移界面"); using var form = new MigrationForm(_apiService, _logService); form.ShowDialog(this); } #endregion #region 其他事件 /// /// 刷新按钮点击事件 /// private async void btnRefresh_Click(object sender, EventArgs e) { btnRetry.Visible = false; await LoadStatisticsAsync(); } /// /// 重试按钮点击事件 /// private async void btnRetry_Click(object sender, EventArgs e) { btnRetry.Visible = false; await LoadStatisticsAsync(); } /// /// 设置按钮点击事件 /// private void btnSettings_Click(object sender, EventArgs e) { NavigateToSettings(); } /// /// 导航到设置界面 /// public void NavigateToSettings() { _logService?.Info("导航到设置界面"); var configService = new ConfigService(); using var form = new SettingsForm(configService, _logService); form.ShowDialog(this); } /// /// 窗体关闭事件 /// private void HomeForm_FormClosing(object sender, FormClosingEventArgs e) { // 取消订阅登录失效事件 if (_loginStateManager != null) { _loginStateManager.LoginExpired -= OnLoginExpired; } // 取消订阅网络状态变化事件 if (_networkMonitor != null) { _networkMonitor.NetworkStatusChanged -= OnNetworkStatusChanged; } _logService?.Info("关闭主页窗体"); } /// /// 登录失效事件处理 /// private void OnLoginExpired(object? sender, LoginExpiredEventArgs e) { // 确保在 UI 线程执行 if (InvokeRequired) { Invoke(() => OnLoginExpired(sender, e)); return; } _logService?.Warn($"登录失效: {e.Reason}"); MessageBox.Show( e.Reason, "登录失效", MessageBoxButtons.OK, MessageBoxIcon.Warning); // 关闭当前窗体,返回登录界面 DialogResult = DialogResult.Abort; Close(); } /// /// 网络状态变化事件处理 /// private void OnNetworkStatusChanged(object? sender, NetworkStatusChangedEventArgs e) { // 确保在 UI 线程执行 if (InvokeRequired) { Invoke(() => OnNetworkStatusChanged(sender, e)); return; } if (e.IsAvailable) { _logService?.Info("网络已恢复连接"); lblStatus.Text = "网络已恢复连接"; lblStatus.ForeColor = Color.Green; // 网络恢复后自动刷新数据 _ = LoadStatisticsAsync(); } else { _logService?.Warn("网络连接已断开"); lblStatus.Text = "网络连接已断开,请检查网络设置"; lblStatus.ForeColor = Color.Red; } } #endregion } }