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; } } } }