using MoviconWebApi.Entities;
using FreeSql;
namespace MoviconWebApi.API.ClearStaticApi
{
///
/// 清洗统计数据访问类
///
public static class Data
{
///
/// 获取清洗统计数据
///
/// 请求参数
/// FreeSql实例
/// 清洗统计响应
internal static async Task 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 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 BuildSelector()
{
var sel = freeSql.Select();
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;
}
}
}
}