如何统计员工月度工作总时长并生成月末汇总报告?
员工月度工作总时长统计与月末汇总实现方案
需求:统计员工月度工作总时长,并在月末获取该汇总数据。
基于你提供的迟到详情查询代码,以下是实现月度工作时长汇总的方案:
步骤说明
- 定义汇总数据DTO,用于存储员工月度工作时长信息
- 编写异步查询方法,筛选指定月度的考勤记录,按员工分组计算总时长
- 处理空值与异常情况,确保数据准确性
实现代码
首先定义汇总DTO:
public class MonthlyWorkHoursSummary { public string EmployeeId { get; set; } public string EmployeeName { get; set; } public decimal TotalWorkHours { get; set; } // 总工作时长(小时) }
然后编写查询方法:
public async Task<IEnumerable<MonthlyWorkHoursSummary>> GetMonthlyWorkHoursSummary(DateTime periodFrom, DateTime periodTo, ApiToken token) { try { return await _DBContext.PayrollHrpayrollAttDetail // 筛选当前公司、部门的考勤记录 .Where(x => x.CompanyId == token.CompanyId && x.DivisionId == token.DivisionId && x.DepartmentId == token.DepartmentId) // 筛选指定月度内的记录 .Where(x => x.SystemDate >= periodFrom && x.SystemDate <= periodTo) // 过滤有效考勤(TimeIn和TimeOut都不为空) .Where(x => x.TimeIn.HasValue && x.TimeOut.HasValue) // 按员工分组计算总时长 .GroupBy(x => new { x.EmployeeId, x.EmployeeName }) .Select(g => new MonthlyWorkHoursSummary { EmployeeId = g.Key.EmployeeId, EmployeeName = g.Key.EmployeeName, // 计算总工作时长(转换为小时,保留两位小数) TotalWorkHours = (decimal)g.Sum(x => (x.TimeOut.Value - x.TimeIn.Value).TotalHours) }) .ToListAsync(); } catch (Exception ex) { // 可添加日志记录逻辑,便于排查问题 return Enumerable.Empty<MonthlyWorkHoursSummary>(); } }
关键注意点
- 避免冗余转换:参考代码中
DateTime.Parse(x.TimeIn.Value.ToString())属于无效操作,直接使用x.TimeIn.Value即可完成时间差计算 - 空值过滤:必须排除TimeIn或TimeOut为空的记录,防止空引用异常
- 时间范围校验:
periodFrom和periodTo需传入月度的准确起止日期(如当月1号至当月最后一天) - 异常处理:建议在catch块中加入日志记录,方便后续问题定位
内容的提问来源于stack exchange,提问作者Lawal Opeyemi
相关产品推荐
相关产品推荐

