步步为盈
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
9.7 KiB

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