Преглед на файлове

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf преди 1 година
родител
ревизия
eb2a290302

+ 3 - 2
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -114,8 +114,8 @@ public class BiCallController : BaseController
         return await _userRepository.Queryable()
               .LeftJoin<TrCallRecord>((u, c) => u.Id == c.UserId)
               .Where(u => !u.IsDeleted && u.UserType == EUserType.Seat)
-              .WhereIF(dto.StartTime.HasValue, (_, c) => c.CreatedTime >= dto.StartTime.Value)
-              .WhereIF(dto.EndTime.HasValue, (_, c) => c.CreatedTime <= dto.EndTime.Value)
+              .WhereIF(dto.StartTime.HasValue, (u, c) => c.CreatedTime >= dto.StartTime.Value)
+              .WhereIF(dto.EndTime.HasValue, (u, c) => c.CreatedTime <= dto.EndTime.Value)
               .GroupBy((u, c) => new { c.UserName, c.TelNo })
               .Select((u, c) => new BiSeatCallsDto
               {
@@ -142,6 +142,7 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet("rests")]
+    [AllowAnonymous]
     public async Task<IReadOnlyList<BiSeatRestDto>> QuerySeatRest([FromQuery]QuerySeatRestRequest dto)
     {
         return await _telRestRepository.Queryable()

+ 96 - 7
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -14,6 +14,7 @@ using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos.CallCenter;
 using MapsterMapper;
 using XF.Domain.Exceptions;
+using Microsoft.AspNetCore.Authorization;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -160,12 +161,12 @@ namespace Hotline.Api.Controllers.Bi
         }
 
         /// <summary>
-        /// 热点数据统计
+        /// 热点数据小计统计
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("hotspot_data_list")]
-        public async Task<PagedDto<HotspotDataLsitVo>> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
+        [HttpGet("hotspot_subtotal_data_list")]
+        public async Task<PagedDto<HotspotDataLsitVo>> HotspotSubtotalDataLsit([FromQuery] HotspotSubtotalReportPagedRequest dto)
         {
 	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 			var query = _hotspotTypeRepository.Queryable(false, true)
@@ -186,13 +187,88 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<HotspotDataLsitVo>(total, items);
         }
 
-
         /// <summary>
-        /// 部门不满意统计
+        /// 热点数据统计
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("visit-nosatisfied")]
+        [HttpGet("hotspot_data_list")]
+        public async Task<object> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
+        {
+	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+			var items = await _hotspotTypeRepository.Queryable(false, true)
+		        .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+		        .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
+		        .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
+		        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
+		        .Where((x, o) => x.ParentId == dto.Id)
+		        .Where((x, o) => x.IsDeleted == false)
+		        .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+		        .Select((x, o) => new HotspotDataLsitVo
+		        {
+			        Id = x.Id,
+			        Name = x.HotSpotName,
+			        Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+			        Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
+				}).MergeTable().ToListAsync();
+			if (dto.Type > 0)
+	        {
+		        var chainStartTime = dto.StartTime;
+                var chainEndTime = dto.EndTime;
+                switch (dto.Type) 
+                {
+                    case 1://日
+                        chainStartTime = dto.StartTime.Value.AddDays(-1);
+                        chainEndTime = dto.EndTime.Value.AddDays(-1);
+						break;
+                    case 2://月
+	                    chainStartTime = dto.StartTime.Value.AddMonths(-1);
+	                    chainEndTime = dto.EndTime.Value.AddMonths(-1);
+						break;
+                    case 3://年
+	                    chainStartTime = dto.StartTime.Value.AddYears(-1);
+	                    chainEndTime = dto.EndTime.Value.AddYears(-1);
+						break;
+                }
+                var chainItems = await  _hotspotTypeRepository.Queryable(false, true)
+	                .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+	                .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
+	                .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
+	                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
+	                .Where((x, o) => x.ParentId == dto.Id)
+	                .Where((x, o) => x.IsDeleted == false)
+	                .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+	                .Select((x, o) => new 
+	                {
+		                Id = x.Id,
+		                ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+	                }).MergeTable().ToListAsync();
+                var res = (from t1 in items
+                           join t2 in chainItems on t1.Id equals t2.Id into t1_t2
+                           from item in t1_t2.DefaultIfEmpty()
+                           select new
+                           {
+                               Id = t1.Id,
+                               Name = t1.Name,
+                               Num = t1.Num,
+                               Sublevel = t1.Sublevel,
+                               Children = new List<HotspotDataLsitVo>(),
+							   ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
+							   ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
+                               ((double.Parse(t1.Num.ToString()) - double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString())) / double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString()) * 100).ToString("F2")+"%" : "100.00%",
+                           }).ToList();
+                return res;
+			}
+	        return items;
+        }
+
+
+		/// <summary>
+		/// 部门不满意统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("visit-nosatisfied")]
         public async Task<object> QueryVisitNoSatisfied([FromQuery] QueryVisitNoSatiisfiedRequest dto)
         {
 	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
@@ -413,5 +489,18 @@ namespace Hotline.Api.Controllers.Bi
 	        var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
 	        return new PagedDto<AcceptTypeTop10Vo>(total, items);
 		}
-	}
+
+        /// <summary>
+        /// 热点类型部门统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("hotport-org-statistics")]
+        public async Task<object> HotPortJoinOrgStatistics([FromQuery]HotPortJoinOrgStatisticsRequest dto)
+        {
+            return await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime);
+        }
+
+
+    }
 }

+ 33 - 16
src/Hotline.Api/Controllers/CommonPController.cs

@@ -68,13 +68,13 @@ namespace Hotline.Api.Controllers
         public async Task<Object> GetHomeData() 
         {
             var tadayTime = DateTime.Now.ToString("yyyy-MM-dd");
-            var orderQuery = _orderRepository.Queryable(false, false, false)
-			    .Includes(d => d.Workflow, x => x.Steps);
 			//中心
 			if (_sessionContext.OrgIsCenter)
 	        {
-                //今日来电
-                var tadayCalls = await _trCallRecordRepository.Queryable()
+		        var orderQuery = _orderRepository.Queryable(false, false, false)
+			        .Includes(o => o.Workflow, w => w.Steps);
+				//今日来电
+				var tadayCalls = await _trCallRecordRepository.Queryable()
 	                .Where(x => x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && tadayTime.Equals(x.CreatedTime.ToString("yyyy-MM-dd"))).ToListAsync();
 				var callNum = tadayCalls.Count();
                 var validCallNum = tadayCalls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
@@ -83,26 +83,43 @@ namespace Hotline.Api.Controllers
                 var answeredRate = validCallNum > 0 ? (answeredNum / validCallNum * 100) + "%" : "100%";
                 //今日受理工单
                 var tadayOrders = await orderQuery
-	                .Where(x => tadayTime.Equals(x.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
+	                .Where(o => tadayTime.Equals(o.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
 				var orderNum = tadayOrders.Count();
-				var directlyNum = tadayOrders.Where(x=> x.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
+				var directlyNum = tadayOrders.Where(o=> o.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
                 return new { CallNum = callNum, ValidCallNum = validCallNum, AnsweredNum = answeredNum, AnsweredRate = answeredRate, OrderNum = orderNum, DirectlyNum = directlyNum };
 			}
 			//部门
 			//今日待办
             var time = DateTime.Parse(tadayTime);
-			var handleStatuses =  new[] { EWorkflowStepStatus.WaitForAccept, EWorkflowStepStatus.WaitForHandle };
-            var tasksOrderQuery = orderQuery.Where(d => d.Workflow.Steps.Any(x => handleStatuses.Contains(x.Status)));
-            var tasksOkNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && d.Workflow.ExpiredTime > time).CountAsync();
-            var tasksOkOrgNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.Workflow.ExpiredTime > time).CountAsync();
-			//今日已办
-			var handleOrderQuery = orderQuery.Where(d => d.Workflow.Steps.Any(x => new[] { EWorkflowStepStatus.Handled }.Contains(x.Status)));
-			var handleNum = await handleOrderQuery.Where(d => d.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && d.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
-			var handleOrgNum = await handleOrderQuery.Where(d => d.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
+			var tasksOkNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && o.Workflow.ExpiredTime > time).CountAsync();
+            var tasksOkOrgNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.Workflow.ExpiredTime > time).CountAsync();
+            //今日已办
+			var handleNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => o.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(o.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && o.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
+            var handleOrgNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => o.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
 			//部门超期
-			var exceedTasksOkNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.ExpiredTime > DateTime.Now).CountAsync();
-			var exceedHandleNum = await handleOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.ExpiredTime > DateTime.Now).CountAsync();
+			var exceedTasksOkNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.ExpiredTime > DateTime.Now).CountAsync();
+            var exceedHandleNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.ExpiredTime > DateTime.Now).CountAsync();
             return new { TasksOkNum = tasksOkNum, TasksOkOrgNum = tasksOkOrgNum, HandleNum = handleNum, HandleOrgNum = handleOrgNum, ExceedTasksOkNum = exceedTasksOkNum, ExceedHandleNum = exceedHandleNum };
+
+            return new { };
         }
 	}
 }

+ 37 - 21
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -1,5 +1,6 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
+using Hotline.Orders;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Enums.CallCenter;
@@ -46,38 +47,53 @@ namespace Hotline.Repository.SqlSugar.CallCenter
             //        IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
             //    }).ToListAsync();
             //计算小时差
-            if (!endDate.HasValue)
-            {
-                endDate = beginDate.Date.AddDays(1).AddMilliseconds(-1);
-            }
-            TimeSpan timeDifference = endDate.Value.Subtract(beginDate).Duration();
+            //if (!endDate.HasValue)
+            //{
+            //    endDate = beginDate.Date.AddDays(1).AddMilliseconds(-1);
+            //}
+            //TimeSpan timeDifference = endDate.Value.Subtract(beginDate).Duration();
 
-            int hourDiff = (int)(timeDifference.TotalHours);
-            if (!endDate.HasValue)
-            {
-                endDate = beginDate.Date.AddDays(1).AddMilliseconds(-1);
-            }
-            //计算时间差
-            int hour = Convert.ToInt32((endDate - beginDate).Value.TotalHours);
+            //int hourDiff = (int)(timeDifference.TotalHours);
+            //if (!endDate.HasValue)
+            //{
+            //    endDate = beginDate.Date.AddDays(1).AddMilliseconds(-1);
+            //}
+            ////计算时间差
+            //int hour = Convert.ToInt32((endDate - beginDate).Value.TotalHours);
+
+            //List<DateTime> dts = new List<DateTime>() { beginDate };
+            //for (int i = 0; i < hour - 1; i++)
+            //{
+            //    dts.Add(dts.Last().AddHours(1));
+            //}
+
+            //var list = await Db.Reportable(dts).ToQueryable<DateTime>()
+            //    .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime < it.ColumnName.AddHours(1))
+            //    .GroupBy(it => it.ColumnName)
+            //    .OrderBy(it => it.ColumnName)
+            //    .Select((it, o) => new TrCallHourDto()
+            //    {
+            //        Dates = it.ColumnName,
+            //        //Hour = it.ColumnName.Hour,
+            //        Count = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0)), //呼入总量
+            //    })
+            //    .ToListAsync();
 
-            List<DateTime> dts = new List<DateTime>() { beginDate };
-            for (int i = 0; i < hour - 1; i++)
+            List<DateTime> dts = new List<DateTime>() { beginDate.Date.AddDays(1) };
+            for (int i = 0; i < 24; i++)//搞出所有时间断
             {
-                dts.Add(dts.Last().AddHours(1));
+                dts.Add(dts.Last().AddHours(-1));
             }
 
-            var list = await Db.Reportable(dts).ToQueryable<DateTime>()
+            var list = Db.Reportable(dts).ToQueryable<DateTime>()
                 .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime <= it.ColumnName.AddHours(1))
                 .GroupBy(it => it.ColumnName)
                 .OrderBy(it => it.ColumnName)
                 .Select((it, o) => new TrCallHourDto()
                 {
                     Dates = it.ColumnName,
-                    Hour = it.ColumnName.Hour,
-                    Count = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0))
-                }).ToListAsync();
-
-            //Db.Queryable<TrCallRecord>().LeftJoin<>
+                    Count = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In,1,0))
+                }).ToList();
 
 
             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报错
             {

+ 59 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -4,6 +4,8 @@ using Hotline.Orders;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Ts;
+using Hotline.Settings;
+using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
@@ -83,5 +85,61 @@ namespace Hotline.Repository.SqlSugar.Orders
         {
 			await Db.Updateable<Order>().SetColumns(x=>x.FileJson == order.FileJson).Where(x=>x.Id == order.Id).ExecuteCommandAsync(cancellationToken);
 		}
-	}
+
+
+        public async Task<object> HotPortJoinOrgStatistics(DateTime StartTime, DateTime EndTime)
+        {
+            //查询一级热点
+            var hotSpotList = await Db.Queryable<Hotspot>().Where(x => string.IsNullOrEmpty(x.ParentId)).ToListAsync();
+            List<dynamic>? listReturn = new List<dynamic>();
+            foreach (var item in hotSpotList)
+            {
+                var table = await Db.Queryable<Order>()
+                    .LeftJoin<SystemOrganize>((it,o)=> it.CurrentHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
+                    .Where((it,o)=> it.StartTime >= StartTime && it.StartTime<= EndTime)
+                    .GroupBy((it,o) => new {
+                        CurrentHandleOrgCode =(it.CurrentHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                        o.Name
+                    })
+                    .Select((it,o) => new
+                    {
+                        OrgCode = it.CurrentHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                        Count = SqlFunc.AggregateSum(SqlFunc.IIF(it.HotspotId.Substring(0,2)==item.Id,1,0)),
+                        Key = item.Id,
+                        OrgName = o.Name,
+                        HotSorpName = item.HotSpotName
+                    }).ToPivotListAsync(x=>x.Key,x=>new { x.OrgCode,x.OrgName,x.HotSorpName },x=> x.Sum(x=>x.Count));
+                listReturn.AddRange(table);
+            }
+
+            return new { HotSpot = hotSpotList, Data = listReturn };
+
+
+
+            //var list = await Db.Queryable<Order>()
+            //    .GroupBy(x => x.CurrentHandleOrgCode)
+            //    .Select(x => new
+            //    {
+            //        OrgCode = x.CurrentHandleOrgCode.Substring(0, 6),
+            //        Count = SqlFunc.AggregateCount(x.Id)
+            //    })
+            //    .ToListAsync();
+
+            //var listGroup = await Db.Reportable(listReturn).ToQueryable().GroupBy(x => x.OrgCode)
+            //    .Select(x => new
+            //    {
+            //        OrgCode = x. //x.OrgCode,
+            //        Count = SqlFunc.AggregateSum(x.Count)
+            //    }).ToListAsync();
+
+            //var listGroupHsOrg = await Db.Reportable(listGroup).ToQueryable()
+            //    .LeftJoin<SystemOrganize>((it,o)=> it.OrgCode == o.Id)
+            //    .Select((it,o) => new { 
+            //        OrgCode = it.OrgCode,
+            //        OrgName = o.Name,
+            //        Count = it.Count
+            //    })
+            //    .ToListAsync();
+        }
+    }
 }

+ 4 - 4
src/Hotline.Share/Dtos/CallCenter/BiSeatCallsDto.cs

@@ -83,22 +83,22 @@ public class BiSeatCallsDto
     /// <summary>
     /// 呼入接通率
     /// </summary>
-    public double InAnsweredRate => InTotal > 0 ? Math.Round(InAnswered / InTotal, digits: 4) : 0;
+    public double InAnsweredRate => InTotal > 0 ? Math.Round((double)InAnswered / (double)InTotal, digits: 4) : 0;
 
     /// <summary>
     /// 呼出接通率
     /// </summary>
-    public double OutAnsweredRate => OutTotal > 0 ? Math.Round(OutAnswered / OutTotal, digits: 4) : 0;
+    public double OutAnsweredRate => OutTotal > 0 ? Math.Round((double)OutAnswered / (double)OutTotal, digits: 4) : 0;
 
     /// <summary>
     /// 呼入有效接通率
     /// </summary>
-    public double AvailableAnswerRate => InTotal > 0 ? Math.Round(InAvailableAnswer / InTotal, digits: 4) : 0;
+    public double AvailableAnswerRate => InTotal > 0 ? Math.Round((double)InAvailableAnswer / (double)InTotal, digits: 4) : 0;
 
     /// <summary>
     /// 工作效率
     /// </summary>
-    public double WorkRate => LoginDuration > 0 ? Math.Round(1 - RestDuration / LoginDuration, digits: 4) : 0;
+    public double WorkRate => LoginDuration > 0 ? Math.Round(1 - (double)RestDuration / (double)LoginDuration, digits: 4) : 0;
 }
 
 

+ 2 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -56,7 +56,9 @@ namespace Hotline.Share.Dtos.Order
 		public string Id { get; set; }
 
 		public int Num { get; set; }
+		public bool Sublevel { get; set; }
 
+		List<HotspotDataLsitVo> Children { get; set; }
 	}
 
 

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

@@ -30,9 +30,28 @@ public record ReportPagedRequest : PagedKeywordRequest
 
 }
 
+public record HotspotSubtotalReportPagedRequest : ReportPagedRequest
+{
+
+	public string Id { get; set; }
+}
+
+public record HotPortJoinOrgStatisticsRequest
+{
+	public DateTime StartTime { get; set; }
+
+	public DateTime EndTime { get; set; }
+}
+
+
 public record HotspotReportPagedRequest : ReportPagedRequest { 
 
 	public string Id { get; set; }
+
+	/// <summary>
+	/// 查询类型  年 3 月 2 日 1 自定义 0
+	/// </summary>
+	public int Type { get; set; }
 }
 
 

+ 4 - 1
src/Hotline/Orders/IOrderRepository.cs

@@ -18,5 +18,8 @@ namespace Hotline.Orders
         Task RemoveOrderFinalityBatchAsync(List<string> ids, CancellationToken cancellationToken);
         Task OrderScreenRevisionVisit(string VisitId, bool canHandle, CancellationToken cancellationToken);
         Task FileAsync(Order order, CancellationToken cancellationToken);
-	}
+
+        Task<object> HotPortJoinOrgStatistics(DateTime StartTime, DateTime EndTime);
+
+    }
 }