diff --git a/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs index 6d82ec4..aaa741e 100644 --- a/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs +++ b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs @@ -1,4 +1,5 @@ using BBWYB.Server.Business; +using BBWYB.Server.Model; using BBWYB.Server.Model.Dto; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; @@ -55,7 +56,7 @@ namespace BBWYB.Server.API.Controllers /// /// [HttpPost] - public IList TimeOutStatistics([FromBody]QueryTimeOutRequest request) + public IList TimeOutStatistics([FromBody] QueryTimeOutRequest request) { return timeLimitTaskBusiness.TimeOutStatistics(request); } @@ -69,5 +70,29 @@ namespace BBWYB.Server.API.Controllers { timeLimitTaskBusiness.EditTimeLimitTaskRemark(request); } + + /// + /// 测试计算过期时间 + /// + /// + /// 起点时间 + [HttpGet] + [AllowAnonymous] + public DateTime TestExpireTime([FromQuery] Enums.TimeLimitTaskType timeLimitTaskType, [FromQuery] DateTime startTime) + { + return timeLimitTaskBusiness.TestExpireTime(timeLimitTaskType, startTime); + } + + /// + /// 测试计算剩余时间 + /// + /// + /// + [HttpGet] + [AllowAnonymous] + public (long, TimeSpan) TextLessTime([FromQuery] DateTime expireTime) + { + return timeLimitTaskBusiness.TextLessTime(expireTime); + } } } diff --git a/BBWYB.Server.Business/Order/OrderBusiness.cs b/BBWYB.Server.Business/Order/OrderBusiness.cs index e24e469..1f08dec 100644 --- a/BBWYB.Server.Business/Order/OrderBusiness.cs +++ b/BBWYB.Server.Business/Order/OrderBusiness.cs @@ -25,11 +25,14 @@ namespace BBWYB.Server.Business private Lazy qikuManagerLazy; private Lazy opPlatformClientFactoryLazy; private Lazy restApiServiceLazy; + private Lazy timeLimitRulesLazy; private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value; private RestApiService restApiService => restApiServiceLazy.Value; private QiKuManager qikuManager => qikuManagerLazy.Value; + private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + private List hgzTaskTypeList; public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) @@ -37,7 +40,7 @@ namespace BBWYB.Server.Business qikuManagerLazy = new Lazy(() => serviceProvider.GetService()); opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); restApiServiceLazy = new Lazy(() => serviceProvider.GetService()); - + timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); waitConfigStateList = new List() { Enums.PackConfigState.待配置, Enums.PackConfigState.需修改 }; hgzTaskTypeList = new List() @@ -372,6 +375,12 @@ namespace BBWYB.Server.Business var orderTimeLimitTaskList = fsql.Select().Where(t => orderIdList.Contains(t.OrderId)) .ToList(); + foreach (var task in orderTimeLimitTaskList) + { + if (task.CompletionTime == null) + task.RemainingTime = timeLimitRules.CalculateLessTimeForWorkHour(task.ExpirationTime.Value); + } + foreach (var order in orderList) { foreach (var orderSku in order.ItemList) diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs index 333142d..fd19236 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs @@ -66,7 +66,7 @@ namespace BBWYB.Server.Business else if (startTime.Hour >= 9 && startTime.Hour < 12) { //计算从起点时间的9点开始到当前时间的时差 - var timeSpan = DateTime.Now - startTime.Date.AddHours(9); + var timeSpan = startTime - startTime.Date.AddHours(9); if (timeSpan.TotalMinutes <= 5) { //从9点开始小于5分钟以内,以当天18点结束 @@ -87,7 +87,7 @@ namespace BBWYB.Server.Business } else if (startTime.Hour >= 13 && startTime.Hour < 18) { - var timeSpan = DateTime.Now - startTime.Date.AddHours(13); + var timeSpan = startTime - startTime.Date.AddHours(13); //到下一个工作日的当前时间结束 addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 13; @@ -124,17 +124,17 @@ namespace BBWYB.Server.Business addHour = 11; else if (startTime.Hour >= 9 && startTime.Hour < 12) { - //计算从起点时间的9点开始到当前时间的时差 - var timeSpan = startTime - startTime.Date.AddHours(9); - if (timeSpan.TotalHours <= 1) + //如果在10点钟以前,则加两个小时 + if (startTime.Hour < 10) { addHour = 11; - addSeconds = (int)timeSpan.TotalSeconds; + addSeconds = Convert.ToInt32((startTime - startTime.Date.AddHours(9)).TotalSeconds); } else { addHour = 13; - addSeconds = 7200 - (int)timeSpan.TotalSeconds; + var to12senconds = Convert.ToInt32((startTime.Date.AddHours(12) - startTime).TotalSeconds); + addSeconds = 7200 - to12senconds; } } else if (startTime.Hour >= 12 && startTime.Hour < 13) @@ -143,18 +143,22 @@ namespace BBWYB.Server.Business } else if (startTime.Hour >= 13 && startTime.Hour < 18) { - var timeSpan = startTime - startTime.Date.AddHours(13); - - if (timeSpan.TotalHours <= 3) + if (startTime.Hour < 16) { addHour = startTime.Hour + 2; addSeconds = startTime.Minute * 60 + startTime.Second; } + else if (startTime.Hour == 16 && startTime.Minute <= 5) + { + //从16点开始小于5分钟以内,以当天18点结束 + addHour = 18; + } else { addDay = CalculateAddDay(startTime.DayOfWeek); addHour = 9; - addSeconds = Convert.ToInt32(7200 - (startTime - startTime.Date.AddHours(16)).TotalSeconds); + var to18senconds = Convert.ToInt32((startTime.Date.AddHours(18) - startTime).TotalSeconds); + addSeconds = 7200 - to18senconds; } } else if (startTime.Hour >= 18) @@ -166,5 +170,76 @@ namespace BBWYB.Server.Business } return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); } + + /// + /// 计算剩余任务时间(秒) + /// + /// + /// + public long CalculateLessTimeForWorkHour(DateTime expirationTime) + { + if (DateTime.Now >= expirationTime) + return 0; + + //强制过期时间在工作时间点内 + if (expirationTime.Hour < 9) + expirationTime = expirationTime.Date.AddHours(9); + else if (expirationTime.Hour >= 12 && expirationTime.Hour < 13) + expirationTime = expirationTime.Date.AddHours(12); + else if (expirationTime.Hour >= 18) + expirationTime = expirationTime.Date.AddDays(CalculateAddDay(expirationTime.DayOfWeek)).AddHours(9); + + var startTime = DateTime.Now; + long lessTime = 0; + while (true) + { + //把非工作时间段转换成工作时间段 + if (startTime.DayOfWeek == DayOfWeek.Sunday) + { + startTime = startTime.Date.AddDays(1).AddHours(9); + } + else + { + if (startTime.Hour < 9) + startTime = startTime.Date.AddHours(9); + else if (startTime.Hour >= 12 && startTime.Hour < 13) + startTime = startTime.Date.AddHours(13); + else if (startTime.Hour >= 18) + startTime = startTime.Date.AddDays(CalculateAddDay(startTime.DayOfWeek)).AddHours(9); + } + + //计算上午工作时间段 + if (startTime.Hour >= 9 && startTime.Hour < 12) + { + if (expirationTime <= startTime.Date.AddHours(12)) + { + lessTime += Convert.ToInt32((expirationTime - startTime).TotalSeconds); + break; + } + else + { + lessTime += 10800; + startTime = startTime.Date.AddHours(13); + } + } + + //计算下午工作时间段 + if (startTime.Hour >= 13 && startTime.Hour < 18) + { + if (expirationTime <= startTime.Date.AddHours(18)) + { + lessTime += Convert.ToInt32((expirationTime - startTime).TotalSeconds); + break; + } + else + { + lessTime += 18000; + startTime = startTime.Date.AddDays(CalculateAddDay(startTime.DayOfWeek)).AddHours(9); + } + } + + } + return lessTime; + } } } diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs index 9f16e05..783ee79 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -53,7 +53,7 @@ namespace BBWYB.Server.Business OrderSn = o.OrderSn, ShopId = o.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务, - ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now) + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now), //ExpirationTime = DateTime.Now.AddDays(1), Remark = "RepairOrderComputationTask" }).ToList(); @@ -92,6 +92,8 @@ namespace BBWYB.Server.Business { var shopId = task.ShopId.ToString(); task.ShopName = shopList.FirstOrDefault(s => s.ShopId == shopId)?.ShopName; + if (task.CompletionTime == null) + task.RemainingTime = timeLimitRules.CalculateLessTimeForWorkHour(task.ExpirationTime.Value); } return new TimeLimitTaskListResponse() { @@ -174,5 +176,17 @@ namespace BBWYB.Server.Business { fsql.Update(request.TaskId).Set(t => t.Remark, request.Remark).ExecuteAffrows(); } + + public DateTime TestExpireTime(Enums.TimeLimitTaskType timeLimitTaskType, DateTime startTime) + { + return timeLimitRules.CalculateExpirationTime(timeLimitTaskType, startTime); + } + + public (long, TimeSpan) TextLessTime(DateTime expireTime) + { + var time = timeLimitRules.CalculateLessTimeForWorkHour(expireTime); + return (time, new TimeSpan(0, 0, (int)time)); + } + } }