예제 #1
0
        double calcRelaxState(TimeRecordsList records, long relaxByHour, long maxRelaxTime)
        {
            double result   = 1.0;
            long   lastTime = 0;
            var    relax    = new TimeRecord.status();

            for (int i = records.Count - 1; i >= -1; i--)
            {
                if (relax.modify(records[i]) || (i < 0 && lastTime != 0))
                {
                    if (relax.workOldState == TimeRecord.status.st.No)
                    {
                        if (lastTime == 0)
                        {
                            throw new Exception("В расчёте времени отдыха зафиксирована невозможная ситуация типа TimeRecord.status.st.No==TimeRecord.status.st.Unknown");
                        }

                        long relaxTime = records[i].timeMark - lastTime;
                        if (relaxTime < minRelaxInterval)
                        {
                            relaxTime = 0;
                        }

                        result += (double)relaxTime / (double)relaxByHour / 2.0; // в 0 за два часа
                        if (result > 1.0)
                        {
                            result = 1.0;   // нельзя отдохнуть более, чем на 100%
                        }
                    }
                    else
                    if (relax.workOldState == TimeRecord.status.st.Yes)
                    {
                        if (lastTime == 0)
                        {
                            throw new Exception("В расчёте времени отдыха зафиксирована невозможная ситуация типа TimeRecord.status.st.Yes==TimeRecord.status.st.Unknown");
                        }

                        result -= (double)(records[i].timeMark - lastTime) / (double)(hour - relaxByHour) / 2.0;  // на 1 за два часа (работы и отдыха в заданном режиме)
                    }

                    if (relax.work != TimeRecord.status.st.Unknown)
                    {
                        lastTime = records[i].timeMark;
                    }
                    else
                    {
                        lastTime = 0;
                    }
                }
            }

            if (result > 1.0)
            {
                result = 1.0;   // нельзя отдохнуть более, чем на 100%
            }
            return(result);
        }
예제 #2
0
        private long calcRelaxTime(List <TimeRecord> records, long minFullRelaxInterval, long maxRelaxTime)
        {
            long result   = 0;
            long sres     = 0;
            long lastMark = records[records.Count - 1].timeMark;
            var  relax    = new TimeRecord.status();

            for (int i = records.Count - 1; i >= 0; i--)
            {
                if (relax.work == TimeRecord.status.st.No)
                {
                    sres += records[i].timeMark - lastMark;
                }

                relax.modify(records[i]);
                if (relax.work == TimeRecord.status.st.Yes)
                {
                    if (sres > minRelaxInterval)
                    {
                        result += getLogicRelaxTime(sres, maxRelaxTime, minFullRelaxInterval); //MIN(sres, maxRelaxTime);
                    }
                    sres = 0;
                }

                lastMark = records[i].timeMark;
            }

            if (relax.work == TimeRecord.status.st.No)
            {
                sres += DateTime.Now.Ticks - lastMark;
            }

            if (sres > minRelaxInterval)
            {
                result += getLogicRelaxTime(sres, maxRelaxTime, minFullRelaxInterval);
            }

            return(result);
        }
예제 #3
0
        private long calcWorkTime(List <TimeRecord> records, long minFullRelaxInterval, long maxRelaxTime)
        {
            int  errorOccur = 0;
            long result     = 0;
            long lastMark   = records[records.Count - 1].timeMark;

            var work = new TimeRecord.status();

            for (int i = records.Count - 1; i >= 0; i--)
            {
                if (work.work == TimeRecord.status.st.Yes)
                {
                    var sres = records[i].timeMark - lastMark;
                    if (sres < 0)
                    {
                        errorOccur++;
                    }
                    result += sres;
                }

                work.modify(records[i]);

                lastMark = records[i].timeMark;
            }

            if (work.work == TimeRecord.status.st.Yes)
            {
                result += DateTime.Now.Ticks - records[0].timeMark;
            }

            if (errorOccur > 0)
            {
                Program.ToLogFile("Произошла ошибка: в функции calcWorkTime найдена отрицательная длительность " + errorOccur + " раз");
            }

            return(result);
        }