/// <summary> /// 分析某个员工对象一天的打卡数据 /// </summary> /// <param name="infos">当天员工所有的打卡记录</param> /// <returns></returns> public static List <AnalysisOfDay> GetAnalysisOfDayList(List <AttendanceInfo> one_emp_month_infos, AnalysisOfMonth analysis_of_month) { List <AnalysisOfDay> one_emp_day_analysis_list = new List <AnalysisOfDay>(); List <List <AttendanceInfo> > one_emp_day_infos_group = analysisUtil.GetSliceOfDayFromMonth(one_emp_month_infos.First().inout_time.Date, one_emp_month_infos); foreach (var one_emp_day_infos in one_emp_day_infos_group) { AnalysisOfDay analysis_result_of_one_day = GetAnalysisResultOfOneDay(one_emp_day_infos); one_emp_day_analysis_list.Add(analysis_result_of_one_day); } return(one_emp_day_analysis_list); }
public static AnalysisOfDay GetAnalysisResultOfOneDay(List <AttendanceInfo> day_infos) { AnalysisOfDay analysis_of_day = new AnalysisOfDay(); AttendanceInfo first_info = day_infos.First(); AttendanceInfo last_info = day_infos.Last(); analysis_of_day.date = first_info.inout_time.Date; analysis_of_day.week = Convert.ToInt32(first_info.inout_time.DayOfWeek); analysis_of_day.card_id = first_info.card_id; analysis_of_day.job_num = first_info.job_num; analysis_of_day.emp_name = first_info.emp_name; analysis_of_day.first_tm = first_info.inout_time; analysis_of_day.last_tm = last_info.inout_time; TimeSpan timespan = first_info.inout_time.TimeOfDay; analysis_of_day.first_hr = timespan.Minutes % 60 > 30 ? timespan.Hours + 1 : timespan.Hours; timespan = last_info.inout_time.TimeOfDay; analysis_of_day.last_hr = timespan.Minutes % 60 > 30 ? timespan.Hours + 1 : timespan.Hours; if (analysis_of_day.last_tm.Day > analysis_of_day.first_tm.Day) { analysis_of_day.last_hr += 24; } analysis_of_day.shift = analysisUtil.GetShift(analysis_of_day.first_hr); FirstAndLastPunchCardAnalysisResult result = analysisUtil.GetFirstAndLastPunchCardAnalysis(analysis_of_day.first_tm, analysis_of_day.last_tm, analysis_of_day.first_hr, analysis_of_day.last_hr, analysis_of_day.shift); analysis_of_day.punch_card_hour = result.punch_card_hour; analysis_of_day.punch_card_time = result.punch_card_time; analysis_of_day.punch_card_hour_compare = result.punch_card_hour_compare; analysis_of_day.punch_card_minute_compare = result.punch_card_minute_compare; analysis_of_day.perfect = result.perfect; analysis_of_day.half_late = result.half_late; analysis_of_day.half_late_tm = result.half_late_tm; analysis_of_day.late = result.late; analysis_of_day.late_tm = result.late_tm; analysis_of_day.half_leave_early = result.half_leave_early; analysis_of_day.half_leave_early_tm = result.half_leave_early_tm; analysis_of_day.leave_early = result.leave_early; analysis_of_day.leave_early_tm = result.leave_early_tm; analysis_of_day.punch_card_count_total = day_infos.Count; analysis_of_day.punch_card_count_valid = analysisUtil.GetValidPunchCardCount(day_infos); return(analysis_of_day); }
/// <summary> /// 入口方法 /// </summary> public void AnalysisResultsToMySQL() { using (var context = new Context()) { //获取一个月内所有员工的打卡信息 List <AttendanceInfo> attendance_info_all_list = context.AttendanceInfo .OrderBy(x => x.inout_time) .AsNoTracking() .ToList(); if (attendance_info_all_list.Count == 0) { Console.WriteLine("数据表数据为空,停止分析"); return; } //确认数据表里的数据是同年同月的 if (attendance_info_all_list.First().inout_time.Year != attendance_info_all_list.Last().inout_time.Year&& attendance_info_all_list.First().inout_time.Month != attendance_info_all_list.Last().inout_time.Month) { Console.WriteLine("此数据表横跨多个月份,请提供一个月的员工打卡数据"); return; } int year = attendance_info_all_list.First().inout_time.Year; int month = attendance_info_all_list.First().inout_time.Month; //获取工作日列表 List <int> work_day_list = analysisUtil.GetWorkDayListOfMonth(year, month); //获取周末日期列表(排除周末加班) List <int> weekend_day_list = analysisUtil.GetWeekendDayListOfMonth(year, month); //获取所有不需要分析的人员 List <SkipEmployee> skip_employee_list = context.SkipEmployee.AsNoTracking().ToList(); AnalysisResult analysis_result = GetAnalysisResult(attendance_info_all_list, skip_employee_list, work_day_list, weekend_day_list); AnalysisOfMonth first_analysis_of_month = analysis_result.analysis_of_month.First(); int month_exist_count = context.AnalysisOfMonth.Where(x => x.job_num == first_analysis_of_month.job_num && x.emp_name == first_analysis_of_month.emp_name && x.date == first_analysis_of_month.date).Count(); if (month_exist_count == 0) { context.AnalysisOfMonth.AddRange(analysis_result.analysis_of_month); var month_count = context.SaveChanges(); Console.WriteLine("存储员工月度打卡分析记录:" + month_count + "条"); } else { Console.WriteLine("月度分析结果中的第一条在数据库中已存在,放弃录入"); } AnalysisOfDay first_analysis_of_day = analysis_result.analysis_of_day.First(); int day_exist_count = context.AnalysisOfDay.Where(x => x.job_num == first_analysis_of_day.job_num && x.emp_name == first_analysis_of_day.emp_name && x.date == first_analysis_of_day.date).Count(); if (day_exist_count == 0) { TimeSpan zero = new TimeSpan(0, 0, 0); List <AnalysisOfDay> a = analysis_result.analysis_of_day.Where(x => x.half_late_tm < zero || x.late_tm < zero || x.half_leave_early_tm < zero || x.leave_early_tm < zero).ToList(); context.AnalysisOfDay.AddRange(a); context.AnalysisOfDay.AddRange(analysis_result.analysis_of_day); var day_count = context.SaveChanges(); Console.WriteLine("存储员工每天打卡分析记录:" + day_count + "条"); } else { Console.WriteLine("员工每天打卡记录分析结果中的第一条在数据库中已存在,放弃录入"); } } }