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