diff --git a/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs
new file mode 100644
index 0000000..f9c0282
--- /dev/null
+++ b/BBWYB.Server.API/Controllers/TimeLimitTaskController.cs
@@ -0,0 +1,50 @@
+using BBWYB.Server.Business;
+using BBWYB.Server.Model.Dto;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace BBWYB.Server.API.Controllers
+{
+ [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
+ public class TimeLimitTaskController : BaseApiController
+ {
+ private TimeLimitTaskBusiness timeLimitTaskBusiness;
+ public TimeLimitTaskController(IHttpContextAccessor httpContextAccessor, TimeLimitTaskBusiness timeLimitTaskBusiness) : base(httpContextAccessor)
+ {
+ this.timeLimitTaskBusiness = timeLimitTaskBusiness;
+ }
+
+ ///
+ /// 检查任务过期
+ ///
+ [HttpPost]
+ [AllowAnonymous]
+ public void CheckTask()
+ {
+ timeLimitTaskBusiness.CheckTask();
+ }
+
+ ///
+ /// 查询限时任务列表
+ ///
+ ///
+ ///
+ [HttpPost]
+ public TimeLimitTaskListResponse QueryTimeLimitTask([FromBody] QueryTimeLimitTaskRequest request)
+ {
+ return timeLimitTaskBusiness.QueryTimeLimitTask(request);
+ }
+
+ ///
+ /// 限时任务统计
+ ///
+ ///
+ ///
+ [HttpPost]
+ public IList TimeOutStatistics(QueryTimeOutRequest request)
+ {
+ return timeLimitTaskBusiness.TimeOutStatistics(request);
+ }
+ }
+}
diff --git a/BBWYB.Server.API/Controllers/TimeLimitTaskSyncController.cs b/BBWYB.Server.API/Controllers/TimeLimitTaskSyncController.cs
deleted file mode 100644
index 6b736db..0000000
--- a/BBWYB.Server.API/Controllers/TimeLimitTaskSyncController.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BBWYB.Server.Business.Sync;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-
-namespace BBWYB.Server.API.Controllers
-{
- public class TimeLimitTaskSyncController : BaseApiController
- {
- private TimeLimitTaskSyncBusiness timeLimitTaskSyncBusiness;
- public TimeLimitTaskSyncController(IHttpContextAccessor httpContextAccessor, TimeLimitTaskSyncBusiness timeLimitTaskSyncBusiness) : base(httpContextAccessor)
- {
- this.timeLimitTaskSyncBusiness = timeLimitTaskSyncBusiness;
- }
-
- ///
- /// 检查任务过期
- ///
- [HttpPost]
- public void CheckTask()
- {
- timeLimitTaskSyncBusiness.CheckTask();
- }
- }
-}
diff --git a/BBWYB.Server.Business/Sync/TimeLimitTaskSyncBusiness.cs b/BBWYB.Server.Business/Sync/TimeLimitTaskSyncBusiness.cs
deleted file mode 100644
index 34fc9ce..0000000
--- a/BBWYB.Server.Business/Sync/TimeLimitTaskSyncBusiness.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using BBWYB.Common.Log;
-using BBWYB.Common.Models;
-using BBWYB.Server.Model.Db;
-using Yitter.IdGenerator;
-
-namespace BBWYB.Server.Business.Sync
-{
- public class TimeLimitTaskSyncBusiness : BaseBusiness, IDenpendency
- {
- //private TaskSchedulerManager taskSchedulerManager;
- public TimeLimitTaskSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator)
- {
- //this.taskSchedulerManager = taskSchedulerManager;
- }
-
- public void CheckTask()
- {
- fsql.Update().Set(t => t.IsTimely, false)
- .Where(t => t.CompletionTime == null)
- .Where(t => t.ExpirationTime < DateTime.Now)
- .ExecuteAffrows();
- }
- }
-}
diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs
new file mode 100644
index 0000000..436af85
--- /dev/null
+++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs
@@ -0,0 +1,98 @@
+using BBWYB.Common.Log;
+using BBWYB.Common.Models;
+using BBWYB.Server.Model.Db;
+using BBWYB.Server.Model.Dto;
+using Yitter.IdGenerator;
+
+namespace BBWYB.Server.Business
+{
+ public class TimeLimitTaskBusiness : BaseBusiness, IDenpendency
+ {
+ private VenderBusiness venderBusiness;
+ public TimeLimitTaskBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator)
+ {
+ this.venderBusiness = venderBusiness;
+ }
+ public void CheckTask()
+ {
+ fsql.Update().Set(t => t.IsTimely, false)
+ .Where(t => t.CompletionTime == null)
+ .Where(t => t.ExpirationTime < DateTime.Now)
+ .ExecuteAffrows();
+ }
+
+
+ public TimeLimitTaskListResponse QueryTimeLimitTask(QueryTimeLimitTaskRequest request)
+ {
+ if (request.StartDate > request.EndDate)
+ throw new BusinessException("开始时间不能大于结束时间");
+ if (request.PageSize > 100)
+ request.PageSize = 100;
+
+ request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1);
+ var list = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId)
+ .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate)
+ .WhereIf(request.IsCompleted, t => t.CompletionTime != null)
+ .WhereIf(!request.IsCompleted, t => t.CompletionTime == null)
+ .WhereIf(request.TimeLimitTaskType != null, t => t.TaskType == request.TimeLimitTaskType)
+ .OrderByDescending(t => t.CreateTme)
+ .Count(out var count)
+ .Page(request.PageIndex, request.PageSize)
+ .ToList();
+ return new TimeLimitTaskListResponse()
+ {
+ Count = count,
+ ItemList = list
+ };
+ }
+
+ public IList TimeOutStatistics(QueryTimeOutRequest request)
+ {
+ if (request.StartDate > request.EndDate)
+ throw new BusinessException("开始时间不能大于结束时间");
+ request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1);
+
+ var list = new List();
+
+ var shopIdList = new List();
+
+ #region 采购超时率
+ var purchaseTaskCountGroups = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId)
+ .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate)
+ .GroupBy(t => t.ShopId)
+ .ToList(g => new
+ {
+ ShopId = g.Key,
+ TaskCount = g.Count()
+ });
+
+ var purchaseTaskTimOutCountGroups = fsql.Select().WhereIf(request.ShopId != null, t => t.ShopId == request.ShopId)
+ .Where(t => t.CreateTme >= request.StartDate && t.CreateTme <= request.EndDate)
+ .Where(t => t.IsTimely == false)
+ .GroupBy(t => t.ShopId)
+ .ToList(g => new
+ {
+ ShopId = g.Key,
+ TaskCount = g.Count()
+ });
+ #endregion
+
+ shopIdList.AddRange(purchaseTaskCountGroups.Select(g => g.ShopId.Value).ToList());
+
+ foreach (var shopId in shopIdList)
+ {
+ var response = new TimeLimitTaskStatisticsResponse();
+ response.ShopId = shopId;
+
+ var purchaseTaskCount = purchaseTaskCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId)?.TaskCount ?? 0;
+ var purchaseTaskTimeOutCount = purchaseTaskTimOutCountGroups.FirstOrDefault(x => x.ShopId == response.ShopId)?.TaskCount ?? 0;
+
+ response.PurchaseTimeOutPercent = purchaseTaskCount == 0 ? 0 : Math.Round(1.0 * purchaseTaskTimeOutCount / purchaseTaskCount * 100, 2);
+
+ list.Add(response);
+ }
+
+ return list;
+ }
+ }
+}
diff --git a/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs
new file mode 100644
index 0000000..3976ade
--- /dev/null
+++ b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeLimitTaskRequest.cs
@@ -0,0 +1,31 @@
+namespace BBWYB.Server.Model.Dto
+{
+ public class QueryTimeLimitTaskRequest
+ {
+ public DateTime StartDate { get; set; }
+
+ public DateTime EndDate { get; set; }
+
+ public Enums.TimeLimitTaskType? TimeLimitTaskType { get; set; }
+
+ ///
+ /// 是否完成
+ ///
+ public bool IsCompleted { get; set; }
+
+ ///
+ /// 店铺Id (可空)
+ ///
+ public long? ShopId { get; set; }
+
+ ///
+ /// 页码,1开始
+ ///
+ public int PageIndex { get; set; }
+
+ ///
+ /// 每页记录数
+ ///
+ public int PageSize { get; set; }
+ }
+}
diff --git a/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs
new file mode 100644
index 0000000..32cf2aa
--- /dev/null
+++ b/BBWYB.Server.Model/Dto/Request/TimeLimitTask/QueryTimeOutRequest.cs
@@ -0,0 +1,14 @@
+namespace BBWYB.Server.Model.Dto
+{
+ public class QueryTimeOutRequest
+ {
+ public DateTime StartDate { get; set; }
+
+ public DateTime EndDate { get; set; }
+
+ ///
+ /// 店铺Id 可空
+ ///
+ public long? ShopId { get; set; }
+ }
+}
diff --git a/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs
new file mode 100644
index 0000000..f8be7d9
--- /dev/null
+++ b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskListResponse.cs
@@ -0,0 +1,9 @@
+namespace BBWYB.Server.Model.Dto
+{
+ public class TimeLimitTaskListResponse
+ {
+ public long Count { get; set; }
+
+ public IList ItemList { get; set; }
+ }
+}
diff --git a/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs
new file mode 100644
index 0000000..049ad8b
--- /dev/null
+++ b/BBWYB.Server.Model/Dto/Response/TimeLimitTask/TimeLimitTaskStatisticsResponse.cs
@@ -0,0 +1,22 @@
+namespace BBWYB.Server.Model.Dto
+{
+ public class TimeLimitTaskStatisticsResponse
+ {
+ public long ShopId { get; set; }
+
+ ///
+ /// 采购超时率(%)
+ ///
+ public double PurchaseTimeOutPercent { get; set; }
+
+ ///
+ /// 合格证拟定超时量
+ ///
+ public double CertificatesTimeOutCount { get; set; }
+
+ ///
+ /// 合格证补充超时量
+ ///
+ public double CertificatesSupplementTimeOutCount { get; set; }
+ }
+}