private void AnalyzeOneDay(vw_employment _emp, tatrosdtl curRosterDtl, tatshift curShift, tatroshi curRosterHistory, DateTime _calcStart, DateTime _calcEnd, totaplctn _otApp, bool _isSaveDetail) { store = new AtCalculationInfo(); store.EmpInfo = _emp; store.CurDay = _calcStart; //curDayR = store.CurDay; //取得标准班次设定时间 analatBll.GetStandardValue(curRosterDtl, curShift, ref store); //判断是否是休息日 analatBll.CheckIsRestDay(curRosterDtl, curShift, curRosterHistory, lstPriCalendar, ref store); AnalyzeOT(ref store, curShift, lstOriAtData, _isSaveDetail); TotalOTHours += store.OTHours; }
public void DoAnalyze(tlvleaapp _leaveApp, bool _isSaveDetail) { for (int i = 0; i < lstStaff.Count; i++) { TotalLvHours = 0; TotalLvDays = 0; try { DateTime calcStart = AnalStartDate; DateTime calcEnd = AnalEndDate; DateTime tmpStart = calcStart; DateTime tmpEnd; //如果请假跨天,需要拆分成多条数据 for (float k = 0; k < (calcEnd - calcStart).TotalDays; k++) { if ((calcEnd - tmpStart).TotalDays > 1) { tmpEnd = Convert.ToDateTime(UtilDatetime.FormatDate1(tmpStart.AddDays(1)) + " 00:00:00"); } else { tmpEnd = calcEnd; } //取轮班历史 List <tatroshi> lstEmpRosterHistory = lstRosterHistory.Where(p => p.emno == lstStaff[i].emno && ((p.exdt.HasValue == false) || (p.exdt.Value > tmpEnd)) && (p.efdt <= tmpStart) ).ToList(); //确定轮班和班次 if (lstEmpRosterHistory.Count > 0) { //如果发现多条,则只取第一条 tatroshi curRosterHistory = lstEmpRosterHistory[0]; List <tatrosdtl> lstEmpRosterDtl = lstRosterDetails.Where(p => p.rscd == curRosterHistory.rscd).ToList(); //确定轮班明细和班次 tatrosdtl curRosterDtl = getCurrentRoster(curRosterHistory, lstEmpRosterDtl, tmpStart); tatshift curShift = curRosterDtl.tatshift; //分析此天的休假 AnalyzeOneDay(lstStaff[i], curRosterDtl, curShift, curRosterHistory, tmpStart, tmpEnd, _leaveApp, _isSaveDetail); tmpStart = tmpEnd; } else { //如果没有定义轮班该如何计算???? } } } catch (Exception ex) { throw ex; } } }
public Double CountLeaveTime(DateTime?_startDate, DateTime?_endDate, tatshift _shift, AtCalculationInfo _store) { double lvHours = 0; double tmpHours = 0; if (_shift == null) { return(0); } else { if (_startDate < _store.StdTimeIn) { _startDate = _store.StdTimeIn; } if (_endDate > _store.StdTimeOut) { _endDate = _store.StdTimeOut; } if (_shift.igrl == "Y") { //如果小休属于工作时数内,则请假要考虑 if (_shift.rttm1 > 0) { //有小休1 if ((_startDate < _store.StdRest1Start) && (_endDate > _store.StdRest1End)) { tmpHours = (_store.StdRest1End.Value - _store.StdRest1Start.Value).TotalHours; } if ((_startDate < _store.StdRest1Start) && (_endDate <= _store.StdRest1End) && (_endDate > _store.StdRest1Start)) { tmpHours = (_endDate.Value - _store.StdRest1Start.Value).TotalHours; } if ((_startDate >= _store.StdRest1Start) && (_endDate > _store.StdRest1End) && (_startDate < _store.StdRest1End)) { tmpHours = (_store.StdRest1End.Value - _startDate.Value).TotalHours; } if ((_startDate >= _store.StdRest1Start) && (_endDate <= _store.StdRest1End)) { tmpHours = (_endDate.Value - _startDate.Value).TotalHours; } } } if (_shift.igbl == "Y") { //如果午休属于工作时数,则在请假时要考虑 if (_shift.bken == "Y") { //有午休 if ((_startDate < _store.StdBreakStart) && (_endDate > _store.StdBreakEnd)) { tmpHours += (_store.StdBreakEnd.Value - _store.StdBreakStart.Value).TotalHours; } if ((_startDate < _store.StdBreakStart) && (_endDate <= _store.StdBreakEnd) && (_endDate > _store.StdBreakStart)) { tmpHours += (_endDate.Value - _store.StdBreakStart.Value).TotalHours; } if ((_startDate >= _store.StdBreakStart) && (_endDate > _store.StdBreakEnd) && (_startDate < _store.StdBreakEnd)) { tmpHours += (_store.StdBreakEnd.Value - _startDate.Value).TotalHours; } if ((_startDate >= _store.StdBreakStart) && (_endDate <= _store.StdBreakEnd)) { tmpHours += (_endDate.Value - _startDate.Value).TotalHours; } } } if (_shift.igrl == "Y") { //小休在计算休假时考虑 if (_shift.rttm2 > 0) { //有小休1 if ((_startDate < _store.StdRest2Start) && (_endDate > _store.StdRest2End)) { tmpHours += (_store.StdRest2End.Value - _store.StdRest2Start.Value).TotalHours; } if ((_startDate < _store.StdRest2Start) && (_endDate <= _store.StdRest2End) && (_endDate > _store.StdRest2Start)) { tmpHours += (_endDate.Value - _store.StdRest2Start.Value).TotalHours; } if ((_startDate >= _store.StdRest2Start) && (_endDate > _store.StdRest2End) && (_startDate < _store.StdRest2End)) { tmpHours += (_store.StdRest2End.Value - _startDate.Value).TotalHours; } if ((_startDate >= _store.StdRest2Start) && (_endDate <= _store.StdRest2End)) { tmpHours += (_endDate.Value - _startDate.Value).TotalHours; } } } lvHours = (_endDate.Value - _startDate.Value).TotalHours - tmpHours; return(lvHours); } }
private void AnalyzeOneDay(vw_employment _emp, tatrosdtl curRosterDtl, tatshift curShift, tatroshi curRosterHistory, DateTime _calcStart, DateTime _calcEnd, tlvleaapp _leaveApp, bool _isSaveDetail) { store = new AtCalculationInfo(); store.EmpInfo = _emp; store.CurDay = _calcStart; //curDayR = store.CurDay; //取得标准班次设定时间 analatBll.GetStandardValue(curRosterDtl, curShift, ref store); //判断是否是休息日 analatBll.CheckIsRestDay(curRosterDtl, curShift, curRosterHistory, lstPriCalendar, ref store); if (store.IsRestDay == false) { #region 非休息日 if ((_calcStart <= store.StdTimeIn) && (_calcEnd >= store.StdTimeOut)) { //抓班次设定的工作小时数和天数 store.LvStart = store.StdTimeIn; store.LvEnd = store.StdTimeOut; store.LvHours = Convert.ToDouble(curShift.wkhr); store.LvDays = Convert.ToDouble(curShift.wkda); } else { if (_calcStart <= store.StdTimeIn) { store.LvStart = store.StdTimeIn; } else { store.LvStart = _calcStart; } if (_calcEnd >= store.StdTimeOut) { store.LvEnd = store.StdTimeOut; } else { store.LvEnd = _calcEnd; } store.LvHours = CountLeaveTime(store.LvStart, store.LvEnd, curShift, store); store.LvHours = Math.Round(store.LvHours, 2); //计算天数 store.LvDays = Math.Round((store.LvHours / Convert.ToDouble(curShift.wkhr)) * Convert.ToDouble(curShift.wkda), 2); } #endregion } else { #region 休息日 store.LvHours = 0; store.LvDays = 0; #endregion } TotalLvHours += store.LvHours; TotalLvDays += store.LvDays; if ((_isSaveDetail) && (_leaveApp != null) && (store.LvHours > 0)) { //如果需要保存则保存每一条明细到DTL表 tlvleaapd newdtl = new tlvleaapd(); newdtl.emno = _emp.emno; newdtl.days = store.LvDays; newdtl.hurs = store.LvHours; newdtl.ltcd = _leaveApp.ltcd; newdtl.apno = _leaveApp.apno; newdtl.totm = store.LvEnd.Value; newdtl.frtm = store.LvStart.Value; DoInsert <tlvleaapd>(newdtl); } }
public void AnalyzeOT(ref AtCalculationInfo _store, tatshift curShift, List <tatoridat> _lstOriAtData, bool _isSaveDetail) { DateTime effOTStart = DateTime.Parse(UtilDatetime.FormatDate1(_store.CurDay) + " " + curShift.eati); // analatBll.CompareTime(_store.CurDay, curShift.eati, curShift.tmin); //有效加班时间=第二日最早有效上班打卡时间之前 DateTime effOTEnd = effOTStart.AddDays(1); //analatBll.CompareTime(_store.CurDay, curShift.tmot, curShift.lato); DateTime otStart = analatBll.CompareTime(_store.CurDay, curShift.tmin, curShift.nots); double othr = 0; double othrReal = 0; double totalOthr = 0; double totalOthrReal = 0; List <tatshfott> lstShiftOT = new List <tatshfott>(); if (lstOTType == null) { lstOTType = analatBll.GetOTType(); } lstShiftOT = new BaseBll().GetSelectedRecords <tatshfott>(new List <ColumnInfo>() { }).OrderBy(p => p.otst).ToList(); string otType = AnalyzeOTType(_store, lstOTType); string sfid = _store.EmpInfo.sfid; List <tatoridat> lstEmpOriAtData = _lstOriAtData.Where(p => p.sfid == sfid && p.retm >= effOTStart && p.retm < effOTEnd) .OrderBy(p => p.retm) .ToList(); if (lstEmpOriAtData.Count < 1) { //没有加班打卡记录 othr = 0; othrReal = 0; totalOthr = 0; totalOthrReal = 0; } else { otdetailDal dal = new otdetailDal(); //有上班前加班打卡记录 //暂时不考虑上班打卡,2009-01-01 by Administrator //if (lstEmpOriAtData.First().retm < _store.StdTimeIn) //{ // TimeSpan diff = _store.StdTimeIn.Value - lstEmpOriAtData.First().retm; // if (diff.TotalMinutes > curShift.miot) // { // othr = (diff.TotalMinutes % curShift.otun.Value) * curShift.otun.Value / 60; // othrReal = diff.TotalMinutes / 60; // } // else // { // othr = 0; // othrReal = 0; // } // if ((_isSaveDetail) && (othr!=0)) // dal.SaveOTDetail(_store.EmpInfo.emno, otType, _store.CurDay, lstEmpOriAtData.First().retm, _store.StdTimeIn.Value, othr, othrReal, 0.0); //} //有下班后加班打卡记录 if (lstEmpOriAtData.Last().retm > otStart) { if (lstShiftOT.Count > 0) { //定义了加班权重 DateTime retm = lstEmpOriAtData.Last().retm; DateTime otst; List <DateTime> lstDateTime = new List <DateTime>(); List <string> lstShiftOTType = new List <string>(); lstDateTime.Add(otStart); for (int i = 0; i < lstShiftOT.Count; i++) { tatshfott shiftOT = lstShiftOT[i]; otst = analatBll.CompareTime(otStart, otStart.ToString("HH:mm:ss"), shiftOT.otst); if (otst > retm) { lstDateTime.Add(retm); } else { if (i == (lstShiftOT.Count - 1)) { lstDateTime.Add(retm); } else { lstDateTime.Add(otst); } } lstShiftOTType.Add(shiftOT.otcd); } for (int i = 1; i < lstDateTime.Count; i++) { //如果下一个时段的比最小加班时间小,则累计到上一个区间 TimeSpan diff1 = new TimeSpan(0, 0, 0); if ((i + 1) <= (lstDateTime.Count - 1)) { diff1 = lstDateTime[i + 1] - lstDateTime[i]; if (diff1.TotalMinutes > curShift.miot) { diff1 = new TimeSpan(0, 0, 0); } } TimeSpan diff = lstDateTime[i] - lstDateTime[i - 1] + diff1; if (diff.TotalMinutes > curShift.miot) { othr = Math.Floor(diff.TotalMinutes / curShift.otun.Value) * curShift.otun.Value / 60; othrReal = diff.TotalMinutes / 60; totalOthr += othr; totalOthrReal += othrReal; if ((_isSaveDetail) && (othr != 0)) { dal.SaveOTDetail(_store.EmpInfo.emno, lstShiftOTType[i - 1], _store.CurDay, lstDateTime[i - 1], lstDateTime[i], othr, othrReal, 0); } } } } else { //没有定义加班权重 TimeSpan diff = lstEmpOriAtData.Last().retm - otStart; if (diff.TotalMinutes > curShift.miot) { othr = Math.Floor(diff.TotalMinutes / curShift.otun.Value) * curShift.otun.Value / 60; othrReal = diff.TotalMinutes / 60; totalOthr += othr; totalOthrReal += othrReal; if ((_isSaveDetail) && (othr != 0)) { dal.SaveOTDetail(_store.EmpInfo.emno, otType, _store.CurDay, otStart, lstEmpOriAtData.Last().retm, othr, othrReal, 0); } } } } } otcd = otType; _store.OTHours = totalOthr; }