Browse Source

新增回访来源统计导出接口

qinchaoyue 8 months ago
parent
commit
e4ed2a5f89

+ 21 - 33
src/Hotline.Api/Controllers/OrderController.cs

@@ -754,43 +754,31 @@ public class OrderController : BaseController
     [HttpGet("visit/source")]
     [AllowAnonymous]
     public async Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync([FromQuery] QueryOrderVisitSourceChannelDto dto)
+        => await _orderApplication.QueryOrderVisitSourceChannelAsync(dto);
+
+    /// <summary>
+    /// 回访来源统计--导出
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("visit/source/export")]
+    [AllowAnonymous]
+    public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromQuery] ExportExcelDto<QueryOrderVisitSourceChannelDto> dto)
     {
-        var startDate = new DateTime();
-        var endDate = new DateTime();
-        switch (dto.DateType)
-        {
-            case Share.Enums.Order.EDateType.Day:
-                (startDate, endDate) = dto.StartTime.GetDayStartAndEnd();
-                break;
-            case Share.Enums.Order.EDateType.Week:
-                (startDate, endDate) = dto.StartTime.GetWeekStartAndEnd();
-                break;
-            case Share.Enums.Order.EDateType.Month:
-                (startDate, endDate) = dto.StartTime.GetMonthStartAndEnd();
-                break;
-            case Share.Enums.Order.EDateType.TimeLimit:
-                if (dto.EndTime is null) throw new UserFriendlyException("结束时间错误");
-                startDate = dto.StartTime;
-                endDate = dto.EndTime.Value;
-                break;
-            default:
-                break;
-        }
-
-        var result = await _orderVisitRepository.Queryable()
-            .LeftJoin<Order>((visit, order) => order.Id == visit.OrderId)
-            .Where((visit, order) => visit.VisitTime >= startDate && visit.VisitTime <= endDate)
-            .GroupBy((visit, order) => new { order.SourceChannel })
-            .Select((visit, order) => new OrderVisitSourceChannelDto
-            {
-                Count = SqlFunc.AggregateCount(visit.OrderId),
-                SourceChannel = order.SourceChannel
-            })
-            .ToListAsync();
+        var result = await _orderApplication.QueryOrderVisitSourceChannelAsync(dto.QueryDto);
 
-        return result;
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = result
+            .Select(stu => _mapper.Map(stu, typeof(OrderVisitSourceChannelDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+
+        return ExcelStreamResult(stream, "回访来源统计");
     }
 
+
     /// <summary>
     /// 回访列表
     /// </summary>

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

@@ -74,6 +74,13 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         Task OrderVisitWeb(OrderVisitWebDto dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 回访来源统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync(QueryOrderVisitSourceChannelDto dto);
+
         #region 工单办理
 
         ISugarQueryable<Order> QueryOrders(QueryOrderDto dto);

+ 43 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -430,6 +430,49 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
     }
 
+    /// <summary>
+    /// 回访来源统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    /// <exception cref="NotImplementedException"></exception>
+    public async Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync(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 result = await _orderVisitRepository.Queryable()
+            .LeftJoin<Order>((visit, order) => order.Id == visit.OrderId)
+            .Where((visit, order) => visit.VisitTime >= startDate && visit.VisitTime <= endDate)
+            .GroupBy((visit, order) => new { order.SourceChannel })
+            .Select((visit, order) => new OrderVisitSourceChannelDto
+            {
+                Count = SqlFunc.AggregateCount(visit.OrderId),
+                SourceChannel = order.SourceChannel
+            })
+            .ToListAsync();
+        return result;
+    }
+
     /// <summary>
     /// 工单回访
     /// </summary>