Browse Source

新增发布量统计接口;新增发布量统计导出接口

qinchaoyue 8 months ago
parent
commit
f616d11f4c

+ 45 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -52,6 +52,7 @@ using Microsoft.Extensions.Options;
 using MiniExcelLibs;
 using MongoDB.Driver;
 using SqlSugar;
+using StackExchange.Redis;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
 using XF.Domain.Entities;
@@ -593,6 +594,50 @@ public class OrderController : BaseController
         return res;
     }
 
+    /// <summary>
+    /// 发布量统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("published/statistics")]
+    [AllowAnonymous]
+    public async Task<IList<PublishedOrderStatisticsDto>> QueryPublishedOrderAsync([FromQuery] QueryOrderVisitSourceChannelDto dto)
+        => await _orderApplication.QueryPublishedOrderAsync(dto);
+
+    /// <summary>
+    /// 发布量统计-导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("published/statistics/export")]
+    [AllowAnonymous]
+    public async Task<FileStreamResult> QueryPublishedOrderExport([FromBody] ExportExcelDto< QueryOrderVisitSourceChannelDto> dto)
+    {
+        var list = await _orderApplication.QueryPublishedOrderAsync(dto.QueryDto);
+        if (list != null && list.Count > 0)
+        {
+            list.Add(new PublishedOrderStatisticsDto()
+            {
+                Name = "合计",
+                PrivateCount = list.Sum(m => m.PrivateCount),
+                TotalCount = list.Sum(p => p.TotalCount),
+                PublicCount = list.Sum(m => m.PublicCount),
+                WaitCount = list.Sum(m => m.WaitCount)
+            });
+        }
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = list
+            .Select(stu => _mapper.Map(stu, typeof(PublishedOrderStatisticsDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+
+        return ExcelStreamResult(stream, "发布量统计");
+    }
+
     /// <summary>
     /// 已发布列表
     /// </summary>

+ 7 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -81,6 +81,13 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync(QueryOrderVisitSourceChannelDto dto);
 
+        /// <summary>
+        /// 发布量统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<IList<PublishedOrderStatisticsDto>> QueryPublishedOrderAsync(QueryOrderVisitSourceChannelDto dto);
+
         #region 工单办理
 
         ISugarQueryable<Order> QueryOrders(QueryOrderDto dto);

+ 85 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -75,9 +75,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
     private readonly IRepository<SystemDicData> _systemDicDataRepository;
+    private readonly IRepository<OrderPublish> _orderPublishRepository;
 
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -99,7 +100,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<Hotspot> hotspotRepository,
         IRepository<WorkflowStep> workflowStepRepository,
         IRepository<SystemDicData> systemDicDataRepository,
-        IRepository<WorkflowTrace> workflowTraceRepository)
+        IRepository<WorkflowTrace> workflowTraceRepository,
+        IRepository<OrderPublish> orderPublishRepository)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -123,6 +125,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _workflowStepRepository = workflowStepRepository;
         _systemDicDataRepository = systemDicDataRepository;
         _workflowTraceRepository = workflowTraceRepository;
+        _orderPublishRepository = orderPublishRepository;
     }
 
     /// <summary>
@@ -430,6 +433,85 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
     }
 
+    /// <summary>
+    /// 发布量统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    /// <exception cref="UserFriendlyException"></exception>
+    public async Task<IList<PublishedOrderStatisticsDto>> QueryPublishedOrderAsync(QueryOrderVisitSourceChannelDto dto)
+    {
+        var startDate = new DateTime();
+        var endDate = new DateTime();
+        switch (dto.DateType)
+        {
+            case EDateType.Day:
+                (startDate, endDate) = dto.StartTime.GetDayStartAndEnd();
+                break;
+            case EDateType.Week:
+                (startDate, endDate) = dto.StartTime.GetWeekStartAndEnd();
+                break;
+            case EDateType.Month:
+                (startDate, endDate) = dto.StartTime.GetMonthStartAndEnd();
+                break;
+            case EDateType.TimeLimit:
+                if (dto.EndTime is null) throw new UserFriendlyException("结束时间错误");
+                startDate = dto.StartTime;
+                endDate = dto.EndTime.Value;
+                break;
+            default:
+                break;
+        }
+
+        var publicCount = await _orderPublishRepository.Queryable()
+            .LeftJoin<Hotline.Orders.Order>((publish, order) => publish.OrderId == order.Id)
+            .Where((publish, order) => publish.CreationTime >= startDate && publish.CreationTime <= endDate && publish.PublishState == true)
+            .GroupBy((publish, order) => new { publish.CreatorId})
+            .Select((publish, order) => new QueryPublishedOrderDataDto {
+                Count = SqlFunc.AggregateCount(order.Id),
+                AcceptorId = SqlFunc.AggregateMax(order.AcceptorId),
+                AcceptorName = SqlFunc.AggregateMax(order.AcceptorName)
+            })
+            .ToListAsync();
+
+        var privateCount = await _orderPublishRepository.Queryable()
+            .LeftJoin<Hotline.Orders.Order>((publish, order) => publish.OrderId == order.Id)
+            .Where((publish, order) => publish.CreationTime >= startDate && publish.CreationTime <= endDate && publish.PublishState == false)
+            .GroupBy((publish, order) => new { publish.CreatorId })
+            .Select((publish, order) => new QueryPublishedOrderDataDto
+            {
+                Count = SqlFunc.AggregateCount(order.Id),
+                AcceptorId = SqlFunc.AggregateMax(order.AcceptorId),
+                AcceptorName = SqlFunc.AggregateMax(order.AcceptorName)
+            })
+            .ToListAsync();
+
+        var allCount = await _orderRepository.Queryable()
+            .Where(order => order.CreationTime >= startDate && order.CreationTime <= endDate)
+            .GroupBy(order => order.AcceptorName)
+            .Select(order => new QueryPublishedOrderDataDto
+            {
+                Count = SqlFunc.AggregateCount(order.Id),
+                AcceptorName = SqlFunc.AggregateMax(order.AcceptorName),
+                AcceptorId = SqlFunc.AggregateMax(order.AcceptorId),
+            })
+            .ToListAsync();
+
+        var result = new List<PublishedOrderStatisticsDto>();
+        foreach (var item in allCount)
+        {
+            var statisticsDto = new PublishedOrderStatisticsDto
+            {
+                Name = item.AcceptorName,
+                TotalCount = item.Count,
+                PrivateCount = privateCount.Where(m => m.AcceptorId == item.AcceptorId).FirstOrDefault()?.Count ?? 0,
+                PublicCount = publicCount.Where(m => m.AcceptorId == item.AcceptorId).FirstOrDefault()?.Count ?? 0,
+            };
+            statisticsDto.WaitCount = statisticsDto.TotalCount - statisticsDto.PrivateCount - statisticsDto.PublicCount;
+            result.Add(statisticsDto);
+        }
+        return result;
+    }
     /// <summary>
     /// 回访来源统计
     /// </summary>
@@ -1803,5 +1885,6 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return res;
     }
 
+
     #endregion
 }

+ 46 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -36,6 +36,52 @@ public class PublishedDto
 	public DateTime? LastModificationTime { get; set; }
 }
 
+public class PublishedOrderStatisticsDto
+{ 
+    /// <summary>
+    /// 待发布量
+    /// </summary>
+    public int WaitCount { get; set; }
+
+    /// <summary>
+    /// 公开发布量
+    /// </summary>
+    public int PublicCount { get; set; }
+
+    /// <summary>
+    /// 不公开发布量
+    /// </summary>
+    public int PrivateCount { get; set; }
+
+    /// <summary>
+    /// 总量
+    /// </summary>
+    public int TotalCount { get; set; }
+
+    /// <summary>
+    /// 名字
+    /// </summary>
+    public string Name { get; set; }
+}
+
+public class QueryPublishedOrderDataDto
+{ 
+    /// <summary>
+    /// 发布人名称
+    /// </summary>
+    public string AcceptorName { get; set; }
+
+    /// <summary>
+    /// 发布人ID
+    /// </summary>
+    public string AcceptorId { get; set; }
+
+    /// <summary>
+    /// 数量
+    /// </summary>
+    public int Count { get; set; }
+}
+
 public class PublishDto : OrderDto
 {
     /// <summary>