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); }
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); }
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); }