Kaynağa Gözat

新增 区域分时统计导出

tangjiang 10 ay önce
ebeveyn
işleme
d94ee631f7

+ 17 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -22,6 +22,7 @@ using Hotline.Tools;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using MiniExcelLibs;
 using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
@@ -2748,5 +2749,21 @@ namespace Hotline.Api.Controllers.Bi
 
             return new { Item = item, TitleData = titleData };
         }
+
+        /// <summary>
+        /// 区域分时统计-导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order_area_time_export")]
+        public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] AreaTimePagedKeywordRequest dto)
+        {
+            var dataTable = await _orderRepository.OrderAreaTimeExport(dto.StartTime, dto.EndTime,dto.AddColumnName);
+
+            var stream = new MemoryStream();
+            stream.SaveAs(dataTable);
+            stream.Seek(0, SeekOrigin.Begin);
+            return ExcelStreamResult(stream, "区域分时统计数据");
+        }
     }
 }

+ 3 - 3
src/Hotline.Api/Controllers/TestController.cs

@@ -205,7 +205,7 @@ public class TestController : BaseController
     public async Task<object> Test111(DateTime StartTime, DateTime EndTime)
     {
 
-        var list11 =await  _orderRepository.Queryable()
+        var list11 = await _orderRepository.Queryable()
                  .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
                  .Select(p => new
                  {
@@ -220,11 +220,11 @@ public class TestController : BaseController
                  {
                      AreaCode = a.AreaName,
                      Hour = p.Hour,
-                     count = SqlFunc.AggregateSum(SqlFunc.IIF(p.AreaCode!= null, 1, 0) )
+                     count = SqlFunc.AggregateSum(SqlFunc.IIF(p.AreaCode != null, 1, 0))
                  })//.ToListAsync();
                 .ToPivotTableAsync(p => p.AreaCode, p => p.Hour, p => p.Sum(x => x.count));
 
-        var list=await _orderRepository.OrderAreaTime(StartTime, EndTime);    
+        var list = await _orderRepository.OrderAreaTimeExport(StartTime, EndTime, new List<string>());
         return list;
     }
 

+ 2 - 2
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -207,8 +207,8 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                //Log.Information("Sql: {0}", sql);
-                //Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
+                Log.Information("Sql: {0}", sql);
+                Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 103 - 4
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -8,6 +8,7 @@ using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Requests;
 using SqlSugar;
+using System.Data;
 using System.Reflection;
 using XF.Domain.Dependency;
 
@@ -183,28 +184,126 @@ namespace Hotline.Repository.SqlSugar.Orders
             var listOrg = Db.Queryable<SystemArea>()
               .LeftJoin(listOrder, (s, p) => s.Id == p.AreaCode)
               .Where((s, p) => s.Id.Length == 6 && s.Id != "510000")
-              .GroupBy((s, p) => s.Id)
+              .GroupBy((s, p) => s.Id).GroupBy((s, p) => s.AreaName)
               .GroupBy((s, p) => p.Hour)
               .Select((s, p) => new
               {
                   count = SqlFunc.AggregateSum(SqlFunc.IIF(p.AreaCode != null && p.AreaCode != "", 1, 0)),
                   AreaCode = s.Id,
-                  Hour = SqlFunc.IIF(p.Hour == null || p.Hour == "", "0", p.Hour)
+                  Hour = SqlFunc.IIF(p.Hour == null || p.Hour == "", "0", p.Hour),
+                  AreaName = s.AreaName
               })
               .MergeTable();
 
-            return await listHour.LeftJoin(listOrg, (x, p) => x.ColumnName.ToString() == p.Hour)
+            var list = await listHour.LeftJoin(listOrg, (x, p) => x.ColumnName.ToString() == p.Hour)
                 .OrderBy(x => x.ColumnName)
                .Select((x, p) => new
                {
-                   Hour = x.ColumnName.ToString()+":00 - "+ x.ColumnName.ToString()+":59",
+                   Hour = x.ColumnName.ToString() + ":00 - " + x.ColumnName.ToString() + ":59",
                    p.AreaCode,
                    p.count
                })
                 .ToPivotListAsync(p => p.AreaCode, p => p.Hour, p => p.Sum(x => x.count));
+            return list;
 
         }
 
+        /// <summary>
+        /// 区域分时统计
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="RemoveColumnName"></param>
+        /// <returns></returns>
+        public async Task<DataTable> OrderAreaTimeExport(DateTime? StartTime, DateTime? EndTime, List<string> AddColumnName)
+        {
+            List<int> dts = new();
+            for (int i = 0; i < 24; i++)
+            {
+                dts.Add(i);
+            }
+
+            var listHour = Db.Reportable(dts).ToQueryable<int>();
+            var listOrder = Db.Queryable<Order>()
+                 .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
+                 .Select(p => new
+                 {
+                     AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                     Hour = p.CreationTime.Hour.ToString()
+                 })
+               .MergeTable();
+
+            var listOrg = Db.Queryable<SystemArea>()
+              .LeftJoin(listOrder, (s, p) => s.Id == p.AreaCode)
+              .Where((s, p) => s.Id.Length == 6 && s.Id != "510000")
+              .GroupBy((s, p) => s.Id).GroupBy((s, p) => s.AreaName)
+              .GroupBy((s, p) => p.Hour)
+              .Select((s, p) => new
+              {
+                  count = SqlFunc.AggregateSum(SqlFunc.IIF(p.AreaCode != null && p.AreaCode != "", 1, 0)),
+                  AreaCode = s.Id,
+                  Hour = SqlFunc.IIF(p.Hour == null || p.Hour == "", "0", p.Hour),
+                  AreaName = s.AreaName
+              })
+              .MergeTable();
+
+            var dt = await listHour.LeftJoin(listOrg, (x, p) => x.ColumnName.ToString() == p.Hour)
+               .OrderBy(x => x.ColumnName)
+              .Select((x, p) => new
+              {
+                  Hour = x.ColumnName.ToString() + ":00 - " + x.ColumnName.ToString() + ":59",
+                  p.AreaName,
+                  p.count
+              })
+               .ToPivotTableAsync(p => p.AreaName, p => p.Hour, p => p.Sum(x => x.count));
+
+            //修改列名
+            dt.Columns["Hour"].ColumnName = "时间段";
+            dt.Columns.Remove("Column1");
+
+            //增加小计
+            DataColumn totalColumn = new DataColumn("小计", typeof(decimal));
+            dt.Columns.Add(totalColumn);
+            for (int i = 0; i < dt.Rows.Count; i++)
+            {
+                int sumcount = 0;
+                for (int j = 1; j < dt.Columns.Count - 1; j++)
+                {
+                    sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
+                }
+                dt.Rows[i][dt.Columns.Count - 1] = sumcount;
+            }
+
+            //增加合计
+            DataRow totalRow = dt.NewRow();
+            totalRow["时间段"] = "合计";
+            for (int i = 1; i < dt.Columns.Count; i++)
+            {
+                int sumcount = 0;
+                for (int j = 0; j < dt.Rows.Count; j++)
+                {
+                    sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
+                }
+                totalRow[i] = sumcount;
+            }
+            dt.Rows.Add(totalRow);
+
+            //移除列
+            if (AddColumnName.Any())
+            {
+                for (int i = 0; i < dt.Columns.Count; i++)
+                {
+                    var name = dt.Columns[i].ColumnName;
+                    if (!AddColumnName.Contains(name))
+                    {
+                        dt.Columns.Remove(name);
+                        i = 0;
+                    }
+                }
+            }
+            return dt;
+        }
+
         public ISugarQueryable<SelectOrderId> OrderListUnionAll(ISugarQueryable<SelectOrderId> t1, ISugarQueryable<SelectOrderId> t2)
         {
             return Db.UnionAll(t1, t2).Select(it => new SelectOrderId { Id = it.Id }).MergeTable();

+ 5 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -270,3 +270,8 @@ public record QueryOrderSourceDetailRequest : QueryOrderSourceRequest
 	/// </summary>
 	public string? SourceChannel { get; set; }
 }
+
+public record AreaTimePagedKeywordRequest: PagedKeywordRequest
+{
+	public List<string> AddColumnName { get; set; }
+}

+ 10 - 0
src/Hotline/Orders/IOrderRepository.cs

@@ -1,5 +1,6 @@
 using Hotline.Share.Requests;
 using SqlSugar;
+using System.Data;
 using XF.Domain.Repository;
 
 namespace Hotline.Orders
@@ -32,6 +33,15 @@ namespace Hotline.Orders
         /// <returns></returns>
         Task<object> OrderAreaTime(DateTime? StartTime, DateTime? EndTime);
 
+        /// <summary>
+        /// 区域分时统计导出
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="AddColumnName"></param>
+        /// <returns></returns>
+        Task<DataTable> OrderAreaTimeExport(DateTime? StartTime, DateTime? EndTime, List<string> AddColumnName);
+
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>