using System; using System.Collections.Generic; using System.Text; namespace BBWY.Client.Helpers { public class PackTaskTimerHelper { /// /// 是否停止倒计时 /// /// /// public static bool IsStopTimer(DateTime dateTime) { var hour = dateTime.Hour; if (hour < 9 || hour >= 18 || (hour == 12)) return true; return false; } /* 中转仓各工序时效限制: 待验收:8个工作时 待排单:1个工作时 待包装:8个工作时 待封箱:5个工作时 待贴单:2个工作时 总时长:24个工作时 */ /// /// 待验收:8个工作时 /// const int wait_inspection_task_time = 8; /// /// 待排单:1个工作时 /// const int wait_schedule_task_time = 1; /// /// 待包装:8个工作时 /// const int wait_package_task_time = 8; /// /// 待封箱:5个工作时 /// const int wait_sealbox_task_time = 5; /// /// 待贴单:2个工作时 /// const int wait_stickynote_task_time = 2; /// /// 总时长:24个工作时 /// const int all_task_time = 24; /// /// 计算有效开始时间 /// /// /// public static DateTime AccountEffectiveStartTime(DateTime startTime) { var userStartTime = startTime;//有效开始时间 if (startTime.Hour < 9) { userStartTime = startTime.Date.AddHours(9);//未到9店 按9点计时 } if (startTime.Hour >= 18)//从隔天9点开始计时 { userStartTime = startTime.Date.AddHours(18);//超过18点 按次日9点计时 } if (startTime.Hour == 12) { userStartTime = startTime.Date.AddHours(13);//中午未到13点 按13点计时 } if (userStartTime.DayOfWeek == DayOfWeek.Sunday) { userStartTime = userStartTime.Date.AddDays(1).AddHours(9);//周日算周1 9点开始 } return userStartTime; } /// /// 计算有效完成时间 /// /// 完成时间 /// public static DateTime AccountEffectiveCompletedTime(DateTime endTime) { var userEndTime = endTime;//有效开始时间 if (endTime.Hour < 9) { userEndTime = endTime.Date.AddDays(-1).AddHours(18);//未到9店 按前一天 18点完成 } if (endTime.Hour >= 18) { userEndTime = endTime.Date.AddHours(18);//超过18点 按18点完成 } if (endTime.Hour == 12) { userEndTime = endTime.Date.AddHours(12);//中午未到13点 按12点计时 } if (userEndTime.DayOfWeek == DayOfWeek.Sunday) { userEndTime = userEndTime.Date.AddDays(-1).AddHours(18);//周日算周六 18点完成 } return userEndTime; } //public static DateTime AccountOverTime(DateTime startTime, OverTimeType overTimeType) //{ // double userTime = 0; // switch (overTimeType) // { // case OverTimeType.待验收: // userTime = wait_inspection_task_time; // break; // case OverTimeType.待包装: // userTime = wait_package_task_time; // break; // case OverTimeType.待封箱: // userTime = wait_sealbox_task_time; // break; // case OverTimeType.待贴单: // userTime = wait_stickynote_task_time; // break; // case OverTimeType.待排单: // userTime = wait_schedule_task_time; // break; // default: // break; // } // var userStartTime = AccountEffectiveStartTime(startTime); // return AccountOverTime(userStartTime, userTime); //} /// /// 计算任务超时截止时间 /// /// 有效任务开始时间 /// 有效时长 /// public static DateTime AccountOverTime(DateTime userStartTime, double useTime) { var overTime = userStartTime.AddHours(useTime);//17点 5 if (userStartTime.Hour <= 12 && overTime.Hour > 12)//中午休息时间 { overTime = overTime.AddHours(1); } if (overTime.Hour >= 18) { overTime = overTime.Date.AddDays(1).AddHours(9).Add((overTime - overTime.Date.AddHours(18))); } if (overTime.DayOfWeek == DayOfWeek.Sunday) { overTime = overTime.Date.AddDays(1);//周日算周一 } return overTime; } /// /// 释放挂起任务 增加超时时长 /// /// 有效任务开始时间 /// 有效挂起时长 /// public static DateTime AccountOverTime(DateTime userStartTime, TimeSpan useTime) { var overTime = userStartTime.Add(useTime);//17点 5 if (userStartTime.Hour <= 12 && overTime.Hour > 12)//中午休息时间 { overTime = overTime.AddHours(1); } if (overTime.Hour >= 18) { overTime = overTime.Date.AddDays(1).AddHours(9).Add((overTime - overTime.Date.AddHours(18))); } if (overTime.DayOfWeek == DayOfWeek.Sunday) { overTime = overTime.Date.AddDays(1);//周日算周一 } return overTime; } /// /// 有效任务时长() /// /// /// /// /// 有效挂起时长 /// public static TimeSpan AccountEffectiveTaskDuration(DateTime startTime, DateTime CompletedTime, TimeSpan? EffectiveAbortTaskDuration) { //计算超时天数 如果时间里包含周日 则扣一天 1天按8小时计算 return AccountEffectiveDuration(startTime, CompletedTime).Add(EffectiveAbortTaskDuration ?? TimeSpan.FromHours(0)); } /// /// 计算有效时长(超时时长 任务耗时) /// /// 开始时间 /// 完成时间 /// public static TimeSpan AccountEffectiveDuration(DateTime startTime, DateTime completedTime) { var effectiveStartTime = AccountEffectiveStartTime(startTime); var effectiveCompletedTime = AccountEffectiveCompletedTime(completedTime); var timespan = effectiveCompletedTime - effectiveStartTime; int effectiveDays = timespan.Days - CountSundays(effectiveStartTime, effectiveCompletedTime);//有效相隔天数 var hoursTimeSpan = timespan.Add(TimeSpan.FromDays(-effectiveDays));//计算小时差 //1. 开始时间 12点 结束时间 10点 if (effectiveStartTime.Millisecond > effectiveCompletedTime.Millisecond) { if (effectiveStartTime.Hour <= 12)//-16小时 return hoursTimeSpan.Add(TimeSpan.FromHours(-16)).Add(TimeSpan.FromDays(effectiveDays)); else { if (effectiveCompletedTime.Hour <= 12) return hoursTimeSpan.Add(TimeSpan.FromHours(-15)).Add(TimeSpan.FromDays(effectiveDays )); else return hoursTimeSpan.Add(TimeSpan.FromHours(-16)).Add(TimeSpan.FromDays(effectiveDays)); } } else//2. 开始时间 10点 结束时间 11点/ 14点 { if (effectiveCompletedTime.Hour > 12) if (effectiveStartTime.Hour <= 12) return hoursTimeSpan.Add(TimeSpan.FromHours(-1)).Add(TimeSpan.FromDays(effectiveDays)); return hoursTimeSpan.Add(TimeSpan.FromDays(effectiveDays)); } } /// /// 判断两个日期之间有多少个星期日 /// /// /// /// private static int CountSundays(DateTime startDate, DateTime endDate) { int sundays = 0; while (startDate <= endDate) { if (startDate.DayOfWeek == DayOfWeek.Sunday) { sundays++; } startDate = startDate.AddDays(1); } return sundays; } } }