From 0dd7da64123501a92b313d17cb3ee3c64986c079 Mon Sep 17 00:00:00 2001 From: "506583276@qq.com" <506583276@qq.com> Date: Wed, 29 Nov 2023 20:11:24 +0800 Subject: [PATCH] 1 --- BBWY.Client/Helpers/PackTaskTimerHelper.cs | 302 ++++++++++++++++++ .../PackTask/WareHouseListViewModel.cs | 25 +- 2 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 BBWY.Client/Helpers/PackTaskTimerHelper.cs diff --git a/BBWY.Client/Helpers/PackTaskTimerHelper.cs b/BBWY.Client/Helpers/PackTaskTimerHelper.cs new file mode 100644 index 00000000..feacb6f9 --- /dev/null +++ b/BBWY.Client/Helpers/PackTaskTimerHelper.cs @@ -0,0 +1,302 @@ +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; + } + } +} diff --git a/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs b/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs index 17938dc4..d5030e58 100644 --- a/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs +++ b/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs @@ -1135,7 +1135,7 @@ namespace BBWY.Client.ViewModels.PackTask { - if (IsPassInspection||model.TaskAbortTime != null)//验收过 跳过询问 + if (IsPassInspection || model.TaskAbortTime != null)//验收过 跳过询问 { isqualityCer = true; return; @@ -2371,6 +2371,7 @@ namespace BBWY.Client.ViewModels.PackTask var packtasks = PackTaskList.Where(p => p.TaskState == Models.TaskState.待验收 && p.QualityCompletionOverTime != null && p.TaskAbortTime == null).ToList(); if (packtasks.Count() > 0) { + Thread.Sleep(1000); IsStartThread = true; while (IsStartThread) { @@ -2378,11 +2379,27 @@ namespace BBWY.Client.ViewModels.PackTask { foreach (var item in packtasks) { + //TimeSpan datetime; + //if (item.SendToSetSkuConfigureTime != null) + // datetime = item.QualityCompletionOverTime.Value.Subtract(item.SendToSetSkuConfigureTime.Value); + //else + // datetime = item.QualityCompletionOverTime.Value.Subtract(DateTime.Now); + //item.QualityRemainTime = OverTimeHelper.GetTimeString(datetime); + //if (datetime.TotalMilliseconds > 0) + //{ + // item.IsQualityOverTime = false; + + //} + //else + //{ + // item.IsQualityOverTime = true; + //} + TimeSpan datetime; - if (item.SendToSetSkuConfigureTime != null) - datetime = item.QualityCompletionOverTime.Value.Subtract(item.SendToSetSkuConfigureTime.Value); + if (item.QualityCompletionOverTime.Value > DateTime.Now) + datetime = PackTaskTimerHelper.AccountEffectiveDuration(DateTime.Now, item.QualityCompletionOverTime.Value); else - datetime = item.QualityCompletionOverTime.Value.Subtract(DateTime.Now); + datetime = -PackTaskTimerHelper.AccountEffectiveDuration( item.QualityCompletionOverTime.Value, DateTime.Now); item.QualityRemainTime = OverTimeHelper.GetTimeString(datetime); if (datetime.TotalMilliseconds > 0) {