Browse Source

计算剩余时间

liangku_skuoptimazation
shanji 2 years ago
parent
commit
baa2771e2e
  1. 27
      BBWYB.Server.API/Controllers/TimeLimitTaskController.cs
  2. 11
      BBWYB.Server.Business/Order/OrderBusiness.cs
  3. 97
      BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs
  4. 16
      BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs

27
BBWYB.Server.API/Controllers/TimeLimitTaskController.cs

@ -1,4 +1,5 @@
using BBWYB.Server.Business; using BBWYB.Server.Business;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Dto; using BBWYB.Server.Model.Dto;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@ -55,7 +56,7 @@ namespace BBWYB.Server.API.Controllers
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public IList<TimeLimitTaskStatisticsResponse> TimeOutStatistics([FromBody]QueryTimeOutRequest request) public IList<TimeLimitTaskStatisticsResponse> TimeOutStatistics([FromBody] QueryTimeOutRequest request)
{ {
return timeLimitTaskBusiness.TimeOutStatistics(request); return timeLimitTaskBusiness.TimeOutStatistics(request);
} }
@ -69,5 +70,29 @@ namespace BBWYB.Server.API.Controllers
{ {
timeLimitTaskBusiness.EditTimeLimitTaskRemark(request); timeLimitTaskBusiness.EditTimeLimitTaskRemark(request);
} }
/// <summary>
/// 测试计算过期时间
/// </summary>
/// <param name="timeLimitTaskType"></param>
/// <param name="startTime">起点时间</param>
[HttpGet]
[AllowAnonymous]
public DateTime TestExpireTime([FromQuery] Enums.TimeLimitTaskType timeLimitTaskType, [FromQuery] DateTime startTime)
{
return timeLimitTaskBusiness.TestExpireTime(timeLimitTaskType, startTime);
}
/// <summary>
/// 测试计算剩余时间
/// </summary>
/// <param name="expireTime"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public (long, TimeSpan) TextLessTime([FromQuery] DateTime expireTime)
{
return timeLimitTaskBusiness.TextLessTime(expireTime);
}
} }
} }

11
BBWYB.Server.Business/Order/OrderBusiness.cs

@ -25,11 +25,14 @@ namespace BBWYB.Server.Business
private Lazy<QiKuManager> qikuManagerLazy; private Lazy<QiKuManager> qikuManagerLazy;
private Lazy<OP_PlatformClientFactory> opPlatformClientFactoryLazy; private Lazy<OP_PlatformClientFactory> opPlatformClientFactoryLazy;
private Lazy<RestApiService> restApiServiceLazy; private Lazy<RestApiService> restApiServiceLazy;
private Lazy<TimeLimitRules> timeLimitRulesLazy;
private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value; private OP_PlatformClientFactory opPlatformClientFactory => opPlatformClientFactoryLazy.Value;
private RestApiService restApiService => restApiServiceLazy.Value; private RestApiService restApiService => restApiServiceLazy.Value;
private QiKuManager qikuManager => qikuManagerLazy.Value; private QiKuManager qikuManager => qikuManagerLazy.Value;
private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value;
private List<Enums.TimeLimitTaskType?> hgzTaskTypeList; private List<Enums.TimeLimitTaskType?> hgzTaskTypeList;
public OrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) 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<QiKuManager>(() => serviceProvider.GetService<QiKuManager>()); qikuManagerLazy = new Lazy<QiKuManager>(() => serviceProvider.GetService<QiKuManager>());
opPlatformClientFactoryLazy = new Lazy<OP_PlatformClientFactory>(() => serviceProvider.GetService<OP_PlatformClientFactory>()); opPlatformClientFactoryLazy = new Lazy<OP_PlatformClientFactory>(() => serviceProvider.GetService<OP_PlatformClientFactory>());
restApiServiceLazy = new Lazy<RestApiService>(() => serviceProvider.GetService<RestApiService>()); restApiServiceLazy = new Lazy<RestApiService>(() => serviceProvider.GetService<RestApiService>());
timeLimitRulesLazy = new Lazy<TimeLimitRules>(() => serviceProvider.GetService<TimeLimitRules>());
waitConfigStateList = new List<Enums.PackConfigState?>() { Enums.PackConfigState., Enums.PackConfigState. }; waitConfigStateList = new List<Enums.PackConfigState?>() { Enums.PackConfigState., Enums.PackConfigState. };
hgzTaskTypeList = new List<Enums.TimeLimitTaskType?>() hgzTaskTypeList = new List<Enums.TimeLimitTaskType?>()
@ -372,6 +375,12 @@ namespace BBWYB.Server.Business
var orderTimeLimitTaskList = fsql.Select<TimeLimitTask>().Where(t => orderIdList.Contains(t.OrderId)) var orderTimeLimitTaskList = fsql.Select<TimeLimitTask>().Where(t => orderIdList.Contains(t.OrderId))
.ToList<TimeLimitTaskResponse>(); .ToList<TimeLimitTaskResponse>();
foreach (var task in orderTimeLimitTaskList)
{
if (task.CompletionTime == null)
task.RemainingTime = timeLimitRules.CalculateLessTimeForWorkHour(task.ExpirationTime.Value);
}
foreach (var order in orderList) foreach (var order in orderList)
{ {
foreach (var orderSku in order.ItemList) foreach (var orderSku in order.ItemList)

97
BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs

@ -66,7 +66,7 @@ namespace BBWYB.Server.Business
else if (startTime.Hour >= 9 && startTime.Hour < 12) else if (startTime.Hour >= 9 && startTime.Hour < 12)
{ {
//计算从起点时间的9点开始到当前时间的时差 //计算从起点时间的9点开始到当前时间的时差
var timeSpan = DateTime.Now - startTime.Date.AddHours(9); var timeSpan = startTime - startTime.Date.AddHours(9);
if (timeSpan.TotalMinutes <= 5) if (timeSpan.TotalMinutes <= 5)
{ {
//从9点开始小于5分钟以内,以当天18点结束 //从9点开始小于5分钟以内,以当天18点结束
@ -87,7 +87,7 @@ namespace BBWYB.Server.Business
} }
else if (startTime.Hour >= 13 && startTime.Hour < 18) 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); addDay = CalculateAddDay(startTime.DayOfWeek);
addHour = 13; addHour = 13;
@ -124,17 +124,17 @@ namespace BBWYB.Server.Business
addHour = 11; addHour = 11;
else if (startTime.Hour >= 9 && startTime.Hour < 12) else if (startTime.Hour >= 9 && startTime.Hour < 12)
{ {
//计算从起点时间的9点开始到当前时间的时差 //如果在10点钟以前,则加两个小时
var timeSpan = startTime - startTime.Date.AddHours(9); if (startTime.Hour < 10)
if (timeSpan.TotalHours <= 1)
{ {
addHour = 11; addHour = 11;
addSeconds = (int)timeSpan.TotalSeconds; addSeconds = Convert.ToInt32((startTime - startTime.Date.AddHours(9)).TotalSeconds);
} }
else else
{ {
addHour = 13; 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) else if (startTime.Hour >= 12 && startTime.Hour < 13)
@ -143,18 +143,22 @@ namespace BBWYB.Server.Business
} }
else if (startTime.Hour >= 13 && startTime.Hour < 18) else if (startTime.Hour >= 13 && startTime.Hour < 18)
{ {
var timeSpan = startTime - startTime.Date.AddHours(13); if (startTime.Hour < 16)
if (timeSpan.TotalHours <= 3)
{ {
addHour = startTime.Hour + 2; addHour = startTime.Hour + 2;
addSeconds = startTime.Minute * 60 + startTime.Second; addSeconds = startTime.Minute * 60 + startTime.Second;
} }
else if (startTime.Hour == 16 && startTime.Minute <= 5)
{
//从16点开始小于5分钟以内,以当天18点结束
addHour = 18;
}
else else
{ {
addDay = CalculateAddDay(startTime.DayOfWeek); addDay = CalculateAddDay(startTime.DayOfWeek);
addHour = 9; 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) else if (startTime.Hour >= 18)
@ -166,5 +170,76 @@ namespace BBWYB.Server.Business
} }
return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds);
} }
/// <summary>
/// 计算剩余任务时间(秒)
/// </summary>
/// <param name="expirationTime"></param>
/// <returns></returns>
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;
}
} }
} }

16
BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs

@ -53,7 +53,7 @@ namespace BBWYB.Server.Business
OrderSn = o.OrderSn, OrderSn = o.OrderSn,
ShopId = o.ShopId, ShopId = o.ShopId,
TaskType = Enums.TimeLimitTaskType., TaskType = Enums.TimeLimitTaskType.,
ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType., DateTime.Now) ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType., DateTime.Now),
//ExpirationTime = DateTime.Now.AddDays(1), //ExpirationTime = DateTime.Now.AddDays(1),
Remark = "RepairOrderComputationTask" Remark = "RepairOrderComputationTask"
}).ToList(); }).ToList();
@ -92,6 +92,8 @@ namespace BBWYB.Server.Business
{ {
var shopId = task.ShopId.ToString(); var shopId = task.ShopId.ToString();
task.ShopName = shopList.FirstOrDefault(s => s.ShopId == shopId)?.ShopName; task.ShopName = shopList.FirstOrDefault(s => s.ShopId == shopId)?.ShopName;
if (task.CompletionTime == null)
task.RemainingTime = timeLimitRules.CalculateLessTimeForWorkHour(task.ExpirationTime.Value);
} }
return new TimeLimitTaskListResponse() return new TimeLimitTaskListResponse()
{ {
@ -174,5 +176,17 @@ namespace BBWYB.Server.Business
{ {
fsql.Update<TimeLimitTask>(request.TaskId).Set(t => t.Remark, request.Remark).ExecuteAffrows(); fsql.Update<TimeLimitTask>(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));
}
} }
} }

Loading…
Cancel
Save