using BBWYB.Common.Models; using BBWYB.Server.Model; namespace BBWYB.Server.Business { public class TimeLimitRules : IDenpendency { /// /// 计算到期时间算法字典 /// private IDictionary> calculateExpirationTimeAlgorithmDictionary; public TimeLimitRules() { calculateExpirationTimeAlgorithmDictionary = new Dictionary>() { { Enums.TimeLimitTaskType.采购任务, CalculateExpirationTimeFor8WorkHour }, { Enums.TimeLimitTaskType.合格证拟定任务, CalculateExpirationTimeFor8WorkHour }, { Enums.TimeLimitTaskType.合格证补充任务, CalculateExpirationTimeFor2WorkHour } }; } /// /// 计算到期时间 /// /// 任务类型 /// 起点计算时间 /// public DateTime CalculateExpirationTime(Enums.TimeLimitTaskType timeLimitTaskType, DateTime startTime) { return calculateExpirationTimeAlgorithmDictionary[timeLimitTaskType](startTime); } /// /// 计算需要追加的天数,周六追加2天,周日追加1天 /// /// /// private int CalculateAddDay(DayOfWeek dayOfWeek) { if (dayOfWeek == DayOfWeek.Saturday) return 2; return 1; } /// /// 8小时工作时计算到期时间 /// /// 起点时间 /// private DateTime CalculateExpirationTimeFor8WorkHour(DateTime startTime) { int addDay = 0, addHour = 0, addSeconds = 0; //先确定是否为周日 if (startTime.DayOfWeek == DayOfWeek.Sunday) { addDay = 1; addHour = 18; } else { if (startTime.Hour < 9) addHour = 18; else if (startTime.Hour >= 9 && startTime.Hour < 12) { //计算从起点时间的9点开始到当前时间的时差 var timeSpan = DateTime.Now - startTime.Date.AddHours(9); if (timeSpan.TotalMinutes <= 5) { //从9点开始小于5分钟以内,以当天18点结束 addHour = 18; } else { addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 9; addSeconds = (int)timeSpan.TotalSeconds; } } else if (startTime.Hour >= 12 && startTime.Hour < 13) { //下一个工作日的12点结束 addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 12; } else if (startTime.Hour >= 13 && startTime.Hour < 18) { var timeSpan = DateTime.Now - startTime.Date.AddHours(13); //到下一个工作日的当前时间结束 addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 13; addSeconds = (int)timeSpan.TotalSeconds; } else if (startTime.Hour >= 18) { //下一个工作日的18点结束 addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 18; } } return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); } /// /// 2小时工作时计算到期时间 /// /// 起点时间 /// private DateTime CalculateExpirationTimeFor2WorkHour(DateTime startTime) { int addDay = 0, addHour = 0, addSeconds = 0; //先确定是否为周日 if (startTime.DayOfWeek == DayOfWeek.Sunday) { addDay = 1; addHour = 11; } else { if (startTime.Hour < 9) addHour = 11; else if (startTime.Hour >= 9 && startTime.Hour < 12) { //计算从起点时间的9点开始到当前时间的时差 var timeSpan = DateTime.Now - startTime.Date.AddHours(9); if (timeSpan.TotalHours <= 1) { addHour = 11; addSeconds = (int)timeSpan.TotalSeconds; } else { addHour = 13; addSeconds = 7200 - (int)timeSpan.TotalSeconds; } } else if (startTime.Hour >= 12 && startTime.Hour < 13) { addHour = 15; } else if (startTime.Hour >= 13 && startTime.Hour < 18) { var timeSpan = DateTime.Now - startTime.Date.AddHours(13); if (timeSpan.TotalHours <= 3) { addHour = startTime.Hour + 2; addSeconds = startTime.Minute * 60 + startTime.Second; } else { addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 9; addSeconds = Convert.ToInt32(7200 - (startTime - startTime.Date.AddHours(15)).TotalSeconds); } } else if (startTime.Hour >= 18) { //下一个工作日的18点结束 addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 11; } } return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); } } }