From baa2771e2e0464e3ecbbca5fd0a2103707b62f99 Mon Sep 17 00:00:00 2001
From: shanji <18996038927@163.com>
Date: Sat, 16 Dec 2023 23:39:12 +0800
Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=89=A9=E4=BD=99=E6=97=B6?=
=?UTF-8?q?=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Controllers/TimeLimitTaskController.cs | 27 +++++-
BBWYB.Server.Business/Order/OrderBusiness.cs | 11 ++-
.../TimeLimitTask/TimeLimitRules.cs | 97 ++++++++++++++++---
.../TimeLimitTask/TimeLimitTaskBusiness.cs | 16 ++-
4 files changed, 137 insertions(+), 14 deletions(-)
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));
+ }
+
}
}