Files
FATrace/FATrace.WPLApp/ViewModels/FileImportLogViewModel.cs
2026-01-13 15:03:02 +08:00

256 lines
8.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using FATrace.Model;
using FATrace.WPLApp.Core;
using FATrace.WPLApp.Services;
using FreeSql;
using Prism.Commands;
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows;
namespace FATrace.WPLApp.ViewModels
{
/// <summary>
/// 文件导入日志 查询 VM展示 FileImportLog
/// </summary>
public class FileImportLogViewModel : NavigationViewModel
{
private readonly IFreeSql _fsql;
private readonly ILogService _log;
public FileImportLogViewModel(IFreeSql fsql, ILogService log)
{
_fsql = fsql;
_log = log;
Items = new ObservableCollection<FileImportLog>();
SearchCommand = new DelegateCommand(async () => await SearchAsync(), () => !IsBusy)
.ObservesProperty(() => IsBusy);
ClearCommand = new DelegateCommand(ClearFilters, () => !IsBusy)
.ObservesProperty(() => IsBusy);
FirstPageCommand = new DelegateCommand(async () => { if (PageIndex == 1) return; PageIndex = 1; await SearchAsync(); }, () => !IsBusy && PageIndex > 1)
.ObservesProperty(() => IsBusy)
.ObservesProperty(() => PageIndex);
PrevPageCommand = new DelegateCommand(async () => { if (PageIndex <= 1) return; PageIndex -= 1; await SearchAsync(); }, () => !IsBusy && PageIndex > 1)
.ObservesProperty(() => IsBusy)
.ObservesProperty(() => PageIndex);
NextPageCommand = new DelegateCommand(async () => { if (PageIndex >= TotalPages) return; PageIndex += 1; await SearchAsync(); }, () => !IsBusy && PageIndex < TotalPages)
.ObservesProperty(() => IsBusy)
.ObservesProperty(() => PageIndex)
.ObservesProperty(() => TotalPages);
LastPageCommand = new DelegateCommand(async () => { if (TotalPages <= 0 || PageIndex == TotalPages) return; PageIndex = TotalPages; await SearchAsync(); }, () => !IsBusy && PageIndex < TotalPages)
.ObservesProperty(() => IsBusy)
.ObservesProperty(() => PageIndex)
.ObservesProperty(() => TotalPages);
}
#region
private string? _fileName;
/// <summary>
/// 文件名(模糊匹配)
/// </summary>
public string? FileName
{
get => _fileName;
set { _fileName = value; RaisePropertyChanged(); }
}
private string? _status;
/// <summary>
/// 状态(模糊匹配,例如 Success/Failed
/// </summary>
public string? Status
{
get => _status;
set { _status = value; RaisePropertyChanged(); }
}
private string? _keyword;
/// <summary>
/// 关键字(匹配 SourcePath/ArchivePath/Message/SheetRowStats
/// </summary>
public string? Keyword
{
get => _keyword;
set { _keyword = value; RaisePropertyChanged(); }
}
private DateTime? _startDate;
/// <summary>
/// 导入开始日期起(基于 StartTime
/// </summary>
public DateTime? StartDate
{
get => _startDate;
set { _startDate = value; RaisePropertyChanged(); }
}
private DateTime? _endDate;
/// <summary>
/// 导入开始日期止(基于 StartTime包含当天
/// </summary>
public DateTime? EndDate
{
get => _endDate;
set { _endDate = value; RaisePropertyChanged(); }
}
#endregion
#region
public ObservableCollection<FileImportLog> Items { get; }
private bool _isBusy;
public bool IsBusy
{
get => _isBusy;
set { _isBusy = value; RaisePropertyChanged(); }
}
private int _totalCount;
public int TotalCount
{
get => _totalCount;
set { _totalCount = value; RaisePropertyChanged(); }
}
private int _pageIndex = 1;
public int PageIndex
{
get => _pageIndex;
set { _pageIndex = value < 1 ? 1 : value; RaisePropertyChanged(); }
}
private int _pageSize = 20;
public int PageSize
{
get => _pageSize;
set
{
var v = value <= 0 ? 20 : value;
if (_pageSize != v)
{
_pageSize = v;
RaisePropertyChanged();
PageIndex = 1;
if (!IsBusy) _ = SearchAsync();
}
}
}
private int _totalPages;
public int TotalPages
{
get => _totalPages;
set { _totalPages = value; RaisePropertyChanged(); }
}
#endregion
#region
public DelegateCommand SearchCommand { get; }
public DelegateCommand ClearCommand { get; }
public DelegateCommand FirstPageCommand { get; }
public DelegateCommand PrevPageCommand { get; }
public DelegateCommand NextPageCommand { get; }
public DelegateCommand LastPageCommand { get; }
#endregion
private void ClearFilters()
{
FileName = string.Empty;
Status = string.Empty;
Keyword = string.Empty;
StartDate = null;
EndDate = null;
}
private async Task SearchAsync()
{
if (IsBusy) return;
try
{
IsBusy = true;
_log.Info("FileImportLog 查询开始");
var data = await Task.Run(() =>
{
var q = _fsql.Select<FileImportLog>();
if (!string.IsNullOrWhiteSpace(FileName))
q = q.Where(a => a.FileName != null && a.FileName.Contains(FileName));
if (!string.IsNullOrWhiteSpace(Status))
q = q.Where(a => a.Status != null && a.Status.Contains(Status));
if (!string.IsNullOrWhiteSpace(Keyword))
{
var kw = Keyword;
q = q.Where(a =>
(a.SourcePath != null && a.SourcePath.Contains(kw))
|| (a.ArchivePath != null && a.ArchivePath.Contains(kw))
|| (a.Message != null && a.Message.Contains(kw))
|| (a.SheetRowStats != null && a.SheetRowStats.Contains(kw))
);
}
DateTime? start = StartDate;
DateTime? end = EndDate;
if (start.HasValue)
{
var s = start.Value.Date;
q = q.Where(a => a.StartTime >= s);
}
if (end.HasValue)
{
var e = end.Value.Date.AddDays(1).AddTicks(-1);
q = q.Where(a => a.StartTime <= e);
}
q = q.OrderByDescending(a => a.Id);
var page = PageIndex < 1 ? 1 : PageIndex;
var size = PageSize <= 0 ? 20 : PageSize;
var list = q.Count(out var total)
.Page(page, size)
.ToList();
var pages = total <= 0 || size <= 0 ? 0 : (int)Math.Ceiling(total * 1.0 / size);
if (pages > 0 && page > pages)
{
page = pages;
list = q.Page(page, size).ToList();
}
return (items: list, total: (int)total, normalizedPage: page, totalPages: pages);
});
Application.Current.Dispatcher.Invoke(() =>
{
Items.Clear();
foreach (var it in data.items) Items.Add(it);
TotalCount = data.total;
TotalPages = data.totalPages;
PageIndex = data.normalizedPage == 0 ? 1 : data.normalizedPage;
});
_log.Info($"FileImportLog 查询完成,记录数: {TotalCount}");
}
catch (Exception ex)
{
_log.Error($"FileImportLog 查询失败: {ex}");
MessageBox.Show($"查询失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
IsBusy = false;
}
}
public override async void OnNavigatedTo(Prism.Regions.NavigationContext navigationContext)
{
await SearchAsync();
}
}
}