/// <summary> /// 分析请假时间 /// </summary> /// <param name="sign">用于返回存储</param> /// <param name="snaps">当天班别</param> /// <param name="workleaveTimes">多张请假单</param> /// <param name="Event">当天事件</param> public HrmsAttAnalysis WorkLeaveAnalysisAnd(HrmsAttAnalysis sign, HrmsShiftSnaps snaps, List <FormWorkLeave> workleaveTimes, int Event) { //取得当天的请假 var workleaveTime = workleaveTimes.SingleOrDefault(c => c.EndTime.Date >= sign.AttDate && c.StartTime.Date <= sign.AttDate); DateTime start;//请假起止时间 DateTime end; if (workleaveTime != null && Event == (int)HrmsConfig.AttendanceStatusEnum.正常) { //请假时间如果小于上班时间,就按上班时间 start = workleaveTime.StartTime > snaps.WorkStart ? workleaveTime.StartTime : snaps.WorkStart; //请假时间如果超过上班时间,就按上班结束时间。 end = workleaveTime.EndTime > snaps.WorkStop ? snaps.WorkStop : workleaveTime.EndTime; sign.WorkLeave = Math.Round( DateTimeHelper.ExcludeTimeSet(start, end, new Hashtable() { { snaps.Rist1Start, snaps.Rist1Stop }, { snaps.Rist2Start, snaps.Rist2Stop } }, Convert.ToDateTime(sign.OnDutty.ToShortDateString() + " " + snaps.WorkStart.ToShortTimeString()), snaps.SettlementMin, snaps.SettlementMax) .TotalHours, 1); switch ((int)workleaveTime.LeaveType) { case (int)FormWorkLeave.LeaveTypEnum.调休: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.调休; break; case (int)FormWorkLeave.LeaveTypEnum.丧假: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.丧假; break; case (int)FormWorkLeave.LeaveTypEnum.事假: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.事假; break; case (int)FormWorkLeave.LeaveTypEnum.产假: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.产假; break; case (int)FormWorkLeave.LeaveTypEnum.婚假: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.婚假; break; case (int)FormWorkLeave.LeaveTypEnum.病假: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.病假; break; case (int)FormWorkLeave.LeaveTypEnum.补休: sign.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.补休; break; } sign.FormNo = workleaveTime.FormNo; } return(sign); }
/// <summary> /// 平时 /// </summary> /// <param name="sign"></param> /// <param name="snaps"></param> /// <returns></returns> HrmsAttAnalysis EventNormal(HrmsAttAnalysis sign, HrmsShiftSnaps snaps) { if (sign.OnDutty == HrmsConfig.DefaultDateTime || sign.OffDutty == HrmsConfig.DefaultDateTime) { return(sign); } //上班 sign.WorkingHours = Math.Round( DateTimeHelper.ExcludeTimeSet(sign.OnDutty, sign.OffDutty, new Hashtable() { { snaps.Rist1Start, snaps.Rist1Stop }, { snaps.Rist2Start, snaps.Rist2Stop } }, Convert.ToDateTime(sign.OnDutty.ToShortDateString() + " " + snaps.WorkStart.ToShortTimeString()), snaps.SettlementMin, snaps.SettlementMax) .TotalHours, 1); //迟到 if (sign.OnDutty > snaps.WorkStart) { sign.Late = Math.Abs(Math.Round((snaps.WorkStart - sign.OnDutty).TotalMinutes, 0)); } //早退,当天工作总时间减去已上班时间 if (sign.OffDutty < snaps.WorkStop) { //sign.LeaveEarly = Math.Abs( // Math.Round( // DateTimeHelper.ExcludeTimeSet(snaps.WorkStart, snaps.WorkStop, new Hashtable() // { // {snaps.Rist1Start, snaps.Rist1Stop}, // {snaps.Rist2Start, snaps.Rist2Stop} // }, Convert.ToDateTime(sign.OnDutty.ToShortDateString() + " " + snaps.WorkStart.ToShortTimeString()), snaps.SettlementMin, snaps.SettlementMax) // .TotalHours, 1) - sign.WorkingHours); sign.LeaveEarly = Math.Round((snaps.WorkStop - sign.OffDutty).TotalMinutes, 0); } //平时加班 if (sign.OffDutty > snaps.WorkStop) { sign.Overtime = Math.Round( DateTimeHelper.ExcludeTimeSet(snaps.WorkStop, sign.OffDutty, new Hashtable { { snaps.Rist2Start, snaps.Rist2Stop } }, snaps.SettlementMin, snaps.SettlementMax) .TotalHours, 1); } return(sign); }
HrmsAttAnalysis EventWeeken(HrmsAttAnalysis sign, HrmsShiftSnaps snaps) { if (sign.OnDutty == HrmsConfig.DefaultDateTime || sign.OffDutty == HrmsConfig.DefaultDateTime) { return(sign); } //上班 sign.WorkingHours = Math.Round( DateTimeHelper.ExcludeTimeSet(sign.OnDutty, sign.OffDutty, new Hashtable() { { snaps.Rist1Start, snaps.Rist1Stop }, { snaps.Rist2Start, snaps.Rist2Stop } }, Convert.ToDateTime(sign.OnDutty.ToShortDateString() + " " + snaps.WorkStart.ToShortTimeString()), snaps.SettlementMin, snaps.SettlementMax) .TotalHours, 1); //周末加班 sign.WeekendOvertime = sign.WorkingHours; return(sign); }
/// <summary> /// 正常打卡数据分析 /// </summary> /// <param name="baseEmployee"></param> /// <param name="startTime"></param> /// <param name="endTime"></param> /// <returns></returns> public bool PunchCardDataAnalysis(BaseEmployee baseEmployee, DateTime startTime, DateTime endTime) { if (endTime > DateTime.Now) { endTime = DateTime.Now; } if (!_hrmsCalendarEventses.Any()) { //没有行事历 return(false); } var empNo = baseEmployee.EmpNo; //整理结果 List <HrmsAttAnalysis> hrmsAttAnalyses = new List <HrmsAttAnalysis>(); //所有考考勤数据 List <HrmsAttendance> hrmsAttendances = new HrmsAttendnceBll().GetAttData(empNo, startTime, endTime.AddDays(2)); //所有请假数据 var workleaveTime = DataFactory.Database() .FindListBySql <FormWorkLeave>( $"SELECT fw.* FROM MINICUT.DBO.FormWorkLeave fw,MINICUT.DBO.Form f WHERE fw.FormNo=f.FormNo AND f.FormStatus={(int)Form.StatusEnum.签核完成} AND fw.Starttime>='{startTime}' AND fw.EmpNo='{baseEmployee.EmpNo}' "); //没有考勤数据直反回; //if (!hrmsAttendances.Any()) //{ // return false; //} //要求排班,并且没有排班数据 _shiftSnaps = DataFactory.Database().FindList <HrmsShiftSnaps>($"AND EventEmpNo='{empNo}' and EvenTime Between '{startTime}' and '{endTime}'"); if (baseEmployee.IsShift) { if (!_shiftSnaps.Any()) { return(false); } } //原排班数据 _oldDatAnalyses.AddRange(DataFactory.Database().FindList <HrmsAttAnalysis>($"AND EmpNo='{empNo}' AND attDate BETWEEN '{startTime}' AND '{endTime}' ")); while (startTime <= endTime) { //当天班别 HrmsShiftSnaps shiftSnap; //不需要排班 if (!baseEmployee.IsShift) { var shift = _hrmsShifts.Single(l => l.ShiftId == baseEmployee.DefaultShift); shiftSnap = new HrmsShiftSnaps { ShiftId = shift.ShiftId, WorkStart = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.WorkStart.ToShortTimeString()), WorkStop = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.WorkStop.ToShortTimeString()), Rist1Start = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist1Start.ToShortTimeString()), Rist1Stop = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist1Stop.ToShortTimeString()), Rist2Start = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist2Start.ToShortTimeString()), Rist2Stop = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist2Stop.ToShortTimeString()), Rist3Start = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist3Start.ToShortTimeString()), Rist3Stop = Convert.ToDateTime(startTime.ToShortDateString() + " " + shift.Rist3Stop.ToShortTimeString()), SettlementMin = shift.SettlementMin, SettlementMax = shift.SettlementMax, }; } else { //没有当天排班直接退出 shiftSnap = _shiftSnaps.FirstOrDefault(c => c.EvenTime.Date == startTime.Date); if (shiftSnap?.ShiftId == null) { startTime = startTime.AddDays(1); continue; } } //当天刷卡记录 var day = hrmsAttendances.Where(c => c.SignTime >= startTime.Date && c.SignTime <= startTime.AddDays(2).Date).ToList(); //计算当天上下班时间 string formNoOn = string.Empty; string formNoOff = string.Empty; var hr = new HrmsAttAnalysis { EmpNo = empNo, Shift = shiftSnap.ShiftId, AttDate = startTime.Date, AnalysisTime = DateTime.Now, OnDutty = day.Any() ? this.GetOnDuttyDateTime(shiftSnap.WorkStart, day, ref formNoOn) : HrmsConfig.DefaultDateTime, OffDutty = day.Any() ? this.GetOffDuttyDateTime(shiftSnap.WorkStop, day, shiftSnap.ShiftId, ref formNoOff) : HrmsConfig.DefaultDateTime, //确认当天是否有考勤 FormNo = (!string.IsNullOrEmpty(formNoOn)) ? formNoOn : ((!string.IsNullOrEmpty(formNoOff)) ? formNoOff : null), }; //根据行事历取值 int Event = _hrmsCalendarEventses.Single(m => m.CalendarItem == startTime.Day).D0; //Event = shiftSnap.CalendarEnum; switch (Event) { case 0: //正常班 hr = EventNormal(hr, shiftSnap); break; case 2: //加班 hr = EventWeeken(hr, shiftSnap); break; case 3: //节日加班 hr = EventHoliday(hr, shiftSnap); break; default: break; } //分析处理状态并保存 hr = this.ResultsOfAnalysisAndProcessing(hr, Event); //分析请假 hr = this.WorkLeaveAnalysisAnd(hr, shiftSnap, workleaveTime, Event); hrmsAttAnalyses.Add(hr); startTime = startTime.AddDays(1); } if (!hrmsAttAnalyses.Any()) { return(true); } _newDatAnalyses.AddRange(hrmsAttAnalyses); //分析当月数据 return(true); }
public HrmsAttAnalysis ResultsOfAnalysisAndProcessing(HrmsAttAnalysis hr, int Event) { switch (Event) { case 2: if (hr.OnDutty != HrmsConfig.DefaultDateTime && hr.OffDutty == HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.休息下班未打卡; } else if (hr.OnDutty == HrmsConfig.DefaultDateTime && hr.OffDutty != HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.休息上班未打卡; } else { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.周末; } break; case 3: if (hr.OnDutty != HrmsConfig.DefaultDateTime && hr.OffDutty == HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.休息下班未打卡; } else if (hr.OnDutty == HrmsConfig.DefaultDateTime && hr.OffDutty != HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.休息上班未打卡; } else { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.国假; } break; default: if (hr.OnDutty == HrmsConfig.DefaultDateTime && hr.OffDutty == HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.旷工; } else if (hr.OnDutty == HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.班未打卡; } else if (hr.OffDutty == HrmsConfig.DefaultDateTime) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.班未打卡; } else if (hr.Late > 0 && hr.LeaveEarly > 0) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.迟到早退; } else if (hr.Late > 0) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.迟到; } else if (hr.LeaveEarly > 0) { hr.TreatmentResult = (int)HrmsConfig.AttendanceStatusEnum.早退; } break; } return(hr); }