整体调整了功能

This commit is contained in:
2026-01-13 15:03:02 +08:00
parent 63a768bd80
commit f1a892281b
82 changed files with 11226 additions and 291 deletions

View File

@@ -0,0 +1,255 @@
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();
}
}
}