2 changed files with 323 additions and 4 deletions
@ -0,0 +1,302 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace BBWY.Client.Helpers |
||||
|
{ |
||||
|
public class PackTaskTimerHelper |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 是否停止倒计时
|
||||
|
/// </summary>
|
||||
|
/// <param name="dateTime"></param>
|
||||
|
/// <returns></returns>
|
||||
|
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个工作时 |
||||
|
|
||||
|
*/ |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 待验收:8个工作时
|
||||
|
/// </summary>
|
||||
|
const int wait_inspection_task_time = 8; |
||||
|
/// <summary>
|
||||
|
/// 待排单:1个工作时
|
||||
|
/// </summary>
|
||||
|
const int wait_schedule_task_time = 1; |
||||
|
/// <summary>
|
||||
|
/// 待包装:8个工作时
|
||||
|
/// </summary>
|
||||
|
const int wait_package_task_time = 8; |
||||
|
/// <summary>
|
||||
|
/// 待封箱:5个工作时
|
||||
|
/// </summary>
|
||||
|
const int wait_sealbox_task_time = 5; |
||||
|
/// <summary>
|
||||
|
/// 待贴单:2个工作时
|
||||
|
/// </summary>
|
||||
|
const int wait_stickynote_task_time = 2; |
||||
|
/// <summary>
|
||||
|
/// 总时长:24个工作时
|
||||
|
/// </summary>
|
||||
|
const int all_task_time = 24; |
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 计算有效开始时间
|
||||
|
/// </summary>
|
||||
|
/// <param name="startTime"></param>
|
||||
|
/// <returns></returns>
|
||||
|
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; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 计算有效完成时间
|
||||
|
/// </summary>
|
||||
|
/// <param name="endTime">完成时间</param>
|
||||
|
/// <returns></returns>
|
||||
|
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);
|
||||
|
|
||||
|
//}
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 计算任务超时截止时间
|
||||
|
/// </summary>
|
||||
|
/// <param name="userStartTime">有效任务开始时间</param>
|
||||
|
/// <param name="useTime">有效时长</param>
|
||||
|
/// <returns></returns>
|
||||
|
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; |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 释放挂起任务 增加超时时长
|
||||
|
/// </summary>
|
||||
|
/// <param name="userStartTime">有效任务开始时间</param>
|
||||
|
/// <param name="useTime">有效挂起时长</param>
|
||||
|
/// <returns></returns>
|
||||
|
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; |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 有效任务时长()
|
||||
|
/// </summary>
|
||||
|
/// <param name="startTime"></param>
|
||||
|
/// <param name="CompletedTime"></param>
|
||||
|
/// /// <param name="EffectiveAbortTaskDuration"> 有效挂起时长</param>
|
||||
|
/// <returns></returns>
|
||||
|
public static TimeSpan AccountEffectiveTaskDuration(DateTime startTime, DateTime CompletedTime, TimeSpan? EffectiveAbortTaskDuration) |
||||
|
{ |
||||
|
//计算超时天数 如果时间里包含周日 则扣一天 1天按8小时计算
|
||||
|
return AccountEffectiveDuration(startTime, CompletedTime).Add(EffectiveAbortTaskDuration ?? TimeSpan.FromHours(0)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 计算有效时长(超时时长 任务耗时)
|
||||
|
/// </summary>
|
||||
|
/// <param name="startTime">开始时间</param>
|
||||
|
/// <param name="completedTime">完成时间</param>
|
||||
|
/// <returns></returns>
|
||||
|
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)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 判断两个日期之间有多少个星期日
|
||||
|
/// </summary>
|
||||
|
/// <param name="startDate"></param>
|
||||
|
/// <param name="endDate"></param>
|
||||
|
/// <returns></returns>
|
||||
|
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; |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue