完善数据报表模块
This commit is contained in:
@@ -1,24 +1,16 @@
|
||||
using Logger;
|
||||
using MahApps.Metro.Controls;
|
||||
using ClosedXML.Excel;
|
||||
using Logger;
|
||||
using Microsoft.Win32;
|
||||
using Model;
|
||||
using Model.Entity;
|
||||
using Model.Models;
|
||||
using NLog.Targets;
|
||||
using OxyPlot;
|
||||
using Service.Interface;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Threading;
|
||||
using UIShare.GlobalVariable;
|
||||
using UIShare.UIViewModel;
|
||||
using UIShare.ViewModelBase;
|
||||
|
||||
namespace ExportModule.ViewModels
|
||||
@@ -36,56 +28,231 @@ namespace ExportModule.ViewModels
|
||||
set { SetProperty(ref _testReportModelList, value); }
|
||||
}
|
||||
|
||||
private DateTime? _startTime;
|
||||
public DateTime? StartTime
|
||||
{
|
||||
get => _startTime;
|
||||
set => SetProperty(ref _startTime, value);
|
||||
}
|
||||
|
||||
private DateTime? _endTime;
|
||||
public DateTime? EndTime
|
||||
{
|
||||
get => _endTime;
|
||||
set => SetProperty(ref _endTime, value);
|
||||
}
|
||||
|
||||
private string _selectedScope = "全部";
|
||||
public string SelectedScope
|
||||
{
|
||||
get => _selectedScope;
|
||||
set => SetProperty(ref _selectedScope, value);
|
||||
}
|
||||
|
||||
public ObservableCollection<string> ScopeOptions { get; } = new()
|
||||
{
|
||||
"全部",
|
||||
"TestCell1", "TestCell2", "TestCell3", "TestCell4",
|
||||
"TestCell5", "TestCell6", "TestCell7", "TestCell8"
|
||||
};
|
||||
|
||||
private string _statusMessage = "就绪";
|
||||
public string StatusMessage
|
||||
{
|
||||
get => _statusMessage;
|
||||
set => SetProperty(ref _statusMessage, value);
|
||||
}
|
||||
|
||||
private int _totalCount;
|
||||
public int TotalCount
|
||||
{
|
||||
get => _totalCount;
|
||||
set => SetProperty(ref _totalCount, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 命令
|
||||
public ICommand LoadedCommand { get; }
|
||||
public ICommand QueryCommand { get; }
|
||||
public ICommand ExportCommand { get; }
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
public ICommand LoadedCommand { get; set; }
|
||||
#region 私有字段
|
||||
ITestReportService _testReportService { get; set; }
|
||||
private readonly ITestReportService _testReportService;
|
||||
#endregion
|
||||
|
||||
public ExportViewModel(IContainerProvider containerProvider) : base(containerProvider)
|
||||
{
|
||||
_testReportService = containerProvider.Resolve<ITestReportService>();
|
||||
|
||||
LoadedCommand = new AsyncDelegateCommand(OnLoad);
|
||||
QueryCommand = new AsyncDelegateCommand(OnQuery);
|
||||
ExportCommand = new AsyncDelegateCommand(OnExport);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region 命令处理
|
||||
|
||||
/// <summary>
|
||||
/// 加载全部(无筛选条件)
|
||||
/// </summary>
|
||||
private async Task OnLoad()
|
||||
{
|
||||
var result=await _testReportService.GetFilterList();
|
||||
var result = await _testReportService.GetFilterList();
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
IList<TestReportModel> reportList = result.Data;
|
||||
TestReportModelList = new ObservableCollection<TestReportModel>(reportList);
|
||||
TestReportModelList = new ObservableCollection<TestReportModel>(result.Data ?? new List<TestReportModel>());
|
||||
TotalCount = TestReportModelList.Count;
|
||||
ShowInfoMessageBox($"加载完成,共 {TotalCount} 条记录", () => { });
|
||||
}
|
||||
else
|
||||
{
|
||||
TestReportModelList = new();
|
||||
TestReportModelList = new ObservableCollection<TestReportModel>();
|
||||
TotalCount = 0;
|
||||
ShowErrorMessageBox($"加载失败:{result.Msg}", () => { });
|
||||
LoggerHelper.Error(result.Msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询(根据开始日期、结束日期、台架名称筛选)
|
||||
/// </summary>
|
||||
private async Task OnQuery()
|
||||
{
|
||||
// 处理结束日期:若用户只选了日期没选时间,默认到当天末尾
|
||||
DateTime? queryEnd = EndTime;
|
||||
if (queryEnd.HasValue)
|
||||
{
|
||||
queryEnd = queryEnd.Value.Date.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
|
||||
string? scope = SelectedScope == "全部" ? null : SelectedScope;
|
||||
|
||||
var result = await _testReportService.GetFilterList(StartTime, queryEnd, scope);
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
TestReportModelList = new ObservableCollection<TestReportModel>(result.Data ?? new List<TestReportModel>());
|
||||
TotalCount = TestReportModelList.Count;
|
||||
ShowInfoMessageBox($"查询完成,共 {TotalCount} 条记录", () => { });
|
||||
}
|
||||
else
|
||||
{
|
||||
TestReportModelList = new ObservableCollection<TestReportModel>();
|
||||
TotalCount = 0;
|
||||
ShowErrorMessageBox($"查询失败:{result.Msg}", () => { });
|
||||
LoggerHelper.Error(result.Msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导出 Excel(根据当前筛选条件导出完整实体数据)
|
||||
/// </summary>
|
||||
private async Task OnExport()
|
||||
{
|
||||
DateTime? queryEnd = EndTime;
|
||||
if (queryEnd.HasValue)
|
||||
{
|
||||
queryEnd = queryEnd.Value.Date.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
|
||||
string? scope = SelectedScope == "全部" ? null : SelectedScope;
|
||||
|
||||
// 查询全量实体数据
|
||||
StatusMessage = "正在查询导出数据...";
|
||||
var entityResult = await _testReportService.GetEntitiesByFilter(StartTime, queryEnd, scope);
|
||||
if (!entityResult.IsSuccess || entityResult.Data == null || entityResult.Data.Count == 0)
|
||||
{
|
||||
ShowErrorMessageBox("没有数据可导出,请先查询或调整筛选条件。", () => { });
|
||||
return;
|
||||
}
|
||||
|
||||
var dialog = new SaveFileDialog
|
||||
{
|
||||
Filter = "Excel 工作簿 (*.xlsx)|*.xlsx|所有文件 (*.*)|*.*",
|
||||
DefaultExt = ".xlsx",
|
||||
FileName = $"测试报告_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx"
|
||||
};
|
||||
|
||||
if (dialog.ShowDialog() != true) return;
|
||||
|
||||
var entities = entityResult.Data;
|
||||
StatusMessage = $"正在导出 {entities.Count} 条记录...";
|
||||
await Task.Run(() => ExportToExcel(dialog.FileName, entities));
|
||||
ShowInfoMessageBox($"导出完成,共 {entities.Count} 条记录,已保存至:{dialog.FileName}", () => { });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 辅助方法
|
||||
|
||||
private static void ExportToExcel(string filePath, List<TestReportEntity> entities)
|
||||
{
|
||||
using var workbook = new XLWorkbook();
|
||||
var ws = workbook.Worksheets.Add("测试报告");
|
||||
|
||||
// 表头
|
||||
string[] headers = {
|
||||
"Id", "CreateTime", "TestRoundId", "Scope", "FileName",
|
||||
"StepIndex", "StepName", "StepType", "MethodName", "MethodFullName",
|
||||
"Result", "RunTimeMs", "OutputValue", "Depth", "IsErrorStep", "LoopRemaining"
|
||||
};
|
||||
|
||||
for (int c = 0; c < headers.Length; c++)
|
||||
{
|
||||
ws.Cell(1, c + 1).Value = headers[c];
|
||||
}
|
||||
|
||||
// 标题行样式
|
||||
var headerRange = ws.Range(1, 1, 1, headers.Length);
|
||||
headerRange.Style.Font.Bold = true;
|
||||
headerRange.Style.Fill.BackgroundColor = XLColor.FromArgb(0xECEFF4);
|
||||
headerRange.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||||
headerRange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||||
|
||||
// 填充数据
|
||||
for (int i = 0; i < entities.Count; i++)
|
||||
{
|
||||
var e = entities[i];
|
||||
int row = i + 2;
|
||||
|
||||
ws.Cell(row, 1).Value = e.Id;
|
||||
ws.Cell(row, 2).Value = e.CreateTime.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
ws.Cell(row, 3).Value = e.TestRoundId.ToString();
|
||||
ws.Cell(row, 4).Value = e.Scope ?? "";
|
||||
ws.Cell(row, 5).Value = e.FileName ?? "";
|
||||
ws.Cell(row, 6).Value = e.StepIndex;
|
||||
ws.Cell(row, 7).Value = e.StepName ?? "";
|
||||
ws.Cell(row, 8).Value = e.StepType ?? "";
|
||||
ws.Cell(row, 9).Value = e.MethodName ?? "";
|
||||
ws.Cell(row, 10).Value = e.MethodFullName ?? "";
|
||||
ws.Cell(row, 11).Value = e.Result;
|
||||
ws.Cell(row, 12).Value = e.RunTimeMs;
|
||||
ws.Cell(row, 13).Value = e.OutputValue ?? "";
|
||||
ws.Cell(row, 14).Value = e.Depth;
|
||||
ws.Cell(row, 15).Value = e.IsErrorStep ? "是" : "否";
|
||||
ws.Cell(row, 16).Value = e.LoopRemaining;
|
||||
|
||||
// 数据行边框
|
||||
var dataRange = ws.Range(row, 1, row, headers.Length);
|
||||
dataRange.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||||
dataRange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||||
}
|
||||
|
||||
ws.Columns().AdjustToContents();
|
||||
workbook.SaveAs(filePath);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 生命周期
|
||||
|
||||
public override void OnNavigatedTo(NavigationContext navigationContext)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user