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
}
}