Beispiel #1
0
        public string AnalyzeOTType(AtCalculationInfo _store, List <tottype> _lstOTType)
        {
            //判断加班类型的顺序: 个人日历>轮班>公司日历>默认日历
            string retOTType = string.Empty;

            var q = from p in _lstOTType
                    where p.isdf == "Y"
                    select p;

            //默认日期
            if (q.ToList().Count < 1)
            {
                //没有指定默认日历
            }
            else
            {
                retOTType = q.ToList().First().otcd;
            }

            //公司日历
            if (_store.CalendarOTType != null)
            {
                if (_store.CalendarOTType != null)
                {
                    if (_store.CalendarOTType.Trim() != string.Empty)
                    {
                        retOTType = _store.CalendarOTType;
                    }
                }
            }

            //轮班日历
            if (_store.RosterOTType != null)
            {
                if (_store.RosterOTType.Trim() != string.Empty)
                {
                    retOTType = _store.RosterOTType;
                }
            }

            //个人日历
            if (_store.PrivateOTType != null)
            {
                if (_store.PrivateOTType.Trim() != string.Empty)
                {
                    retOTType = _store.PrivateOTType;
                }
            }

            return(retOTType);
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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;
        }