Files
MoviconHub/MoviconWebApi/API/ClearStaticApi/Data.cs
2025-09-17 17:22:09 +08:00

112 lines
4.6 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 MoviconWebApi.Entities;
using FreeSql;
namespace MoviconWebApi.API.ClearStaticApi
{
/// <summary>
/// 清洗统计数据访问类
/// </summary>
public static class Data
{
/// <summary>
/// 获取清洗统计数据
/// </summary>
/// <param name="request">请求参数</param>
/// <param name="freeSql">FreeSql实例</param>
/// <returns>清洗统计响应</returns>
internal static async Task<ClearStaticResponse?> GetClearStatic(ClearStaticRequest request, IFreeSql freeSql)
{
try
{
// 获取当前日期信息
var today = DateTime.Today;
var firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
var firstDayOfYear = new DateTime(today.Year, 1, 1);
// 本地辅助函数把分钟字符串汇总为小时四舍五入到2位小数
static decimal SumMinutesToHours(IEnumerable<string?> minutesList)
{
decimal totalMinutes = 0m;
foreach (var s in minutesList)
{
if (string.IsNullOrWhiteSpace(s)) continue;
if (decimal.TryParse(s, out var m)) totalMinutes += m;
}
return Math.Round(totalMinutes / 60m, 2);
}
// 帮助方法:为每个统计项单独构建基础选择器(避免条件累积)
ISelect<ClearData> BuildSelector()
{
var sel = freeSql.Select<ClearData>();
if (!string.IsNullOrWhiteSpace(request.DeviceCode))
sel = sel.Where(x => x.DeviceCode == request.DeviceCode);
return sel;
}
// 计算累计作业数量(记录数即作业数)
var totalJobCount = await BuildSelector().CountAsync();
// 计算本年度作业数
var yearJobCount = await BuildSelector()
.Where(x => x.CreateTime >= firstDayOfYear)
.CountAsync();
// 计算本月作业数
var monthJobCount = await BuildSelector()
.Where(x => x.CreateTime >= firstDayOfMonth)
.CountAsync();
// 计算今日作业数
var todayJobCount = await BuildSelector()
.Where(x => x.CreateTime >= today)
.CountAsync();
// 计算累计作业时长(来自 ClearData.Test_FrameworkPerModelCleaningDuration单位分钟
var totalJobHours = SumMinutesToHours(
await BuildSelector().ToListAsync(x => x.Test_FrameworkPerModelCleaningDuration)
);
// 计算本年作业时长
var yearJobHours = SumMinutesToHours(
await BuildSelector().Where(x => x.CreateTime >= firstDayOfYear)
.ToListAsync(x => x.Test_FrameworkPerModelCleaningDuration)
);
// 计算本月作业时长
var monthJobHours = SumMinutesToHours(
await BuildSelector().Where(x => x.CreateTime >= firstDayOfMonth)
.ToListAsync(x => x.Test_FrameworkPerModelCleaningDuration)
);
// 计算今日作业时长
var todayJobHours = SumMinutesToHours(
await BuildSelector().Where(x => x.CreateTime >= today)
.ToListAsync(x => x.Test_FrameworkPerModelCleaningDuration)
);
// 返回结果
return new ClearStaticResponse
{
TotalJobCount = (int)totalJobCount,
YearJobCount = (int)yearJobCount,
MonthJobCount = (int)monthJobCount,
TodayJobCount = (int)todayJobCount,
TotalJobHours = Math.Round(totalJobHours, 2),
YearJobHours = Math.Round(yearJobHours, 2),
MonthJobHours = Math.Round(monthJobHours, 2),
TodayJobHours = Math.Round(todayJobHours, 2),
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
}
catch (Exception ex)
{
// 记录异常日志
Console.WriteLine($"获取清洗统计数据失败:{ex.Message}");
return null;
}
}
}
}