7 changed files with 221 additions and 27 deletions
@ -0,0 +1,168 @@ |
|||
using BBWYB.Common.Models; |
|||
using BBWYB.Server.Model; |
|||
|
|||
namespace BBWYB.Server.Business |
|||
{ |
|||
public class TimeLimitRules : IDenpendency |
|||
{ |
|||
/// <summary>
|
|||
/// 计算到期时间算法字典
|
|||
/// </summary>
|
|||
private IDictionary<Enums.TimeLimitTaskType, Func<DateTime, DateTime>> calculateExpirationTimeAlgorithmDictionary; |
|||
|
|||
public TimeLimitRules() |
|||
{ |
|||
calculateExpirationTimeAlgorithmDictionary = new Dictionary<Enums.TimeLimitTaskType, Func<DateTime, DateTime>>() |
|||
{ |
|||
{ Enums.TimeLimitTaskType.采购任务, CalculateExpirationTimeFor8WorkHour }, |
|||
{ Enums.TimeLimitTaskType.合格证拟定任务, CalculateExpirationTimeFor8WorkHour }, |
|||
{ Enums.TimeLimitTaskType.合格证补充任务, CalculateExpirationTimeFor2WorkHour } |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 计算到期时间
|
|||
/// </summary>
|
|||
/// <param name="timeLimitTaskType">任务类型</param>
|
|||
/// <param name="startTime">起点计算时间</param>
|
|||
/// <returns></returns>
|
|||
public DateTime CalculateExpirationTime(Enums.TimeLimitTaskType timeLimitTaskType, DateTime startTime) |
|||
{ |
|||
return calculateExpirationTimeAlgorithmDictionary[timeLimitTaskType](startTime); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 计算需要追加的天数,周六追加2天,周日追加1天
|
|||
/// </summary>
|
|||
/// <param name="dayOfWeek"></param>
|
|||
/// <returns></returns>
|
|||
private int CalculateAddDay(DayOfWeek dayOfWeek) |
|||
{ |
|||
if (dayOfWeek == DayOfWeek.Saturday) |
|||
return 2; |
|||
return 1; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 8小时工作时计算到期时间
|
|||
/// </summary>
|
|||
/// <param name="startTime">起点时间</param>
|
|||
/// <returns></returns>
|
|||
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); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 2小时工作时计算到期时间
|
|||
/// </summary>
|
|||
/// <param name="startTime">起点时间</param>
|
|||
/// <returns></returns>
|
|||
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); |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue