qinchaoyue 8 月之前
父节点
当前提交
baabe4ef2c

+ 29 - 32
src/Hotline.Api/Controllers/OrderController.cs

@@ -27,6 +27,7 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
@@ -754,43 +755,39 @@ 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>
+    [HttpPost("visit/source/export")]
+    [AllowAnonymous]
+    public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromBody] 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
+        var list = await _orderApplication.QueryOrderVisitSourceChannelAsync(dto.QueryDto);
+        if (list != null && list.Count > 0)
+        {
+            list.Add(new OrderVisitSourceChannelDto()
             {
-                Count = SqlFunc.AggregateCount(visit.OrderId),
-                SourceChannel = order.SourceChannel
-            })
-            .ToListAsync();
+                SourceChannel = "合计",
+                Count = list.Sum(p => p.Count)
+            });
+        }
 
-        return result;
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = list
+            .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

@@ -441,6 +441,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>